VerilogHDL的结构描述模块
verilog的三种描述方式

Verilog的三种描述方式Verilog是一种硬件描述语言(HDL),用于描述数字电路和系统。
它是一种高级语言,允许工程师以更高层次的抽象来描述电路,从而简化了电路设计和验证过程。
Verilog有三种主要的描述方式,分别是结构描述、行为描述和数据流描述。
本文将详细介绍这三种描述方式,并分析它们的特点和适用场景。
1. 结构描述结构描述是Verilog的一种描述方式,它通过层次结构和模块之间的连接关系来描述电路。
在结构描述中,我们可以使用模块、端口、电路连接和实例化等概念来描述电路的组成和连接方式。
结构描述类似于画出电路图,只需要关注电路的结构和连接关系,而不需要考虑电路的具体功能。
结构描述的语法如下所示:module ModuleName (input wire A, input wire B, output wire C);// 输入端口定义// 输出端口定义// 内部信号定义// 子模块实例化// 逻辑实现endmodule结构描述的特点是清晰明了,易于理解和调试。
通过模块化的设计和层次结构,可以方便地对电路进行分析和调试。
结构描述适用于需要详细描述电路结构和连接关系的场景,比如设计一个复杂的处理器或系统。
2. 行为描述行为描述是Verilog的另一种描述方式,它通过描述电路的功能和行为来实现对电路的描述。
行为描述使用类似于编程语言的语法,可以使用条件语句、循环语句和顺序语句等来描述电路的行为。
在行为描述中,我们可以直接使用Verilog的语法来描述电路的逻辑功能,而不需要关注电路的结构和连接关系。
行为描述的语法如下所示:module ModuleName (input wire A, input wire B, output wire C);// 输入端口定义// 输出端口定义// 内部信号定义// 逻辑实现always @ (A or B) begin// 行为描述endendmodule行为描述的特点是灵活性高,可以方便地实现复杂的逻辑功能。
Verilog HDL简介.ppt

三
实例分析
3.1 8位加法器
module adder_8(cout,sum,a,b,cin); output cout; output [7:0] sum; input cin; input[7:0] a,b; assign {cout,sum}=a+b+cin; endmodule
这个例子描述了一个8位的加法器。从例子中可以看出 ,整个Verilog HDL程序是位于module和endmodule声明语 句之间的
3
4
module block1(a,b,c,d ); input a,b,c; output d; wire x; assign d = a | x; assign x = ( b & c ); endmodule
2.2 Verilog HDL模块的模板
module <顶层模块名> (< 输入输出端口列表>) ; output 输出端口列表; input 输入端口列表; //定义数据,信号类型等 wire 信号名;reg 信号名; //使用assign语句定义逻辑功能 assign <结果信号名> = 表达式 ; //使用always块定义逻辑功能 always @(<敏感信号表达式>) begin //过程赋值语句 //if语句 // case语句 // while,repeat,for循环语句 // task,function调用 end
• 多路器设计方案之三: module mux3( out, a, b, sel); output out; input a, b, sel; reg out; always @( a or b or sel ) begin if( sel ) out = a; else out = b; end endmodule
Verilog HDL

Verilog HDL基本程序结构用Verilog HDL描述的电路设计就是该电路的Verilog HDL模型,也称为模块,是Verilog 的基本描述单位。
模块描述某个设计的功能或结构以及与其他模块通信的外部接口,一般来说一个文件就是一个模块,但并不绝对如此。
模块是并行运行的,通常需要一个高层模块通过调用其他模块的实例来定义一个封闭的系统,包括测试数据和硬件描述。
一个模块的基本架构如下:module module_name (port_list)//声明各种变量、信号reg //寄存器wire//线网parameter//参数input//输入信号output/输出信号inout//输入输出信号function//函数task//任务……//程序代码initial assignmentalways assignmentmodule assignmentgate assignmentUDP assignmentcontinous assignmentendmodule说明部分用于定义不同的项,例如模块描述中使用的寄存器和参数。
语句用于定义设计的功能和结构。
说明部分可以分散于模块的任何地方,但是变量、寄存器、线网和参数等的说明必须在使用前出现。
一般的模块结构如下:module <模块名> (<端口列表>)<定义><模块条目>endmodule其中,<定义>用来指定数据对象为寄存器型、存储器型、线型以及过程块。
<模块条目>可以是initial结构、always结构、连续赋值或模块实例。
下面给出一个简单的Verilog模块,实现了一个二选一选择器。
例2-1 二选一选择器(见图2-1)的Verilog实现图2-1 例2-1所示的二选一电路module muxtwo(out, a, b, s1);input a, b, s1;output out;reg out;always @ (s1 or a or b)if (!s1) out = a;else out = b;endmodule模块的名字是muxtwo,模块有4个端口:三个输入端口a、b和s1,一个输出端口out。
第三章 Verilog HDL的基本语法汇总

