页数:71页文件大小:307.2 KB来源: 硬件描述语言和数字系统设计ppt课件
本课件讲解Verilog HDL的基本模块结构,包括端口信息、输入输出说明与功能定义,并说明空白符与注释、四值逻辑系统、常量、标识符与系统任务等词汇约定,以及常用数据类型与运算符的用法。
硬件描述语言和数字系统设计
Verilog HDL基本模块说明3.2 Verilog HDL中的词汇约定3.3 Verilog HDL数据类型3.4 Verilog HDL运算符主要内容:
Verilog HDL基本模块说明
(module)结构基本要素知识点:3.1.1端口信息3.1.2输入/输出说明3.1.3逻辑功能描述
1,端口在模块名字后的括号中列出3,端口可以说明为input,output及inout2,端口等价于硬件的引脚(pin)
Verilog模块的结构由在module和endmodule关键词之间的四个主要部分组成:-1.端口信息:modulecombination(a, b, c, d ); -2.输入/输出说明:input a, b, c; output d; -//输入/输出端口信号类型声明,缺省为wire型:-3.内部信号:wire x; -4.功能定义:assign d = a | x; assign x = ( b & ~c ); endmodule3.1.2端口说明;modulemux2to1 (out, a, b, sel); input a, b, sel; output out; wire out; assign out=(sel)?b:a; endmodule两路选择器的RTL级描述1:;两路选择器的RTL级描述2:modulemux2to1 (out, a, b, sel); input a, b, sel; output out; reg out; always @( sel or a or b)if (! sel) out = a; else out = b; endmodule;(out, a, b, sl);input a, b, sl;output out;notu1 (nsl, sl );andu2 (sela, a, nsl);andu3 (selb, b, sl);oru4 (out, sela, selb);endmodule两路选择器的门级描述-实例化:
moduleblock1(a, b,c,d,e); inputa,b,c; outputd,e; assign d = a | ( b & ~c); assign e = ( b & ~c ); endmodule练习答案:编写Verilog HDL模块abcde;Verilog HDL中的词汇约定知识点:
module MUX2_1 (out, a, b, sel);input sel;wire sel_, a1, b1; notnot1 (sel_, sel); andand1 (a1, a, sel_);andand2 (b1, b, sel); oror1 (out, a1, b1); endmodule格式自由使用空白符提高可读性及代码组织。Verilog忽略空白符除非用于分开其它的语言标记。多行注释,在内单行注释到行末结束;’0’, Low, False, Logic Low, Ground,VSS,Negative Assertion‘1’, High, True, Logic High, Power,VDD, VCC, Positive Assertion’X’ Unknown: Occurs at Logical Which Cannotbe Resolved Conflict‘Z’, High Impedance, Tri-Stated,Disabled Driver (Unknown)
Verilog中,常量(literals)可是整数也可以是实数。1.整数的大小可以定义也可以不定义。整数表示为:<size>'<base><value>其中size:位数大小,由十进制数表示的位数(bit)表示。缺省为32位base:数基,可为2(b)、8(o)、10(d)、16(h)进制。缺省为10进制value:是所选数基内任意有效数字,包括X、Z。2.实数常量可以用十进制或科学表示法表示。
unsized decimal (zero-extended to 32 bits)‘h83aunsized hexadecimal (zero-extended to 32 bits)8'b1100 00018-bit binary16'hff0116-bit hexadecimal32'bz01xZ-extended to 32 bits3'b1010 11013-bit number, truncated to3’b1016.3 decimal notation32e-4 scientific notation for 0.00324.1E3 scientific notation for 4100整数与实数常量例子
整数和实数常量小结
(string)(了解)
htimestringACSIIbindecocthex转义符\<1-3 digit octal number>\”\\\n\tASCII representation of above双引号反斜杠换行tab格式符%0d表示没有前导0的十进制数
(identifiers) (重点)
编译指导(了解)
`include (了解)
`define (了解)编译指导`define提供了一种简单的文本替换的功能`define<macro_name> <macro_text>在编译时<macro_text>替换<macro_name>。可提高描述的可读性。`definenot_delay#1`define and_delay #2`define or_delay #1module MUX2_1 (out, a, b, sel);output out;input a, b, sel;wire sel_, a1, b1;not `not_delaynot1( sel_, sel);and ` and_delay and1( a1, a, sel_);and ` and_delay and2( b1, b, sel);or ` or_delay or1( out, a1, b1);endmodule定义not_delay使用not_delay
文本替换(了解)
Verilog HDL数据类型Verilog HDL有两大类数据类型。1.线网类型(net type):表示Verilog结构化元件间的物理连线。它的值由驱动元件的值决定,例如连续赋值或门的输出。如果没有驱动元件连接到线网,线网的缺省值为z。2.寄存器类型(register type):表示一个抽象的数据存储单元,它只能在always语句和initial语句等过程语句中被赋值,并且它的值从一个赋值到另一个赋值被保存下来。寄存器类型的变量具有x的缺省值。
net(线网)型net需要被持续的驱动,驱动它的可以是门和模块。当net驱动器的值发生变化时,新值被传送到net上。在下例中,线网out由or门驱动。当or门的输入信号置位时将传输到线网net上。
net类的类型(线网)
wireWor wand trisupply0 supply1最常用的是wire!!
为:net_kind[msb:lsb]net1,. . ,netN;解释:1. net_kind是上述线网类型的一种;2. msb和lsb是用于定义线网范围的常量表达式,如果没有定义,缺省为1位。例1:wirerst, data;
线网型变量使用举例module mux2to1 (out, a, b, sel); input a, b, sel; output out; wire out; assign out=(sel)?b:a; 第36页:寄存器类型
寄存器的类型
- 寄存器类有四种数据类型寄存器类型功能reg是最常用的寄存器类型,无符号型。integer32位有符号整数变量,算术操作产生二进制补码形式。的结果。通常用作不会由硬件实现的的数据处理。real双精度的带符号浮点变量,用法与integer相同。time 64位无符号整数变量,用于仿真时间的保存与处理。realtime与real内容一致,但可以用作实数仿真时间的保存与处理。
第37页:寄存器类型reg-使用语法reg是寄存器
数据类型最常见的数据类型。使用语法形式如下:reg [msb: lsb] reg1,. . . ,regN;msb和lsb定义了范围,并且均为常数值表达式;如果没有定义范围,缺省值为1位寄存器。例1:reg [3:0] counter1;//4位寄存器。例2:reg counter2;// 1位寄存器。例3:reg [31:0] data_buffer1 ;reg [32:1] data_buffer2 ;
第38页:常见的寄存器类型
Integerinteger A, B, C ;
第39页:sel 时序逻辑示例
寄存器型变量使用举例module mux2to1 (out, a, b, sel); input a, b, sel; output out; reg out; always @( sel or a or b)if (! sel) out = a; else out = b; 第40页:module top 代码示例
如何给模块端口信号选择正确的数据类型?moduletop(A,B,Y ); input A,B; output Y; reg A1,B1;//reg?//对于信号Y,A,B呢?DUT u1 (Y1, A1, B1); DUT u2 (Y, A, B); endmodulemoduleDUT (O, in1, in2); output O; input in1, in2; wire in1, in2; reg O;always @(in1 or in2)O=in1+in2; endmodule输入端口(如右图in1、in2信号)只能是net;但输入端口可以由net/register驱动输出端口(如O )可以是net/register类型,但输出端口只能驱动net若in1、in2说明为reg则会产生错误。in1in2OABY或者:wire O;assign O=in1+in2;
第41页:module example 代码示例
练习-选择数据类型时常犯的错误修改前:module example(o1, o2, a, b,c,d); input a, b,c,d; output o1, o2; reg c, d; reg o2; andu1(o2, c, d); always @(a or b)if (a) o1 = b; else o1 = 0; endmodule修改后:module example(o1, o2, a, b, c, d); input a, b, c, d; output o1, o2;// reg o2reg o1; andu1(o2, c, d); always @(a or b)if (a) o1 = b; else o1 = 0; endmoduleexample.v或者换成:always @(c or d)o2=c&d; 或者换成:assigno2=c&d;
第42页:参数
参数是一个常量。
- 参数定义的语法:parameter <list_of_assignment>
- 如:parameter WIDTH= 8'h20
- parameter BYTE=4'h8
第43页:参数(parameters)-使用举例
modulemod1( out, in1, in2);. . .. . .parameterWORD_WIDTH= 8;. . .. . .wire [WORD_WIDTH-1: 0] in1;// A wire declaration using parameter. . .. . .endmodule
- 例:
第44页:参数(parameters)使用注意事项
参数(parameters)使用注意事项
- 1.推荐:一般定义参数等常量名称用大写,变量名称用小写!
- 2.可一次定义多个参数,用逗号隔开。如:parameterWORD_WIDTH= 32,ADDR_WIDTH= 8;等同于:parameterWORD_WIDTH= 32;parameterADDR_WIDTH= 8;
第45页:parameters)使用注意事项
(parameters)使用注意事项(cont.)
- 3.参数的定义是局部的,只在当前模块中有效。如:在工程Multi-CPU中一个文件a.v中定义parameterWORD_WIDTH=32
- 在同一工程另一个文件b.v中定义parameterWORD_WIDTH = 8
- 是可以的。//但是如果这样,项目比较复杂时,容易混淆WORD_WIDTH的值,不建议这样使用,可以声明成两个不同名称的参数来处理这种情况。
第46页:参数(parameters)使(续1)
参数(parameters)使用注意事项(cont.)
- !!!!注意与`define的异同如在文件sram_control.v中,定义有:`define ADDR_WIDTH 12`defineDATA_WIDTH 32moduleexample2( clk,rst,addr_in,data_in,data_out)
- input [`DATA_WIDTH-1: 0] data_in
- input [`ADDR_WIDTH-1: 0] addr_in
- output [`DATA_WIDTH-1: 0] data_out
- wire [`DATA_WIDTH-1: 0] data_in
- wire [`ADDR_WIDTH-1: 0] addr_in
- reg [`DATA_WIDTH-1: 0] data_out
- parameterMEMORY_DEPTH = 1024
- . . .endmodule
第47页:或在文件cpu_param.v中定义
- `define ADDR_WIDTH 12`defineDATA_WIDTH 32然后在文件sram_control.v中如下使用:`include cpu_param.vmoduleexample2( clk,rst,addr_in,data_in,data_out)
- input [`DATA_WIDTH-1: 0] data_in
- input [`ADDR_WIDTH-1: 0] addr_in
- output [`DATA_WIDTH-1: 0] data_out
- wire [`DATA_WIDTH-1: 0] data_in
- wire [`ADDR_WIDTH-1: 0] addr_in
- reg [`DATA_WIDTH-1: 0] data_out
- parameterMEMORY_DEPTH = 1024
- . . .endmodule
第48页:位选择
位选择从向量中抽取特定的位。reg [31:0] Breg;wire [31:0] Bwire;. . .Breg=~Bwire;或者. . .Breg[31:16]= ~Bwire[15:0];Breg[15:0]= ~Bwire[31:16];
第49页:整数不能作为位向量访问
。例如定义了:integer B;对于上面的整数B的说明,B[6]和B[20:10]是非法的。解决办法:一种截取位值的方法是将整数赋值给一般的reg类型变量,然后从中选取相应的位,如:integer Bint;reg [31:0] Breg;/ /由于Bint[6]和Bint[20:10]是不允许的。Breg = Bint;
第50页:总结
Verilog模块中常见信号类型-总结
- 两种主要的信号类型:-寄存器类型:代表reg在always等过程块中被赋值的信号,往往代表触发器,但不一定是触发器。(时序逻辑电路中常常被综合为D触发器
- 纯组合逻辑电路中被综合为连线)-连线类型:代表wire用assign关键词指定连续/持续赋值所描述的组合逻辑的信号或连线。
第51页:module rw1 代码示例
Verilog中reg与wire的不同点
- 用寄存器(reg)类型变量生成组合逻辑举例:modulerw1( a, b, out1, out2 )
- input a, b
- output out1, out2
- reg out1
- wire out2
- assign out2 = a
- always @(b) out1 = ~b
- endmoduleaout2BUFFbINVout1
第52页:module rw2 代码示例
Verilog中reg与wire的不同点
- 用寄存器(reg)类型变量生成触发器的例子:module rw2( clk, d, out1, out2 )
- input clk, d
- output out1, out2
- reg out1
- wire out2
- assign out2 =d & ~out1
- always @(posedge clk)out1 <= d
- endmoduledout2AND2i1clkDQout1
第53页:Verilog HDL运算符
Verilog HDL运算符
- 知识点:
- 3.4.1算术操作符
- 3.4.2逻辑运算符
- 3.4.3按位操作符
- 3.4.4关系运算符
- 3.4.5相等操作符
- 3.4.6条件操作符
- 3.4.7移位操作符
- 3.4.8连接操作
- 3.4.9复制操作
第54页:算术操作符
modulearithops_test; parameter FIVE = 5; integer ans, int; reg [3: 0] rega, regb; reg [3: 0] num; initial beginrega = 3; regb = 4'b1010; int =-3;// ans =-15#20 ans = (int + 5)/ 2;// ans =-1#50 num = rega + 1;// num = 1101#70 num = regb % rega;endendmodule+加-减*乘/除%模•将负数赋值给reg或其它无符号变量,使用2的补码算术。•如果操作数的某一位是x或z,则结果为x•在整数除法中,余数舍弃•模运算中使用第一个操作数的符号注意integer和reg类型在算术运算时的差别。integer是有符号数,而reg是无符号数。;
第55页:逻辑运算符
- 逻辑操作符有
- && (逻辑与)|| (逻辑或)!(逻辑非)这些操作符在逻辑值0或1上操作。逻辑操作的结构为0或1。
第56页:逻辑运算符例一例如,假定:Crd =
- 逻辑运算符例一例如,假定
- Crd = 1'b0;
第57页:逻辑运算符例二对于向量操作
非0向量作为1处理。例如,假定:A=4'b0110;B=4'b0100;那么:A||B结果为?A&&B结果为?并且:!A与!B的结果相同,为?。
第58页:按位操作符
- 按位操作符有
- ~(一元非)&(二元与)|(二元或)^(二元异或)~^, ^~(二元异或非)
第59页:按位操作符例一例如,假定
A=4'b0110;B=4'b0100;那么:A|B结果为?,A||B结果为?A&B结果为?,A&&B结果为?~A=? ,!A=?
第60页:关系运算符
- 关系操作符有
- >(大于)<(小于)>=(不小于)<=(不大于)关系操作符的结果为真(1'b1)或假(1'b0)或1'bx。
第61页:相等操作符
(掌握)逻辑等逻辑不等==!=module equalities_test; reg [3: 0] rega, regb, regc; reg val; initial beginrega = 4'b0011; regb = 4'b1010; regc = 4'b1x10; #10 val = (rega == regb);// val = 1#30 val =(regb != regc);endendmodule•其结果是1’b1、1’b0或1’bx。•如果左边及右边为确定值,并且相等,则结果为1。•如果左边及右边为确定值,并且不相等,则结果为0。•如果左边及右边有值不能确定的位,但值确定的位相等,则结果为x。•!=的结果与= =相反值确定是指所有的位为0或1。不确定值是有值为x或z的位。==!=;
第62页:Verilog代码示例
相等操作符(了解)相同(case等)不相同(case不等)===!==module equalities2_test; reg [3: 0] rega, regb, regc; reg val; initial beginrega = 4'b0011; regb = 4'b1010; regc = 4'b1x10; #10 val = (rega === regb);// val = 1#30 val =(regb === regc);endendmodule•其结果是1’b1、1’b0或1’bx。•如果左边及右边的值相同(包括x、z),则结果为1。•如果左边及右边的值不相同,则结果为0。•!==的结果与===相反※※※综合工具不支持!!!!!,也就是说没有相应的电路来对应这种操作符。===!==;
第63页:条件操作符
- 条件操作符的语法为
- <LHS> = <condition>?<true_expression>:<false_expression>;其意思是:if condition is TRUE, then LHS=true_expression,else LHS = false_expression每个条件操作符必须有三个参数,缺少任何一个都会产生错误。最后一个操作数作为缺省值。例如:assign out = (sel == 0) ? a : b;若sel为0则out =a;若sel为1则out = b;如果sel为x或z,则结果可能为x或z。
第64页:out 连续赋值示例(续1)
条件操作符-使用实例module likebufif( in, en, out); input in; input en; output out; assign out = (en == 1) ? in : 'bz; endmodulemodule like4to1( a, b, c, d, sel, out); input a, b, c, d; input [1: 0] sel; output out; assign out = sel == 2'b00 ? a :sel == 2'b01 ? b :sel == 2'b10 ? c : d; endmodule如果条件值为x或z,则结果可能为x或z;
第65页:移位操作符
- 移位操作符有
- << (左移)>> (右移)如rega << 5意思是rega向左移5位;rega >> 3意思是rega向右移3位;
- 移位操作符对其左边的操作数进行向左或向右的位移位操作。
- 第二个操作数(移位位数)是无符号数。
第66页:module shift_test
- ;reg [9
- 0] num, num1;reg [7: 0] rega, regb;…//如果rega = 8'b0000 1100;num <= rega << 5 ;
第67页:连接操作
连接操作是将小表达式合并形成大表达式的操作。形式如下:{expr1, expr2, . . .,exprN}
第68页:连接操作实例
wire [9:0] d; wire [9:0] a; assign d[9:5] ={a[0], a[1], a[2], a[3], a[4] };//高4位与低4位交换。;
第69页:由于非定长常数
的长度未知,不允许连接非定长常数。例如,下列式子非法:reg [16:0] a;reg [31:0] d;…d={a,5};//error!!不允许连接操作非定长常数。d={a,16'h0005};//error!!右边33位,左边32位,位宽不匹配,一样会出错改为:d={a,15'h5};连接操作注意事项
第70页:复制操作
复制通过指定重复次数来执行操作。语法形式如下:{repetition_number{expr1,expr2, ...,exprn} }
第71页:d 连续赋值示例
例一:wire [7:0] d; wire [11:0] a; …assign d={2{4'b1011}};//a为12'b1111 1011 1011//注意:assign a= {4{d[7]},d};
下载地址:{{downurl}}
{{{a}}}
{{#b}}{{{b}}}
{{/b}} {{/title}} {{#nolog}}登陆注册
{{/nolog}} {{#djsx}}点我刷新
{{/djsx}} {{#gocz}} {{/gocz}} {{#ffqr}} {{/ffqr}}