收藏 分享(赏)

第6章数据流建模.ppt

上传人:gnk289057 文档编号:10171710 上传时间:2019-10-16 格式:PPT 页数:86 大小:1.24MB
下载 相关 举报
第6章数据流建模.ppt_第1页
第1页 / 共86页
第6章数据流建模.ppt_第2页
第2页 / 共86页
第6章数据流建模.ppt_第3页
第3页 / 共86页
第6章数据流建模.ppt_第4页
第4页 / 共86页
第6章数据流建模.ppt_第5页
第5页 / 共86页
点击查看更多>>
资源描述

1、第6章数据流建模,学习目标讲述连续赋值语句(assign)、对于连续赋值语句的限制以及隐式连续赋值语句。解释赋值延迟、隐式赋值延迟以及用于连续赋值语句的线网声明延迟。定义表达式、操作符和操作数。列表解释所有类型的操作符,包括算术操作符、逻辑操作符、关系操作符、等价操作符、按位操作符、缩减操作符、移位操作符、拼接操作符和条件操作符等。使用数据流结构对实际的数字电路建模。,普遍采用的设计方法是借助于计算机辅助设计工具,自动将电路的数据流设计直接转换为门级结构,这个过程也称为逻辑综合。,随着逻辑综合工具的功能不断地完善,数据流建模已经成为主流的设计方法。数据流设计可以使得设计者根据数据流来优化电路,

2、而不必专注于电路结构的细节。,为了在设计过程中获得最大的灵活性,设计者常常将门级、数据流级和行为级的各种方式结合起来使用。,数字设计领域,RTL(Register Transfer Level,寄存器传输级)通常是指数据流建模和行为级建模的结合。,6.1 连续赋值语句,连续赋值语句是Verilog数据流建模的基本语句,用于对线网进行赋值。它等价于门级描述,然而是从更高的抽象角度来对电路进行描述。连续赋值语句必须以关键词assign开始,其语法如下:,continuous_assign:=assigndrive_strengthdelay3list_of_net_assignments; lis

3、t_of_net_assignments:=net_assignment,net_assignment net_assignment:=net_lvalue=expression,61 连续赋值语句,注意,上面语法中的驱动强度是可选项,可以根据我们在3.2.1节中讨论的内容进行说明,其默认值为strong1和strong0,但是在本章中将不对此进行讨论。延迟值也是可选的,用于指定赋值的延迟,类似于门的延迟。在本章中将对赋值延迟进行讨论。连续赋值语句具有以下特点:,1连续赋值语句的左值必须是一个标量或向量线网,或者是标量或向量线网的拼接,而不能是向量或向量寄存器。我们将在6.4.8节中对拼接操作

4、进行讨论;2连续赋值语句总是处于激活状态。只要任意一个操作数发生变化,表达式就会被立即重新计算,并且将结果赋给等号左边的线网;,3操作数可以是标量或向量的线网或寄存器,也可以是函数调用;4赋值延迟用于控制对线网赋予新值的时间,根据仿真时间单位进行说明。赋值延迟类似于门延迟,对于描述实际电路中的时序是非常有用的。,例61 连续赋值语句举例,/连续赋值语句,out是线网,i1和i2也是线网 assign out=i1,6.1.1 隐式连续赋值,我们在下面的例子中对隐式声明赋值和普通的连续赋值进行了对比,除了首先声明然后对其进行连续赋值以外,Verilog还提供了另一种对线网赋值的简便方法:在线网声

5、明的同时对其进行赋值。由于线网只能被声明一次,因此对线网的隐式声明赋值只能有一次。,/普通的连续赋值 wire out; assign out=in1,6.1.2 隐式线网声明,如果一个信号名被用在连续赋值语句的左侧,那么Ver-ilog编译器认为该信号是一个隐式声明的线网。如果线网被连接到模块的端口上,则Verilog编译器认为隐式声明线网的宽度等于模块端口的宽度。,/连续赋值,out为线网类型 wire i1, i2; assign out=i1 /注意,out并未声明为线网,但Verilog仿真器会推断出/out是一个隐式声明的线网,少了wire out,6.2 延迟,连续赋值语句中的延