512个单元,每个单元为32位
3.3 Verilog HDL的运算符
算术运算符 逻辑运算符 关系运算符 等值运算符 位运算符 缩减运算符 移位运算符 条件运算符 拼接运算符
1.算术运算符
算术运算符包括: + (加法运算符或正值运算符,如x+y,+8) - (减法运算符或负值运算符,如x-y,-90) * (乘法运算符,如x*y) / (除法运算符,如x/y) % (取模运算符,如x % y)
1.间隔符: Verilog 的间隔符主要起分隔文本的作用,可以使 文本错落有致,便于阅读与修改。
间隔符包括空格符(\b)、TAB 键(\t)、换行符(\n)及 换页符。
2.注释符:注释只是为了改善程序的可读性,在编译时不起作用。 多行注释符(用于写多行注释): /* --- */; 单行注释符 :以//开始到行尾结束为注释文字。
3.标识符和关键词
标识符:给对象(如模块名、电路的输入与输出端口、变
量等)取名所用的字符串。以英文字母或下划线开始
如,clk、counter8、_net、bus_A 。
关键词:是Verilog语言本身规定的特殊字符串,用来定义 语言的结构。例如,module、endmodule、input、 output、wire、reg、and等都是关键词。关键词都是小 写,关键词不能作为标识符使用 。出始终根据输入的变化而 更新其值的变量,它一般指的是硬件电路中的各种物理 连接.
例:网络型变量L的值由与门的驱动信号 a和b所决定,即L=a&b。a、b的值发 生变化,线网L的值会立即跟着变化。
a
&L
Verilog HDL程序结构

Verilog HDL 语言规范LOGOVerilog HDL 程序结构描述复杂的硬件电路,设计人员总是将复杂的功能划分为简单的功能,模块是提供每个简单功能的基本结构。
1. 设计人员可以采取“自顶向下”的思路,将复杂的功能模块划分为低层次的模块。
2. 自顶向下的设计方式有利于系统级别层次划分和管理,并提高了效率、降低了成本。
Verilog HDL 程序结构使用Verilog 描述硬件的基本设计单元是模块(module )。
☐复杂电子电路的构建,主要是通过模块的相互连接调用来实现的。
☐在Verilog 中,将模块包含在关键字module 、endmodule 之内。
☐Verilog 中的模块类似C 语言中的函数,它能够提供输入、输出端口,通过例化调用其他模块。
☐该模块可以被其它模块例化调用,模块中可以包括组合逻辑部分和时序逻辑部分。
Verilog HDL 程序结构一个模块通过它的端口(输入/输出端口)为更高层的设计模块提供必要的连通性,但是又隐藏了其内部的具体实现。
这样,在修改其模块的内部结构时不会对整个设计的其余部分造成影响。
Module 模块名(端口列表)endmoduleVerilog HDL 程序结构端口定义input 输入端口output 输出端口inout 输入/输出端口数据类型说明wireregparameter逻辑功能定义assignalwaysfunctiontask……Verilog HDL 程序结构Verilog 结构位于在module 和endmodule 声明语句之间,每个Verilog 程序包括端口定义、数据类型说明和逻辑功能定义部分。
☐模块名是模块唯一的标识符。
☐端口列表是由模块各个输入、输出和双向端口组成的一个端口列表。
Verilog HDL 程序结构☐数据类型说明用来说明模块内用到的数据对象是网络类型还是变量类型。
☐逻辑功能定义通过使用逻辑功能语句实现具体的逻辑功能。
Verilog语言基础知识

