版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2022-3-161 数据类型用来表示数字电路硬件中的数据存数据类型用来表示数字电路硬件中的数据存储和传送的元素。储和传送的元素。Verilog HDLVerilog HDL共有共有19种数据类型,分种数据类型,分2 2大类数据:大类数据: 线网类型线网类型 表示器件之间的物理连接。表示器件之间的物理连接。 其数值由驱动元件决定,如果没有驱动元件连接到其数值由驱动元件决定,如果没有驱动元件连接到线网上,线网上,则其默认值为高阻则其默认值为高阻Z Z。 寄存器类型寄存器类型 表示数据的储存单元。表示数据的储存单元。 其默认值为不定其默认值为不定X X。 两者最大的区别:两者最大的区别: 寄存器类
2、型保持最后一次的赋值,而线网类型则需寄存器类型保持最后一次的赋值,而线网类型则需要持续的驱动。要持续的驱动。数据类型数据类型2022-3-162wirewire(网络连线)(网络连线): 由模块或门驱动的连线。由模块或门驱动的连线。 驱动端信号的改变会立刻驱动端信号的改变会立刻传递到输出的连线上。传递到输出的连线上。 例如:右图上,例如:右图上,selbselb的改的改变,会自动地立刻影响或变,会自动地立刻影响或门的输出。门的输出。 netsabslselbselanslout线网类型线网类型2022-3-163线网类型线网类型l线网型数据常用来表示以线网型数据常用来表示以assignassi
3、gn关键字指定的组合关键字指定的组合逻辑信号。逻辑信号。lVerilogVerilog程序模块中输入输出信号类型缺省时自动程序模块中输入输出信号类型缺省时自动定义为定义为wirewire型。型。lwirewire型信号可以用作任何方程式的输入,也可以用型信号可以用作任何方程式的输入,也可以用作作“assign”assign”语句或实例元件的输出。语句或实例元件的输出。l定义格式:定义格式: wire wire 位宽位宽 数据名数据名1, 1, 数据名数据名2, 2, 数据名数据名n;n; wire a; / wire a; /定义了一个一位的定义了一个一位的wirewire型数据型数据 wir
4、e 7:0 b;/wire 7:0 b;/定义了一个八位的定义了一个八位的wirewire型数据型数据 wire 4:1 c,d; /wire 4:1 c,d; /定义了二个四位的定义了二个四位的wirewire型数据型数据2022-3-164线网类型变量的种类:线网类型变量的种类:类型 功能 wire, triwire, tri 对应于标准的互连线(缺省)对应于标准的互连线(缺省)supply1, supply2 supply1, supply2 对应于电源线或接地线对应于电源线或接地线wor, trior wor, trior 对应于有多个驱动源的线或逻辑连接对应于有多个驱动源的线或逻辑连
5、接wand, triand wand, triand 对应于有多个驱动源的线与逻辑连接对应于有多个驱动源的线与逻辑连接trireg trireg 对应于有电容存在能暂时存储电平连接对应于有电容存在能暂时存储电平连接tri1, tri0 tri1, tri0 对应于需要上拉或下拉的连接对应于需要上拉或下拉的连接 如果不明确地说明连接是何种类型,默认为如果不明确地说明连接是何种类型,默认为wirewire类型。类型。 其中只有其中只有wire, tri , supply1, supply2wire, tri , supply1, supply2是可是可综合的,其余只能用于仿真语句综合的,其余只能用
6、于仿真语句2022-3-165线网类型线网类型lVerilogVerilog语法规定可以对语法规定可以对wirewire型变量有多个驱动,型变量有多个驱动,但只有用于仿真,在实际电路中,对任何信号但只有用于仿真,在实际电路中,对任何信号有多个驱动源都会产生不确定的后果,因此综有多个驱动源都会产生不确定的后果,因此综合是过不去的合是过不去的 wire a,b,c; assign c =a; assign c =b;l在在VerilogVerilog定义中,定义中,wirewire、tritri功能是完全一致功能是完全一致的,提供这两种不同名称的目的是为了与模型的,提供这两种不同名称的目的是为了与
7、模型中所使用的变量实际情况相一致。中所使用的变量实际情况相一致。2022-3-166wire a b;ababcNAND2wire a,b,c; assign c =a & b ;线网类型线网类型2022-3-167寄存器类型寄存器类型 寄存器型变量具有存储性,即在接受下一个寄存器型变量具有存储性,即在接受下一个赋值前,将保持原值,默认的初始状态为赋值前,将保持原值,默认的初始状态为“X”X”。 寄存器数据类型包含下列寄存器数据类型包含下列5 5类数据类型:类数据类型:lreg: reg: 最常用的,用于行为描述中对寄存器类的说明最常用的,用于行为描述中对寄存器类的说明lintegerinte
8、ger:3232位带符号整形变量位带符号整形变量ltimetime:6464位无符号时间变量位无符号时间变量lrealreal:6464位浮点、双精度、带符号实形变量位浮点、双精度、带符号实形变量lrealtimerealtime:其特征与:其特征与realreal型变量一致型变量一致2022-3-168寄存器类型寄存器类型(reg)(reg)l定义寄存器数据类型的关键字是定义寄存器数据类型的关键字是regreg,可以通过赋值语句,可以通过赋值语句改变寄存器存储的值。改变寄存器存储的值。lregreg类型数据的缺省初始值为不定值类型数据的缺省初始值为不定值x x,这在电路仿真时这在电路仿真时需
9、要十分注意,需要十分注意,建议仿真前都建议仿真前都要明确要明确给给每一个寄存器确每一个寄存器确定初始值定初始值。l在在“always“always或或initial”initial”块内被赋值每一个信号都必须定块内被赋值每一个信号都必须定义成义成regreg类型类型。l定义方式:定义方式:reg reg 位宽位宽 数据名数据名1,1,数据名数据名2, 2, 数据名数据名i;i;reg rega; /reg rega; /定义了一个定义了一个1 1位位regreg型数据型数据reg 3:0 regb; /reg 3:0 regb; /定义一个定义一个4 4位的位的regreg型数据型数据reg
10、4:0 regc, regd; /reg 4:0 regc, regd; /定义两个定义两个5 5位的位的regreg型数据型数据2022-3-169 regreg型变量能保持其值,直到它被赋于新值。型变量能保持其值,直到它被赋于新值。 regreg型变量常用于行为建模,产生测试的激励型变量常用于行为建模,产生测试的激励信号。信号。 常用行为语句结构来给常用行为语句结构来给regreg类型的变量赋值。类型的变量赋值。abslselbselansloutreg_areg_selreg_b 寄存器(寄存器(registerregister)类型变量)类型变量2022-3-1610wireclk,d
11、;reg q;always ( posedge clk ) q = d; reg reg型数据常用来表示型数据常用来表示“always”always”模块内的指定模块内的指定信号,代表触发器。信号,代表触发器。寄存器类型寄存器类型(reg)(reg)2022-3-1611d dout2out2AND2i1AND2i1clkclkout1out1D D Q QDFFDFFmodule rw2( clk, d, out1, out2 ) ; input clk, d;output out1, out2; reg out1; wire out2;assign out2 = d & (out1 );
12、always (posedge clk) begin out1 = d ; endendmodule 用寄存器用寄存器(reg)(reg)类型变量生成触发器例子类型变量生成触发器例子2022-3-1612寄存器类型寄存器类型(reg)(reg)注意:注意: regreg型只表示被定义的信号将用在型只表示被定义的信号将用在“alwaysalways或或initial”initial”块内,理解这一点很重要。虽然块内,理解这一点很重要。虽然regreg型信号常常是寄存型信号常常是寄存器或触发器的输出器或触发器的输出, ,但并不是说但并不是说regreg型信号一定是寄存器型信号一定是寄存器或触发器的
13、输出。或触发器的输出。aout2BUFFbINVout1module rw1( a, b, out1, out2 ) ;input a, b;output out1, out2;reg out1;wire out2; assign out2 = a ; always (b) out1 = b;endmodule 2022-3-1613regreg和和wirewire类型变量的区别类型变量的区别lregreg类型的变量可以被直接赋予数值,向类型的变量可以被直接赋予数值,向外输出信号外输出信号l而而wirewire类型的变量值是由驱动它的电路决类型的变量值是由驱动它的电路决定的定的2022-3-1
14、614位选择和部分选择位选择和部分选择 l位选择从向量中抽取特定的位。形式如下:位选择从向量中抽取特定的位。形式如下: wirewire或者或者regreg向量名向量名bit_select_exprbit_select_exprl reg 5:0 State;reg 5:0 State;l wire 3:0 Prtwire 3:0 Prt;lState1 & State4 /State1 & State4 /寄存器位选择。寄存器位选择。lPrt0 | Bbq /Prt0 | Bbq /线网位选择。线网位选择。2022-3-1615位选择和部分选择位选择和部分选择l在部分选择中,向量的连续序列被
15、选择。形式在部分选择中,向量的连续序列被选择。形式如下:如下:l wirewire或者或者regreg向量名向量名 常数表达式常数表达式1:1:常数表达式常数表达式22l reg 5:0 State;reg 5:0 State; wire 3:0 Prtwire 3:0 Prt; State4:1 /State4:1 /寄存器部分选择。寄存器部分选择。 Prt3:2 /Prt3:2 /线网部分选择。线网部分选择。2022-3-1616存储器存储器l通过对通过对regreg型变量建立数组来对存储器型变量建立数组来对存储器进行进行建模建模。reg n-1:0 reg n-1:0 存储器名存储器名m
16、-1:0m-1:0;lregn-1:0regn-1:0定义了存储器中每一个存储单元的大小,定义了存储器中每一个存储单元的大小,即该存储单元是一个即该存储单元是一个n n位的寄存器。位的寄存器。l存储器名后的存储器名后的m-1:0 m-1:0 则定义了该存储器中有多少个则定义了该存储器中有多少个这样的寄存器这样的寄存器( (即地址),最后用分号结束定义语句。即地址),最后用分号结束定义语句。reg 7:0 mema255reg 7:0 mema255:0; /256x80; /256x8位的存储器。位的存储器。2022-3-1617存储器存储器l一个由一个由n n个个1 1位寄存器构成的存储器组
17、不同于一个位寄存器构成的存储器组不同于一个n n位的寄存位的寄存器。器。 reg n-1:0 rega; /reg n-1:0 rega; /一个一个n n位的寄存器位的寄存器 reg meman-1:0; /reg meman-1:0; /一个由一个由n n个个1 1位寄存器构成存储器组位寄存器构成存储器组l一个一个n n位的寄存器可以在一条赋值语句里进行赋值,而一个位的寄存器可以在一条赋值语句里进行赋值,而一个完整的存储器则不行。完整的存储器则不行。 rega =0; /rega =0; /合法赋值语句合法赋值语句 mema =0; /mema =0; /非法赋值语句非法赋值语句 mema
18、3=0;/mema3=0;/正确正确. .给给memorymemory中的第中的第3 3个存储单元赋值个存储单元赋值0.0.2022-3-1618 输入口(输入口(inputinput)可以由寄存器或网络连接驱动,)可以由寄存器或网络连接驱动,(即外部连接它可以是(即外部连接它可以是regreg或或wirewire型),但它本身型),但它本身只能是只能是wirewire型。型。 输出口输出口(output)(output)可以是可以是wirewire或或regreg型,但它本身只型,但它本身只能驱动线网型,即外部连接它只能是能驱动线网型,即外部连接它只能是wirewire型型 。 输入输入/
19、/输出口输出口(inout)(inout)只能定义为只能定义为wirewire型,并且与型,并且与它连接也只能是它连接也只能是wirewire型。型。 如果信号变量是在过程块如果信号变量是在过程块 (initial(initial块块 或或 alwaysalways块块) )中被赋值的,必须把它声明为寄存器类型变量中被赋值的,必须把它声明为寄存器类型变量 如何选择数据类型如何选择数据类型2022-3-1619如何选择数据类型如何选择数据类型举例说明例化时数据类型举例说明例化时数据类型的选择的选择module top;wire y; reg a, b; DUT u1(y,a,b); initia
20、l begin a = 0; b = 0; #10 a =1; . endendmodule 模块模块DUT的边界的边界输入口输入口输出口输出口输出输出/入口入口netnetnet/registernetnet/registernetinoutmodule DUT(Y, A, B);output Y;input A,B: wire Y, A, B; and (Y, A, B);endmodule2022-3-1620 选择数据类型时常犯的错误选择数据类型时常犯的错误 把模块的输入信号定义为寄存器类型了。把模块的输入信号定义为寄存器类型了。 把例化后的输出连接出去时,把它定义为寄存把例化后的输出
21、连接出去时,把它定义为寄存器类型了。器类型了。 在过程块中对变量赋值时,忘了把它定义为寄在过程块中对变量赋值时,忘了把它定义为寄存器类型(存器类型(regreg)或已把它定义为连接类型了)或已把它定义为连接类型了(wirewire)。)。这是经常犯的三个错误!这是经常犯的三个错误!如何选择数据类型如何选择数据类型2022-3-1621参数(参数(parametersparameters)l在在Verilog Verilog 中用中用parameterparameter定义一个代表常量的标识符定义一个代表常量的标识符, ,称称为符号常量为符号常量, ,采用标识符代表一个常量可提高程序的可读性采用
22、标识符代表一个常量可提高程序的可读性和可维护性,且在和可维护性,且在有限状态机中经常使用符号常量。有限状态机中经常使用符号常量。l参数型常数也经常用于定义延迟时间和变量宽度。参数型常数也经常用于定义延迟时间和变量宽度。l parameter parameter 参数名参数名1 1表达式表达式1 1,,参数名参数名n n表达式表达式n n;parameter wordsize=16,parameter wordsize=16, memsize=256; / memsize=256; /定义二个参数;定义二个参数;reg wordsize-1:0 memmemsize-1:0; /reg word
23、size-1:0 memmemsize-1:0; /存储器声明存储器声明l参数是本地的,其定义只在本模块内有效参数是本地的,其定义只在本模块内有效2022-3-1622参数值的改写参数值的改写: : 在模块或实例引用时可通过参数传递来改变被引用在模块或实例引用时可通过参数传递来改变被引用模块或实例中已定义的参数。模块或实例中已定义的参数。参数(参数(parametersparameters)module adder (a, b,sum); parameter wid = 8; Input wid-1:0 a,b; output wid:0 sum; endmodulemodule TOP(in
24、a,inb,out); input 8:0 ina,inb; output 9:0 out; . adder u1(ina,inb,out,); defparam u1.wid=9; endmodule参数值的改写参数值的改写: : 方法一方法一2022-3-1623参数(参数(parametersparameters)module adder (a, b,sum); parameter wid = 8; Input wid-1:0 a,b; output wid:0 sum; endmodulemodule TOP(ina,inb,out); input 8:0 ina,inb; outpu
25、t 9:0 out; . adder #(9) u1(ina,inb,out,);endmodule参数值的改写参数值的改写: : 方法二方法二2022-3-1624赋值运算符赋值运算符l分连续赋值和过程赋值两种分连续赋值和过程赋值两种l过程赋值主要用于两种结构模块过程赋值主要用于两种结构模块(initial(initial和和always)always),分为阻塞和非阻塞赋值。,分为阻塞和非阻塞赋值。l连续赋值语句只能对线网型变量进行赋值,连续赋值语句只能对线网型变量进行赋值,而不能对寄存器变量进行赋值而不能对寄存器变量进行赋值l连续赋值语句的语法为连续赋值语句的语法为: : assign
26、assign # #延时量延时量 线网型变量名线网型变量名= = 赋值表达式赋值表达式 只要右端表达式中任一个操作数值发生变化,只要右端表达式中任一个操作数值发生变化,就会立即触发对被赋值变量的更新操作就会立即触发对被赋值变量的更新操作2022-3-1625连续赋值语句应用连续赋值语句应用l对标量线网赋值对标量线网赋值wire a,b;wire a,b; assign a =b; assign a =b;l对矢量线网赋值对矢量线网赋值wire 7:0 a,b;wire 7:0 a,b; assign a =b; assign a =b;l对矢量线网某几位赋值对矢量线网某几位赋值wire 7:0
27、 a,b;wire 7:0 a,b; assign a3:0 =b4:1; assign a3:0 =b4:1;l对任意拼接线网赋值对任意拼接线网赋值wire a,b;wire a,b;wire 1:0 c,d;wire 1:0 c,d; assign c = a , b; assign a , b=d; assign c = a , b; assign a , b=d;2022-3-1626VerilogVerilog中的大小中的大小(size)(size)与符号与符号lVerilogVerilog会根据表达式中变量长度对表达式值自动地进行调整。会根据表达式中变量长度对表达式值自动地进行调整
28、。lVerilogVerilog自动截断或扩展赋值语句中右边的值以适应左边变量自动截断或扩展赋值语句中右边的值以适应左边变量的长度。的长度。module sign_size; reg 3:0 a, b; reg 15:0 c; initial begin a = -1; / a是无符号数,因此其值为是无符号数,因此其值为1111 b = 8; c= 8; / b = c = 1000 #10 b = b + a; / 结果结果10111截断截断, b = 0111 #10 c = c + a; / c = 10111 endendmodule 当一个当一个负数赋值给负数赋值给无符号变量无符号变
29、量如如regreg时,时,VerilogVerilog自自动完成二进动完成二进制补码计算制补码计算2022-3-1627逻辑反与位反的对比逻辑反与位反的对比module negation(); reg 3: 0 rega, regb; reg 3: 0 bit; reg log; initial begin rega = 4b1011; regb = 4b0000; end initial fork #10 bit = rega; / num = 0100 #20 bit = regb; / num = 1111 #30 log = !rega; / num = 0 #40 log = !re
30、gb; / num = 1 #50 $finish; joinendmodule! logical not 逻辑反逻辑反 bit-wise not 按位反按位反 逻辑反的结果为一位逻辑反的结果为一位1 1,0 0或或x x。按位反的结果与操作数按位反的结果与操作数的位数相同的位数相同 逻辑反操作符将操作数逻辑反操作符将操作数的逻辑值取反。例如,若的逻辑值取反。例如,若操作数为全操作数为全0 0,则其逻辑值,则其逻辑值为为0 0,逻辑反操作值为,逻辑反操作值为1 1。2022-3-1628逻辑等逻辑等case等(综合工具不支持等(综合工具不支持!)等式运算符等式运算符2022-3-1629等式运
31、算符等式运算符l“=”“=”和和“!=”!=”又称为逻辑等式运算符。其结又称为逻辑等式运算符。其结果由两个操作数的值决定。由于操作数中某些果由两个操作数的值决定。由于操作数中某些位可能是不定值位可能是不定值x x和高阻值和高阻值z,z,结果可能为不定结果可能为不定值值x x。l而而“=”=”和和“!=”!=”运算符则不同运算符则不同, ,它在对操它在对操作数进行比较时对某些位的不定值作数进行比较时对某些位的不定值x x和高阻值和高阻值z z也进行比较也进行比较, ,两个操作数必需完全一致,两个操作数必需完全一致,其结其结果才是果才是1 1,否则为,否则为0 0。lcasecase等只能用于仿真
32、描述,不能用于等只能用于仿真描述,不能用于RTLRTL描述描述。2022-3-1630相等操作符相等操作符 赋值操作符,将等式右边表达式的值拷贝到左边赋值操作符,将等式右边表达式的值拷贝到左边。注意逻辑等与注意逻辑等与casecase等的差别等的差别= 逻辑等逻辑等= = case等等= = =2b1x=2b0 x 值为值为0,因为不相等,因为不相等2b1x=2b1x 值为值为x,因为可能不,因为可能不相等,也可能相等相等,也可能相等2b1x=2b0 x 值为值为0,因为不相同,因为不相同2b1x=2b1x 值为值为1,因为相同,因为相同a = 2b1x;b = 2b1x;if (a = b)
33、 $display( a is equal to b);else $display( a is not equal b);a = 2b1x;b = 2b1x;if (a = b) $display( a is identical b);else$display(a is not identic b);2022-3-1631wire7:0in, out;wire2:0sft;assignout = in 4; assign a7:4 = 4b0000;assign a3:0 = b7:4; 移位运算符移位运算符(右移位运算符右移位运算符) )都用都用0 0来填补移出空位。来填补移出空位。 202
34、2-3-1632条件运算符条件运算符条件条件? :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 = 2b00 ? a : sel = 2b01 ? b : sel = 2b10 ? c : d;endmodule 如果条件值为如果
35、条件值为x x或或z z,则,则结果可能为结果可能为x x或或z z2022-3-1633条件操作符条件操作符 每个条件操作符必须有三个参数,缺少任何一个都会产生每个条件操作符必须有三个参数,缺少任何一个都会产生错误。最后一个操作数作为缺省值。错误。最后一个操作数作为缺省值。语法为:语法为: = ? :其意思是:其意思是:if condition is TRUE, then LHS=true_expression, else LHS = false_expressionregistger = condition ? true_value:false_value;例如:例如:assign out
36、 = (sel = 0) ? a : b;assign out = (sel = 0) ? a : b;若若selsel为为0 0则则out=aout=a;若;若selsel为为1 1则则out=bout=b。如果。如果selsel为为x x或或z z,若,若a=b=0a=b=0,则,则out=0out=0;若;若abab,则,则outout值不确定。值不确定。 上式中,若上式中,若conditioncondition为真为真, ,则则registerregister等于等于true_valuetrue_value;若;若conditioncondition为假为假, ,则则registerr
37、egister等于等于false_valuefalse_value。若条件值不确。若条件值不确定,且定,且true_valuetrue_value和和false_valuefalse_value不相等,则输出不确定值。不相等,则输出不确定值。2022-3-1634赋值语句赋值语句l在在Verilog HDLVerilog HDL中,信号有两种赋值方式中,信号有两种赋值方式 阻塞阻塞(Blocking)(Blocking)赋值方式赋值方式 “ “= ”= ”,如,如 b = a;b = a; 赋值语句执行完后赋值语句执行完后, ,块才结束。块才结束。b b的值在赋值语句执行完后立刻就改变的。的值
38、在赋值语句执行完后立刻就改变的。描述时序电路可能会产生意想不到的结果。描述时序电路可能会产生意想不到的结果。 非阻塞非阻塞(Non_Blocking)(Non_Blocking)赋值方式赋值方式“ ”,如,如b=a;b=a; 块结束后才完成赋值操作。块结束后才完成赋值操作。b b的值并不是立刻就改变的。的值并不是立刻就改变的。这是一种比较常用的赋值方法(特别在编写可这是一种比较常用的赋值方法(特别在编写可综合时序模块时)。综合时序模块时)。2022-3-1635阻塞赋值阻塞赋值l阻塞赋值操作符用等号阻塞赋值操作符用等号(=)(=)表示。阻塞赋值时先计算表示。阻塞赋值时先计算等号右手方向(等号右
39、手方向(RHSRHS)值,这时赋值语句不允许任何)值,这时赋值语句不允许任何别的别的VerilogVerilog语句干扰,直到现行赋值完成时,即把语句干扰,直到现行赋值完成时,即把RHSRHS赋值给赋值给LHSLHS时,它才允许别的赋值语句执行。时,它才允许别的赋值语句执行。l一般可综合的阻塞赋值操作在一般可综合的阻塞赋值操作在RHSRHS不能设定有延迟,不能设定有延迟,( (即使是零延迟也不允许即使是零延迟也不允许) )。若在。若在RHSRHS加上延迟,则在加上延迟,则在延迟期间会阻止赋值语句的执行延迟期间会阻止赋值语句的执行, , 延迟后才执行赋值,延迟后才执行赋值,在需综合的模块设计中不
40、可使用这种风格的代码。在需综合的模块设计中不可使用这种风格的代码。l阻塞赋值的执行可认为是只有一个步骤的操作:阻塞赋值的执行可认为是只有一个步骤的操作:计算计算RHSRHS并更新并更新LHSLHS,此时不能允许有来自任何其他,此时不能允许有来自任何其他VerilogVerilog语句干扰语句干扰。所谓阻塞的概念是指在同一个。所谓阻塞的概念是指在同一个alwaysalways块中,其后面的赋值语句从概念上(即使不设块中,其后面的赋值语句从概念上(即使不设定延迟)是在前一句赋值语句结束后再开始赋值的定延迟)是在前一句赋值语句结束后再开始赋值的2022-3-1636阻塞赋值阻塞赋值q1 q2q3dc
41、lk移位寄存器电路移位寄存器电路module pipeb1 (q3, d, clk); output 7:0 q3; input 7:0 d; input clk; reg 7:0 q3, q2, q1; always (posedge clk) begin q1 = d; q2 = q1; q3 = q2; end endmodule 不正确地使用的阻塞赋值来描述移位寄存器。(方式不正确地使用的阻塞赋值来描述移位寄存器。(方式1 1)q3dclk实际综合的结果实际综合的结果在上面的模块中,按顺序进行的阻塞赋值将使得在下一个在上面的模块中,按顺序进行的阻塞赋值将使得在下一个时钟上升沿时刻,所有
42、寄存器输出值都等于输入值时钟上升沿时刻,所有寄存器输出值都等于输入值d d 。2022-3-1637阻塞赋值阻塞赋值用阻塞赋值来描述移位寄存器也是可行,但这种风格并不好。用阻塞赋值来描述移位寄存器也是可行,但这种风格并不好。module pipeb2 (q3, d, clk); output 7:0 q3; input 7:0 d; input clk; reg 7:0 q3, q2, q1; always (posedge clk) begin q3 = q2; q2 = q1; q1 = d; end endmoduleq1 q2q3dclk 上面模块中,阻塞赋值次序是经过仔细安排的,以使
43、仿真上面模块中,阻塞赋值次序是经过仔细安排的,以使仿真的结果与移位寄存器相一致。虽然该模块可被综合成移位寄的结果与移位寄存器相一致。虽然该模块可被综合成移位寄存器,但不建议使用这种风格的模块来描述时序逻辑。存器,但不建议使用这种风格的模块来描述时序逻辑。 移位寄存器电路移位寄存器电路(方式(方式2 2)2022-3-1638阻塞赋值阻塞赋值 module pipeb3 (q3, d, clk); output 7:0 q3; input 7:0 d; input clk; reg 7:0 q3, q2, q1; always (posedge clk) q1 = d; always (pose
44、dge clk) q2 = q1; always (posedge clk) q3 = q2; endmodule不好的用阻塞赋值来描述移位时序逻辑的风格(方式不好的用阻塞赋值来描述移位时序逻辑的风格(方式3 3) 阻塞赋值分别被放在不同阻塞赋值分别被放在不同alwaysalways块里。仿真时,这些块的先块里。仿真时,这些块的先后顺序是随机的,因此可能会出现错误的结果,这是后顺序是随机的,因此可能会出现错误的结果,这是VerilogVerilog中中的竞争冒险。按不同的顺序执行这些块将导致不同的结果。但的竞争冒险。按不同的顺序执行这些块将导致不同的结果。但是,这些代码的综合结果却是正确的流水
45、线寄存器。是,这些代码的综合结果却是正确的流水线寄存器。 q1 q2q3dclk移位寄存器电路 前仿真和后仿真的结果前仿真和后仿真的结果可能会不一致可能会不一致2022-3-1639阻塞赋值阻塞赋值module pipeb4 (q3, d, clk); output 7:0 q3; input 7:0 d; input clk; reg 7:0 q3, q2, q1; always (posedge clk) q2 = q1; always (posedge clk) q3 = q2; always (posedge clk) q1 = d; endmodule不好的用阻塞赋值来描述移位时序逻
46、辑的风格(方式不好的用阻塞赋值来描述移位时序逻辑的风格(方式4 4)仅把仅把alwaysalways块的次序的作些变动,也可以被综合成正确的块的次序的作些变动,也可以被综合成正确的移位寄存器逻辑,但仿真结果可能不正确。移位寄存器逻辑,但仿真结果可能不正确。q1 q2q3dclk移位寄存器电路移位寄存器电路2022-3-1640非阻塞赋值非阻塞赋值l非阻塞赋值操作符用小于等于号非阻塞赋值操作符用小于等于号( (即即=)=)表示。表示。l为什么称非阻塞赋值?这是因为在赋值操作时刻开始时为什么称非阻塞赋值?这是因为在赋值操作时刻开始时计算非阻塞赋值符的计算非阻塞赋值符的RHSRHS表达式,表达式,赋
47、值操作时刻结束同时赋值操作时刻结束同时更新更新LHSLHS。在计算非阻塞赋值在计算非阻塞赋值RHSRHS表达式,其他的表达式,其他的VerilogVerilog语句,包括其他的语句,包括其他的VerilogVerilog非阻塞赋值语句都能同时计算非阻塞赋值语句都能同时计算RHSRHS表达式。非阻塞赋值允许其他的表达式。非阻塞赋值允许其他的erilogerilog语句同时进行语句同时进行操作。操作。l非阻塞赋值的操作可以看作为两个步骤的过程:非阻塞赋值的操作可以看作为两个步骤的过程: 1)1)在赋值时刻开始时,同时计算非阻塞赋值在赋值时刻开始时,同时计算非阻塞赋值RHSRHS表达式表达式 2)2
48、)在赋值时刻结束时,同时更新非阻塞赋值在赋值时刻结束时,同时更新非阻塞赋值LHSLHS表达式表达式l非阻塞赋值操作只能用于对寄存器类型变量进行赋值,非阻塞赋值操作只能用于对寄存器类型变量进行赋值,因此只能用在因此只能用在“initial”initial”块和块和“always”always”块等过程块中。块等过程块中。非阻塞赋值不允许用于连续赋值,即非阻塞赋值不允许用于连续赋值,即assignassign语句。语句。2022-3-1641非阻塞赋值非阻塞赋值module pipen1 (q3, d, clk); output 7:0 q3; input 7:0 d; input clk; re
49、g 7:0 q3, q2, q1; always (posedge clk) begin q1 = d; q2 = q1; q3 = q2; end endmodule正确的用非阻塞赋值来描述时序逻辑的设计风格正确的用非阻塞赋值来描述时序逻辑的设计风格 #1#1 如果在如果在begin-endbegin-end块中同时有多个非阻塞赋值语句,则它块中同时有多个非阻塞赋值语句,则它们的赋值是同时的,并不是按照先后次序赋值。们的赋值是同时的,并不是按照先后次序赋值。q1 q2q3dclk2022-3-1642非阻塞赋值非阻塞赋值module pipen2 (q3, d, clk); output 7:0 q3; input 7:0 d; input clk; reg 7:0 q3, q2, q1; always (posedge clk) begin q3 = q2; q2 = q1; q1 = d; end endmodule正确的用非阻塞赋值来描述时序逻辑的设计风格正确的用非阻塞赋值来描述时序逻辑的设计风格 #2#2q1 q2q3dclk2022-3-1643非阻塞赋值非阻塞赋值module pipen3 (q3, d, clk); output 7:0 q3; input 7:0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年玉米种植户与合作社联合销售合同3篇
- 2025年度水电工程设计与施工兼职聘用合同3篇
- 2025年度二手房定金购买合同规范
- 2025版焊接技术创新与应用推广合同
- 2024建筑垃圾清运与处理合同
- 2025年度网络安全与数据保护承包合同2篇
- 2024年版标准化饭堂供餐服务协议模板版B版
- 2024年田土承包经营权租赁与农业电商数据分析合同3篇
- 2025年度矿业资源居间代理合同示范文本3篇
- 2025版股票场外质押业务尽职调查合同3篇
- 【MOOC】模拟电子技术-中南大学 中国大学慕课MOOC答案
- 建筑施工安全知识培训
- 污水泵站运营维护管理方案
- 2024下半年软考信息安全工程师考试真题-及答案-打印
- 项目经理或管理招聘面试题与参考回答
- 中华人民共和国能源法
- 常见急救知识培训
- 义务教育信息科技课程标准(2024年版)
- 《义务教育数学课程标准(2022年版)》初中内容解读
- 产品质量检测服务行业营销策略方案
- 佛吉亚卓越体系知识手册
评论
0/150
提交评论