6、迟用于控制任一操作数发生变化到语句左值被赋予新值之间的时间间隔。指定赋值延迟的方法有三种:普通赋值延迟、隐式赋值延迟和线网声明延迟。,6.21 普通赋值延迟,指定延迟的第一种方法是在连续赋值语句中说明延迟值,延迟值位于关键字assign的后面。 在上面的例子中,如果in1和in2中的任意一个发生变化,那么在计算表达式in1&in2的新值并将新值赋给语句左值之前,会产生10个时间单位的延迟。如果在此10个时间单位期间,即左值获得新值之前,in1或in2的值再次发生变化,那么在计算表达式的新值时会取inl或in2的当前值。我们称这种性质为惯性延迟。也就是说,脉冲宽度小于赋值延迟的输入变化不会对输出

7、产生影响。,/模块命名为D module D (out, in1, in2); /输入/输出端口声明 output out; input in1, in2; /内部线网声明 wire #10 out; assign out=in1 endmodule,参考的例5.13 有延迟的模块D的测试激励模块,/顶层模块stimulus module stimulus; /变量声明 reg in1, in2; wire #10 out; /调用(实例引用)模块D D d1(out, in1, in2); /仿真输入信号,在115个时间单位后结束仿真 initial begin in1= 1b0; in2=

8、1b0; #20 in1=1b1; in2=1b1; #40 in1=1b0; in2=1b1; #20 in1=1b1; in2=1b1; #15 in1=1b0; in2=1b1; #20 $finish; end endmodule,assign #10 out = in1 /连续赋值语句中的延迟,图6.1 延迟,图6.1给出了对上面的连续赋值语句进行仿真的波形,从中我们能够看到延迟对输出信号的影响:,1当in1和in2在时间单位20处变为高电平时,out在10个时间单位之后(即时间单位为30处)变为高电平,2当in1和in2在时间单位60处变为低电平时,out在时间单位70处变为低电平

9、;,3in1在时间单位80处变为高电平,但是在10个时间单位之内重新变为低电平;,4因此,在时间单位80之后再过10个时间单位,重新计算表达式,此时inl的值已经为0,因此out的值仍然为0。这说明如果脉冲的宽度小于指定的赋值延迟,就不会影响输出(即不会对赋值语句等号左边的值产生影响)。,622 隐式连续赋值延迟,另一种指定延迟的等效方法是使用隐式连续赋值语句来说明对线网的赋值以及赋值延迟。隐式连续赋值等效于声明一个线网并且对其进行连续赋值。,/隐式连续赋值延迟 wire #10 out = in1 ,623 线网声明延迟,Verilog允许在声明线网的时候指定一个延迟,这样对该线网的任何赋值

10、都会被推迟指定的时间。线网声明同样可以用于门级建模中。,/线网延迟 wire # 10 out; assign out = in1 ,6.3 表达式、操作符和操作数,6.3.1 表达式,表达式由操作符和操作数构成,其目的是根据操作符的意义计算出一个结果值。,/表达式的例子,组合了操作符和操作数 a b addr120:17 + addr220:17 in1| in2,数据流建模使用表达式而不是门级原语来描述设计。表达式、操作符和操作数构成了数据流建模的基础。,632 操作数,操作数可以是3.2节中定义的任何数据类型,但是某些语法结构要求使用特定类型的操作数。操作数可以是常数、整数、实数、线网、