在Verilog HDL中,用parameter来定义常量,即用parameter来定义一个标志符,代表一个常量,称为符号常量。其定义格式如下:
parameter 参数名1=表达式,参数名2=表达式,参数名3=表达式……;
例如:
parameter sel=8,code=8'ha3;
//分别定义参数sel为常数8(十进制),参数code为常数a3(十六进制)
Verilog HDL中共有19种数据类型。数据类型是用来表示数字电路中的数据存储和传送单元的。在此介绍4个最基本的数据类型:integer型、parameter型、reg型和wire型。
Verilog HDL中也有常量和变量之分,他们分属以上这些类型。
6.2.1 常量
在程序运行过程中,其值不能被改变的量称为常量。
assign {cout,sum}=ina+inb+cin;//全加
endmodule
【例6.2】一个8位计数器的Verilog HDL源代码
module counter8(out,cout,data,load,cin,clk);
output[7:0]out;
output cout;
input[7:0] data;
6.1.2 Verilog HDL模块的结构
Verilog HDL的基本设计单元是"模块(block)"。一个模块是由两部分组成的,一部分描述接口;另一部分描述逻辑功能,即定义输入是如何影响输出的。下面举例说明,图6.1示出了一个"与-或-非"门电路。
图6.1"与-或-非"电路
该电路表示的逻辑函数可以写为:
6.2.2 变量
VerilogHDL语言(PDF)

Verilog 讲义(二)1)续Verilog 基础2)Verilog 形为描述3.4 运算符九类运算符分类包含运算符算术运算符+ - * / %位运算符~ & | ^ ^~or~^缩位运算符& ~& | ~| ^ ^~or~^逻辑运算符! && ||关系运算符> < <= >=相等与全等运算符== != === !==逻辑移位运算符 <<>> 连接运算符 {}: 条件运算符 ?根据操作数的不同,又可分为三类:1)单目运算符只有一个操作数,且运算符位于操作数的左边如:~clk &a ~& 缩位运算符wire [7:0] aparity=^a (奇校验)2)双目运算符a+b a%b {a,b,c}3)三目运算符out=(sel)?a:b;运算符的优先级参:P443.4.1 算术运算符1)减法亦可用作单目运算符,取补运算2)除法运算符:整型类数据小数部分被截去: integer a=7/2=33)% 取余运算 7%2=13.4.2 位运算符1)~a 按位取反2)a&b 按位相与若a,b 位数不同,短的高位补0,(x者补x)3)^ ^~ 双目3.4.3 缩位运算符单目运算符,按位进行逻辑运算,结果产生一位的逻辑值。
A=4’b1001&a ~&a |a ~|a ^a ~^a0 1 1 0 1 0 3.4.3 逻辑运算符a&&b结果为一位的逻辑值若操作数为多位,只要有一位为1,整个操作数看作逻辑1;若有不定态,结果亦为不定态。
3.4.5关系运算符结果为一位的逻辑值。
3.4.6 相等与全等运算符结果为一位逻辑值相等:比较每一位,所有相等,关系满足,若有不定态或高阻态,不定态结果。
全等:与相等比较过程相同,亦将不定态及高阻态作为逻辑状态比较。
3.4.7 逻辑移位运算符<< >> 以0补位。
HDL 第6次课

测试与仿真
测试仿真 施加 激励 待验证 设计模块 响应 输出 观察输出 对比结果
观察对比波形(波形仿真) 测试激励 待测设计 生成文本(命令式仿真)
对已设计模块的测试与仿真通常可分为以下三个步骤: 对被测设计的顶层接口进行例化。 给被测设计的输入接口添加激励。 判断被测设计的输出响应是否满足设计要求
//二输入与门 module and_2(A,B,F); input A,B; output F; and U1(F,A,B); endmodule
//半加器 开关级描述(调用开关级元件) module halfadder(A,B,F,CO); input A,B; UDP级描述(用户自定义元件) output F,CO; xor U1(F,A,B); and U2(CO,A,B); 元件名 (<时延>)<实例名>(<端口列表>) endmodule 类型 基本门 多输入门 元件
end
添加复位信号
//复位信号产生 //复位低有效,已定义“’timescale 1ns/1ps” initial begin rst_n=0; #100; //100ns延时
rst_n=1; //撤销复位
end
课后作业:
1、利用不同描述方式设计加法器、乘法器
2、练习编写加法器、乘法器测试模块
行为描述方式侧重反映电路输入、输出信号间的关系, 一般采用 initial 语句或 always 语句描述逻辑功能。
//二输入与门 module and_2(A,B,F); input A,B; output F; reg F; initial F=0; always@(A or B) assign=A&B; endmodule //半加器 module halfadder(A,B,F,CO); input A,B; output F,CO; reg F,CO; always@(A or B) begin case({A,B}) 2’b00:begin F=0;CO=0;end 2’b01:begin F=1;CO=0;end 2’b10:begin F=1;CO=0;end 2’b11:begin F=1;CO=1;end end endmodule
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
所有assign语句并 发执行,和程序中 的位置无关。
第五节 Verilog HDL的行为描述模块
一.行为描述 逻辑电路的结构描述侧重于表示一个电路由哪些基本元 件组成,以及这些基本元件的相互连接关系。 逻辑电路的数据流描述侧重于逻辑表达式以及Verilog HDL中运算符的灵活运用。 行为描述关注逻辑电路输入、输出的因果关系(行为特 性),即在何种输入条件下,产生何种输出(操作),并不 关心电路的内部结构。EDA的综合工具能自动将行为描述转 换成电路结构,形成网表文件。 显然,当电路的规模较大或时序关系较复杂时,通常采 用行为描述方式进行设计。
四.Verilog HDL 内置基本门元件的调用 门级元件实例语句的格式: <门级元件名> <实例名> (端口连接表) ;
应按照各元件模型中输出、输入、控 制的顺序描述信号的连接。
当对同一个基本门级元件进行多次调用时,可采用 下面的元件实例语句格式: <门级元件名> <实例名1> (端口连接表1) , <实例名2> (端口连接表2) , …… <实例名n> (端口连接表n) ;
四.数据流描述举例 例:请用Verilog HDL数据流描述方式描述 F = AB + CD 的逻辑功能。
module ff_1(A,B,C,D,F); input A,B,C,D; output F; wire w1,w2; assign w1=A&B; assign w2=~(C&D); assign F=w1|w2; endmodule
二.Verilog HDL数据流描述模块的设计模型
module 模块名 (端口列表);
Verilog 数据流 描述模 块基本 结构
端口定义 input 输入端口 output 输出端口 数据类型说明 wire 逻辑功能定义 assign <逻辑表达式1>; …… assign <逻辑表达式n>;
endmodule
敏感信号表达式 又称敏感事件列表。当该表达式中任意一个信号(变量) 的值改变时,就会引发块内语句的执行。因此,应将所有影响 块内取值的信号(变量)列入。多个敏感信号用“or”连接。 例如: @ ( a ) //当信号a的值发生改变时
@ (a or b) //当信号a或信号b的值发生改变时 这里a和b称为电平敏感型信号,代表的触发事件是,信 号除了保持稳定状态以外的任意一种变化过程。 这种电平敏感型信号列表常用在组合逻辑的描述中,以 体现输入随时影响输出的组合逻辑特性。
x[0] x[1] x[2] x[3] y[0] y[1] y[2] y[3] 思考:若上述模块中的 assign z = x & y ; 改为 assign z = x && y ; 将如何? & z[3] & & z[1] z[2] & z[0]
实际应用中,持续赋值语句的赋值目标可以是如下几种: ●变量(标量) wire a , b ; assign a = b ; ●向量 wire [7:0] a , b ; assign a = b ;
六. Verilog HDL门级建模举例 例:对下列逻辑电路进行Verilog HDL门级建模。 a
& A1
w1 ≥1 O1 w3
b
& A2 & A3 =1 X1
w2
cout
cin
sout
六. Verilog HDL门级建模举例 例:对下列逻辑电路进行Verilog HDL门级建模。 a b cin
三.持续赋值语句(assign语句) assign 连线型变量名 = 赋值表达式 ; 用Verilog HDL运算 符构成的合法表达式
关键字
wire型变量
wire型变量没有数据保持能力,只有被连续驱动后,才 能取得确定值。(而寄存器型变量只要在某时刻得到过一次 过程赋值,就能一直保持该值,直到下一次过程赋值。) 若一个连线型变量没有得到任何连续驱动,它的取值将 是不定态“x”。 assign连续赋值语句就是实现对连线型变量进行连续驱 动的一种方法。
进一步讲, assign持续赋值语句对wire型变量赋值 后,始终监视赋值表达式中的每一个操作数,只要赋值表 达式中任一操作数发生变化,立即对wire型变量进行更新 操作,以保持对wire型变量的连续驱动。体现了组合逻辑 电路的特征——任何输入的变化,立即影响输出。所以, 可根据组合电路的逻辑表达式,用assign持续赋值语句进 行描述。 //持续赋值语句应用举例 module assignment ( z , x , y ) ; 根据端口信号类型的隐 含特性,此句可省。 input [3:0] x , y ; output [3:0] z ; wire [3:0] z , x , y ; 这里,已不是传统意义上的 assign z = x & y ; 单变量与运算,而是两个相 endmodule 同位宽向量的按位与运算。 对应的逻辑原理图?
定义三个内 部连线变量
endmodule
门级建模描述的是电路结构,看起来 比较复杂。如果阅读一个门级建模程序, 很难分析其所描述的功能。
第四节 Verilog HDL的数据流描述模块
一.数据流描述 根据信号(变量)之间的逻辑关系,采用持续赋值 语句描述逻辑电路的方式,称为数据流描述。
狭义理解:将传统意义上的“逻辑表达式”,运用 Verilog HDL中的运算符,改变成持续赋值语句 (assign语句)中的表达式。
二. Verilog HDL行为描述模块的设计模型 module 模块名 (端口列表); Verilog 行为描述 模块基本 结构
端口定义 input 输入端口 output 输出端口 数据类型说明 reg parameter 逻辑功能定义 always @(敏感事件列表) begin 阻塞、非阻塞、if-else、case、for等行为语句 end
buf BUF_1 (bout1, bout2, bout3, bin) ; bout1 bin BUF_1 bout2 bout3
门级元件实例语句及其对应的 逻辑示意图 bufif1 BF1 (d_bus, m_data, en) ; bufif0 BF0 (a, b, c) ;
m_data en
对于高电平使能缓冲器 “bufif1”,若控制输入为“1”, 则输入数据被传送到数据输出端;若控制输入为“0”,则数 据输出端处于高状态“z”。 对于低电平使能缓冲器 “bufif0”,若控制输入为“0”, 则输入数据被传送到数据输出端;若控制输入为“1”,则数 据输出端处于高阻状态“z”。 对于高电平使能非门 “notif1”,若控制输入为“1”,则 数据输出端的逻辑状态是输入的“逻辑非”;若控制输入为 “0”,则数据输出端处于高阻状态“z”。 对于低电平使能非门 “notif0”,若控制输入为“0”,则 数据输出端的逻辑状态是输入的“逻辑非”;若控制输入为 “1”,则数据输出端处于高阻状态“z”。
狭义理解:如何将传统意义上的“逻辑原理图”转换为 Verilog HDL的描述。 结构描述分为门级结构描述和模块级结构描述,本 课程只介绍前者。 二.门级结构描述(门级建模) 门级结构描述就是利用Verilog HDL内置的基本门级 元件以及它们之间的连接来构筑逻辑电路的模型。 “基本门级元件”是一种特殊的模块,由Verilog HDL 语言本身提供,不需要用户定义。同学应掌握“基本门级 元件”的分类、调用格式及其应用。
再例如: @ ( posedge clock ) @ ( negedge clock ) //当clock的上升沿到来时 //当clock的下降沿到来时
@ ( posedge clock or negedge reset ) //当clock的上升沿到来或当reset的下降沿到来时 这里的clock和reset信号称为边沿敏感型信号,posedge 描述对信号的上升沿敏感;negedge描述对信号的下降沿敏感。 显然,这种边沿敏感型信号列表适合描述同步时序电路,以体 现同步时序电路的特点——在统一时钟作用下改变电路的状态。
三.Verilog HDL 内置基本门元件 多输入门 与门: 与非门: 或门: 或非门: 异或门: 异或非门: 关键字 and nand or nor xor xnor
只有一 个输出
多个 输入
元件模型: <门级元件名> (<输出>, <输入1>, <输入2> , …… , <输入n>)
多输出门 关键字 缓冲器: 多个输 出 非门: buf not 只有一 个输入
门级元件实例语句及其对应的 逻辑示意图
in1 in2
& A1
out1
and A1 (out1, in1, in2) ; or F2 (a, b, c, d) ; xor X1 (x_out, p1, p2) ;
b c d
≥1 F2
a
p1 p2
=1 X1
x_out
out1 in 门级元件实例语句及其对应的 逻辑示意图 not NOT_1 (out1, out2, in) ; out2 NOT_1
module 模块名 (端口列表); 端口定义 input 输入端口 output 输出端口 数据类型说明 wire 门级建模描述 and u1 (输出,输入1,…输入n) not u2 (输出1,…输出n,输入) bufif1 u3 (输出,输入,控制) …
多输入门
多输出门
三态门
endmodule
元件模型: <门级元件名> (<输出1>, <输出2>, …… , <输出n>, <输入> )
三态门 关键字 高电平使能缓冲器: 低电平使能缓冲器: 高电平使能非门: 低电平使能非门: 元件模型 <元件名> (<数据输出> ,<数据输入>,<控制输入>) 实现三态输出 bufif1 bufif0 notif1 notif0