11、寄存器、时间、位选(向量线网或向量寄存器的一位)、域选(向量线网或向量寄存器的一组选定的位)以及存储器和函数调用,632 操作数,integer count, fina1_count; fina1 count=count + 1; / count是整型操作数 real a, b, c; c = a - b; / a和b是实型操作数 reg 15:0 reg1, reg2; reg 3:0 reg_out; reg_out=regl3:0reg23:0;/reg13:0和reg23:0是域选的寄存器操作数 reg ret_value; ret_value=calculate_parity(A,B

12、);/ calculate_parity是函数型操作数,633 操作符,操作符对操作数进行运算并产生一个结果。Verilog提供了各种类型的操作符,d1 & d2 /操作符&具有两个操作数d1和d2 !a0 /操作符!具有一个操作数a0 B1 /操作符具有两个操作数B和1,64操作符类型,表61 操作符的类型和符号,续表1,续表2,续表3,641 算术操作符,算术操作符可以分为两种:双目操作符和单目操作符。 双目操作符 双目操作符对两个操作数进行算术运算,包括乘(*)、除(/)、加(+)、减(-)、求幂(*)和取模()。,A=4b0011; B=4b0100; /A和B是寄存器类型向量 D=6

13、; E=4; F=2 /D,E和F是整型数 A*B /A和B相乘,等于4b1100 D/E /D被E除等于1,余数部分取整 A+B /A和B相加,等于4b0111 B-A / B减去A,等于4b0001 F= E*F; / E的F次幂等于16,641 算术操作符,如果操作数的任意一位为x,那么运算结果的全部位为x。这一点是很好理解的:如果一个操作数的值不完全确定,那么结果肯定是未知的。,in1 = 4b101x; in2 = 4b1010; sum = in1 + in2; / sum的计算结果为4bx,641 算术操作符,取模运算的结果是两数相除的余数部分,它同C语言中的取模运算是一样的。举

14、例如下:,133 /结果为1 164 /结果为0 -72 /结果为-1,取第一个操作数的符号 7-2 /结果为+1,取第一个操作数的符号,641 算术操作符,单目操作符+和-操作符也可以作为单目操作符来使用,这时它们表示操作数的正负。单目的+和-操作符比双目操作符具有更高的优先级。,-4 /负4 +5 /正5,在Verilog内部,负数是用其二进制补码来表示的。作者建议读者使用整数或实数来表示负数,而避免使用的格式来表示负数,这是因为它们将被转换为无符号的2的补码形式,这样会产生意想不到的结果。,641 算术操作符,/建议使用整型数和实型数-10/5 /等于-2 /不要使用的形式来表示负数-d

15、10/5 /等于(10的二进制补码)除以5=(232-10)/5 /默认的机器字长为32位 /这样算出的结果不符合一般的预期,容易出错,642逻辑操作符,逻辑操作符包括逻辑与(&)、逻辑或(|)和逻辑非(!)。操作符&和|,是双目操作符,而! 是单目操作符。逻辑操作符执行的规则为: 1逻辑操作符的计算结果是一个1位的值:0表示假,1表示真,x表示不确定;,2如果一个操作数不为0,则等价于逻辑1(真);如果它等于0,则等价于逻辑0(假);如果它的任意一位为x或z,则它等价于x(不确定),而且仿真器一般将其作为假来处理; 3逻辑操作符取变量或表达式作为操作数。 建议读者使用括号来提高代码的可读性,

16、同时应注意操作符之间的优先级。,642逻辑操作符,642逻辑操作符,/逻辑操作符 A=3; B= 0; A&B/等于0。相当于(逻辑值1&逻辑值0) A|B/等于1。相当于(逻辑值1|逻辑值0) !A/等于0。相当于逻辑值1求反 !B/等于1。相当于逻辑值0求反 /有未知值 A=2b0x;B=2b10; A&B/等于x,相当于(x&逻辑值1) /表达式 (a=2)&(b=3)/如果a=2和b=3都成立,则等于逻辑值1/只要两个中有一个不成立,则等于逻辑值0,643 关系操作符,关系操作符包括大于()、小于(=)和小于等于(=)。如果将关系操作符用于一个表达式中,则如果表达式为真,结果为1;如果

17、表达式为假则结果为0;如果操作数中某一位为未知或高阻抗z,那么取表达式的结果为x。这些操作符的功能和C语言中操作符的功能是相同的。,643 关系操作符,/A=4, B=3 /X=4b1010, Y=4b1101, Z=4b1xxx AB /等于逻辑值1 Y=X /等于逻辑值1 YZ /等于逻辑值x,644等价操作符,等价操作符包括逻辑等(= =)、逻辑不等(!=)、case等(= = =)和case不等(!= =)。当用于表达式中时,如果运算结果为真,则返回逻辑值1,否则返回0。这些操作符对两个操作数进行逐位比较;如果两个操作数位宽不相等,则使用0来填充那些不存在的位(填充左边)。表62列出了

18、这些操作符。,644等价操作符,表62等价操作符,注意,逻辑等价操作符和case等价操作符是不同的。对于逻辑等价操作符,如果操作数的某位为x或z,则结果为x;而case等价操作符必须包括x和z进行逐位的精确比较,只有在两者完全相等的情况下,结果才会为1,否则结果为0。case等价操作符产生的结果肯定不会为x。,644等价操作符,/A=4, B=3/X=4b1010,Y=4b1101/Z=4b1xxz,M=4b1xxz,N=4b1xxxA=B /结果为逻辑值0X!=Y /结果为逻辑值1X= =Z /结果为逻辑值x Z= = =M /结果为逻辑值1(所有的位都一致,包括x和z) Z = = = N

19、 /结果为逻辑值0(最低位不一致) M != =N /结果为逻辑值1,case等(= = =),逻辑等(= =),不同,645按位操作符,按位操作符包括取反()、与(&)、或(|)、异或()和同或(,)。按位操作符对两个操作数中的每一位进行按位操作。如果两个操作数的位宽不相等,则使用0来向左扩展较短的操作数,使两个操作数的位宽相等。,645按位操作符,表63 按位操作符的真值表,645按位操作符,/ X = 4b1010, Y = 4b1101 / Z = 4b10x1 X /取反。结果为:4b0101 X & Y /按位与。结果为:4b1000 X|Y /按位或。结果为:4b1111 X Y

20、 /按位异或。结果为:4b0111 X Y /按位同或。结果为:4b1000 X & Z /按位与。结果为:4b10x0,645按位操作符,注意,按位操作符,&和|与逻辑操作符!,&和|是完全不同的。逻辑操作符执行逻辑操作,运算的结果是一个逻辑值0,1或x;按位操作符产生一个跟较长位宽操作数等宽的数值,该数值的每一位都是两个操作数按位运算的结果。,/ X=4b1010, Y=4b0000 X|Y /按位操作,结果为4b1010 x|Y /逻辑操作,等价于1|0,结果为1,2如果一个操作数不为0,则等价于逻辑1(真);如果它等于0,则等价于逻辑0(假);如果它的任意一位为x或z,则它等价于x(不

21、确定),而且仿真器一般将其作为假来处理;,646 缩减操作符,缩减操作符包括缩减与(&)、缩减与非(&)、缩减或(|)、缩减或非(|)、缩减异或()和缩减同或(,)。缩减操作符只有一个操作数,它对这个向量操作数逐位进行操作,产生一个一位的结果。它们的运算规则与645节中给出的运算规则相同,两者的区别在于按位操作符对两个操作数的对应位进行运算,而缩减操作符对一个操作数的所有位逐位地从左至右进行运算。缩减与和缩减与非、缩减或和缩减或非、缩减异或和缩减同或的计算结果恰好相反。,646 缩减操作符,/ X = 4b1010 &X /相当于结果为1&0&1&0,结果为1b0 |x /相当于1|0|1|0

22、,结果为1b1 X /相当于1010,结果为1b0 /缩减xor(异或)或缩减xnor(同或)可以用来产生一个向量的奇偶校验位,缩减操作符只有一个操作数,它对这个向量操作数逐位进行操作,产生一个一位的结果。,缩减操作符对一个操作数的所有位逐位地从左至右进行运算,647 移位操作符,移位操作符包括右移()、左移()。普通移位操作符的功能是将向量操作数向左或向右移动指定的位数,因此它的两个操作数分别是要进行移位的向量(操作符左侧)和移动的位数(操作符右侧)。当向量被移位之后,所产生的空余位使用0来填充,而不是循环(首尾相连)移位。算术移位操作符则根据表达式的内容来确定空余位的填充值,647移位操作

23、符,/ X = 4b1100 Y=X 1; / Y是4b0110,右移一位,最高位用0填充 Y=X 3); /结果为-2,由于算术移位的缘故,右移三位,空缺位填1,算术移位操作符则根据表达式的内容来确定空余位的填充值,1101,648 拼接操作符,使用拼接操作符(,)可以将多个操作数拼接在一起,组成一个操作数。拼接操作符的每个操作数必须是有确定位宽的数,这是由于为了确定拼接结果的位宽,必须知道每个操作数的位宽,因此无位宽的数不能作为拼接操作符的操作数。,648 拼接操作符,/A=1b1, B=2b00, C=2b10, D=3b110 Y=B, C /结果为4b0010 Y=A,B,C,D,3

24、b001 /结果为11b10010110001 Y=A,B0,C1 /结果为3b101,拼接操作符的用法是将各个操作数用大括号括起来,之间用逗号隔开。操作数的类型可以是变量线网或寄存器、向量线网或寄存器、位选、域选和有确定位宽的常数。,649重复操作符,如果需要多次拼接同一个操作数,则可以使用重复操作符;重复拼接的次数用常数来表示,该常数指定了其后大括号内变量的重复次数。,reg A; reg 1:0 B, C; reg 2:0 D; A=1b1; B=2b00; C=2b10; D=3b110; Y= 4A /结果为4b1111 Y= 4A , 2B ) /结果为8b11110000 Y=

25、4A , 2B , C /结果为10b1111000010,6410条件操作符,条件操作符(?:)带有三个操作数: 用法:condition_expr ? true_expr:false_expr;即,条件表达式? 真表达式:假表达式; 执行过程为:首先计算条件表达式(condition_expr),如果为真(即逻辑1),则计算“真表达式”(true_expr);如果为假(即逻辑0),则计算“假表达式”(false_expr);如果为不确定x,则两个表达式都进行计算,然后对两个结果进行逐位比较。如果相等,则结果中该位的值为操作数中该位的值;如果不相等,则结果中该位的值取x。,6410条件操作符

26、,条件表达式的作用类似于多路选择器;另外可以用if-else语句来替代条件表达式,不能用if-else在连续赋值语句中替代条件操作符,只能在块语句中替代。-译者注,6410条件操作符,条件操作符经常用于数据流建模中的条件赋值,条件表达式的作用相当于控制开关。举例如下,/三态缓冲器的功能建模 assign addr_bus=drive_enable?addr_out:36bz; /二选一多路选择器的功能建模 assign out=control ? in1:in0;,in1,in0,control,out,drive_enable,addr_out,36bz,6410条件操作符,条件操作符可以嵌

27、套使用,每个“真表达式”和“假表达式”本身也可以是一个条件表达式。在下面的例子中,“A=3”和“control”是四选一多路选择器的两个控制输入,x,y,m,n为输入,out为输出。,assign out=(A=3)?(control?x:y):(control ?m:n);,门级多路选择器,6410条件操作符,assign out=(A=3)?(control?x:y):(control?m:n);,y,x,m,n,out,6411 操作符的优先级,表64 操作符的优先级,6411 操作符的优先级,续表,6.5 举例,6 51 四选一多路选择器,方法1:使用逻辑等式,/用数据流描述的四选一多

28、路选择器模块,采用了逻辑方程 /用来与门级描述的模型进行比较 module mux4_to_1 (out, i0, i1, i2, i3, s1, s0); /来自于输入/输出图的端口声明 output out; input i0, i1, i2, i3; input s1, s0; /产生输出out的逻辑方程 assign out = (s1 endmodule,方法2:使用条件操作符,/用数据流描述的四选一多路选择器模块,利用了条件操作语句 /用来与门级描述的模型进行比较 module mux4_to_1 (out, i0, i1, i2, i3, s1, s0); /来自于输入/输出图的

29、端口声明 output out; input i0, i1, i2, i3; input s1, s0; /采用嵌套的条件操作语句 assign out =s1?(s0? i3 :i2):(s0 ? i1 :i0) ; endmodule,(s1 ,652 四位全加器,方法1:数据流操作符,/用数据流语句定义四位全加器 module fulladd4(sum, c_out, a, b, c in); /输入/输出端口声明 output 3:0 sum; output c_out; input3:0 a, b; input c_in; /指定全加器的功能 assign c_out, sum =

30、a + b + c_in; endmodule,方法2:带超前进位的全加器,在脉动进位加法器中,在输出端得到最终结果值之前,进位信息必须通过门来逐级传递。一个n位的脉动进位加法器总共具有2n级门。如果n值较大,那么进位传递所需的时间会对电路的运算速度产生严重的影响。为了克服这个缺点,现在通常使用超前进位的方法来减少延迟时间。通过使用这种方法,可以将延迟减少到四级门延迟,而与总的门的级数无关。读者可以在有关逻辑设计的书籍中找到完成超前进位的逻辑等式。我们在例6.5中给出了超前进位加法器的Verilog描述。在仿真环境中可以使用这一模块代替先前的门级模块,仿真环境中的其他模块无需改变,仿真结果保持

31、一致。,方法2:带超前进位的全加器,module fulladd4(sum, c_out, a, b, c in); /输入和输出端口声明 output 3:0 sum; output c_out; input 3:0 a,b; input c_in; /内部连线 wire p0,g0, p1,g1, p2,g2, p3,g3; wire c4, c3, c2, cl; /计算每一级的p assign p0 = a0 b0,p1 = a1 b1,p2 = a2 b2,p3 = a3 b3; /计算每一级的g assign g0 = a0 /计算每一级的进位 /注意:在计算超前进位的算术方程中c

32、_in等于c0,assign c1 = g0 | (p0 endmodule,完成超前进位的逻辑等式,assign p0 = a0 b0,p1 = a1 b1,p2 = a2 b2,p3 = a3 b3;,assign g0 = a0 ,assign c1=g0|(p0,在计算超前进位的算术方程中c_in等于c0,653 脉动进位计数器,653 脉动进位计数器,例6.6 脉动计数器的Verilog描述,/脉动计数器 module counter(Q , clock, clear); /输入/输出端口 output 3:0 Q; input clock, clear; /调用(实例引用)T触发器

33、 T_FF tff0(Q0, clock, clear); T_FF tff1(Q1, Q0, clear); T_FF tff2(Q2, Q1, clear); T_FF tff3(Q3, Q2 , clear); endmodule,例6.7 T触发器的Verilog描述,/边沿触发的T触发器,每个时钟周期翻转一次 module T_FF(q, clk, clear); /输入/输出端口 output q; input clk, clear; /调用(实例引用)边沿触发的D触发器 /输出q取反后反馈到输入 /注意D触发器的Qbar端口不需要,让它悬空 edge_dff ff1(q, ,q,

34、 clk, clear); endmodule,例6.8 边沿触发的D触发器的Verilog描述,/边沿触发的D触发器 module edge_dff(q, qbar, d, clk, clear); /输入/输出端口声明 output q,qbar; input d, clk, clear; /内部变量 wire s, sbar, r, rbar, cbar; /数据流声明语句 /生成clear的反相信号 assign cbar = clear; /输入锁存;锁存器是电平敏感的。边沿触发的寄存器由三个SR锁存器组成 assign sbar = (rbar endmodule,always (

35、posedge reset or negedge clk) if (reset) q = 1b0; else q = d;,/顶层激励块 module stimulus; /声明产生激励输入的变量 reg CLOCK, CLEAR; wire 3:0 Q; initial$monitor($time,“Count Q=%b Clear= %b“, Q3:0,CLEAR); /调用(实例引用)已经设计的模块counter counter cl(Q, CLOCK, CLEAR); /产生清零(CLEAR)激励信号 initial beginCLEAR = 1b1;#34 CLEAR = 1b0;#

36、200 CLEAR = 1b1;#50 CLEAR = 1b0; end /产生时钟信号,每10个单位时间翻转一次,例69 脉动计数器的激励块,initial beginCLOCK = 1b0;forever #10 CLOCK = CLOCK; end /在时间单位为400时刻结束仿真 initial begin#400 $finish; end endmodule,下面列出了仿真结果,注意清零信号reset对count进行了复位。 0 Count Q = 0000 Clear= 1 34 Count Q = 0000 Clear= 0 40 Count Q = 0001 Clear= 0

37、60 Count Q = 0010 Clear= 080 Count Q = 0011 Clear= 0 100 Count Q = 0100 Clear= 0 120 Count Q = 0101 Clear= 0 140 count Q = 0110 Clear= 0 160 Count Q = 0111 Clear= 0 180 count Q = 1000 Clear= 0 200 Count Q = 1001 Clear= 0 220 Count Q = 1010 Clear= 0 234 Count Q = 0000 Clear= 1 284 Count Q = 0000 Clea

38、r= 0 300 Count Q = 0001 Clear= 0 320 Count Q = 0010 Clear= 0 340 Count Q = 0011 Clear= 0 360 Count Q = 0100 Clear= 0 380 Count Q = 0101 Clear= 0,66 小结,连续赋值是数据流建模的主要语法结构。连续赋值总是处于有效(active)状态,即任一操作数的变化都会立即导致对表达式的重新计算。连续赋值语句的左侧值(赋值目标)必须是线网类型的变量或其连接。任何逻辑功能都能够使用连续赋值语句来完成。 延迟值用于控制右侧变量的改变和语句左侧被赋予新值之间的时间间隔。

39、线网的(赋值)延迟可以通过assign语句、隐式连续赋值和线网声明三种方法来实现。 赋值语句包含表达式、操作符和操作数。 操作符的类型包括算术、逻辑、关系、等价、按位、缩减、移位、拼接、重复和条件。单目、双目和三目操作符分别具有一个、两个和三个操作符,而拼接操作符可以具有任意多个操作符。,66 小结,条件操作符的功能类似硬件中的多路选择器或软件编程语言中的if-then-else语句。 电路的数据流级描述要比门级描述简明。在第5章中讨论的四选一多路选择器和四位全加器同样可以用数据流语句来实现。在本章中,我们使用两种方法重新设计了这两个电路。此外我们还使用负沿触发的D触发器设计了一个四位脉动计数

40、器。,67 习题,1一个全减器具有三个一位输入:x,y和z(前面的借位),两个一位输出D(差)和B(借位)。计算D和B的逻辑等式如下所示:D=x. y. z +x.y. z + x. y. z +x. y. zB=x.y+x.z+y.z根据上面的定义写出Verilog描述,包括I/O端口(注意:逻辑等式中的+对应于数据流建模中的逻辑或(|)操作符)。编写激励块,在模块中实例引用全减器。对x,y和z这三个输入的8种组合及其对应的输出进行测试。,module fullsub(B, D, x, y, z);output B, D; input x, y, z;/Compute D and Bassi

41、gn D = (x endmodule,module stimulus; reg x, y, z; wire B, D; fullsub SUB(B, D, x, y, z); initial$monitor($time,“ x = %b, y = %b, z = %b, B = %b, D = %b“,x, y, z, B, D); initial beginx = 0; y = 0; z = 0;# 10 x = 0; y = 0; z = 1;# 10 x = 0; y = 1; z = 0;# 10 x = 0; y = 1; z = 1;# 10 x = 1; y = 0; z =

42、0;# 10 x = 1; y = 0; z = 1;# 10 x = 1; y = 1; z = 0;# 10 x = 1; y = 1; z = 1; end endmodule,2大小比较器的功能是比较两个数之间的关系:大于、小于或等于。一个四位大小比较器的输入是两个四位数A和B。我们可以将它们写成下面的形式,最左边的位为最高有效位:A=A(3)A(2)A(1)A(0)B=B(3)B(2)B(1)B(0) 两个数的比较可以从最高有效位开始,逐位进行。如果两个位不相等,则该位值为0的数为较小的数。为了用逻辑等式实现这个功能,我们需要定义一个中间变量x。注意下面实现的是同或(xnor)的功能

43、。x(i)=A(i)B(i)+A(i)B(i) 大小比较器的三个输出为:A_gt_B,A_lt_B和A_eq_B。其计算公式为: A_gt_B = A(3). B(3) + x(3). A(2). B(2) + x(3). x(2). A(1). B(1) + x(3). x(2). x(1). A(0). B (0) A_lt_B = A(3). B(3)+ x(3). A(2).B(2)+x(3).x(2).A(1). B(1) + x(3). x(2). x(1). A(0). B(0) A_eq_B = x (3). x (2). x (1). x (0) 写出模块magnitude_

44、comparator的Verilog描述。写出激励模块并在模块中实例引用magnitude_comparator模块。选择A和B的几种组合,对模块的功能进行测试。,module magnitude_comparator(A,B, A_gt_B, A_lt_B, A_eq_B); /Output and Input ports output A_gt_B, A_lt_B, A_eq_B; input 3:0A,B; wire 3:0x; /comparator A and B assign x3=(A3 endmodule,module stimulus; reg A_eq_B , A_gt_B

45、,A_lt_B ; reg 3:0A, B; magnitude_comparator o1(A,B, AgtB, AltB, AeqB); initial$monitor($time,“AeqB=%b, AgtB=%b, AltB= %b, A=%d, B=%d“,AeqB , AgtB , AltB , A,B); initial beginA=0; B=0; # 10 A=1; B=0;# 10 A=0; B=1; #10 $finish;end endmodule,3一个同步计数器可以使用主从JK触发器来设计。设计一个同步计数器,其逻辑图和JK触发器的逻辑图如图65和图66所示。清零信

46、号clear低电平有效,输入数据在时钟信号clock的上升沿被锁存,触发器在clock的下降沿输出;当count_enable信号为低电平时停止计数。写出同步计数器的Verilog描述和激励模块,在激励模块中使用clear和count enable对计数器进行测试,并显示输出计数Q3:0。,图65 主从JK触发器,图66 四位带清零端和计数使能端的同步计数器,module JK_dff(q,qbar,J,K,clock,clear); output q,qbar; input J,K,clock,clear; wire a,b,c,d,y,ybar,cbar; assign cbar=cloc

47、k; assign a=(J endmodule,module counter(q , clock, clear,countable); output 3:0 q; input clock, clear,countable; wire countable1,countable2,countable3; assign countable1=q0 endmodule,module stimulus; reg clock, clear,countable; wire 3:0 q; initial$monitor($time,“Count q=%b Clear= %b countable= %b“, q3:0,clear,countable); counter cl(q , clock, clear,countable); initial begincountable=1;clear = 1b0;#34 clear = 1b1;#300 clear = 1b0;#50 clear = 1b1; end initial beginclock = 1b0;forever #10 clock = clock; end initial begin#450 $finish; end endmodule,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报