2021-06-28 Verilog HDL 高级数字设计(第二版)p159 例6.16

一、实验要求:用Modlsim进行设计仿真实验
二、实验内容
1、实验书本及实验题目:电子书Verilog HDL 高级数字设计(第二版)p159 例6.16
2、例6.16模块or4_behav描述了一个4输入或门。具有周期性行为的算法将输出初始化为0,然后依次测试输入。若输入为1,则设置输出为1并终止测试。该描述被综合为组合逻辑。综合过程去掉了循环变量k,实际中也没有相应的计数硬件。应该注意的是,输出变量y被声明为寄存器变量,但是并没有被综合为存储元件。现在再分析一下or4_ behaw_ latch 模块的描述,它的事件控制表达式对x_ in[0]信号不敏感,这就会无意地综合出锁存输出一忽略x_ in[0]信号的变化导致隐含了一个锁存功能,电路仅在x_ in[3:1]信号变化时才激活周期性行为,并给输出赋值。
模块or4 behav 和or4 behav_ latch 的实现电路如图(a,b)所示。在or4_ behav_latch 模块中x_ in[0]的值被锁存,锁存器由x_ in[1],x_ in[2],x_ in[3]的或值来控制。当三者中任何一个输入为1时, x_ in[0]将传递到或门得到y。如果三者的值都变为0,则x_ in[0]将被锁存, y不受x_ in[0]变化的影响。在这里插入图片描述
三、实验综合要点:组合逻辑的Verilog描述给输出赋值时,必须考虑所有可能的输入值。当一个case语句或if语句没有对所有可能的输人值指定输出时,即未完整定义的case或if语句,可能会生成非预期的锁存器。(例如,在未定义的输人条件下,输出将保持原值。)不管是显式地说明还是用default条件说明,必须保证case和条件分支(if)语句是完整的。如果在一个连续赋值语句中,与条件操作符相联系的表达式把目标变量(表达式的左边项)赋给它本身,该语句将综合出一一个锁存器,但是不完整的条件操作符将会引发语法错误。

四、实验注意事项:(1)为了避免实现的逻辑中产生锁存,在赋值表达式的右逻辑发生变化的所有情况下,都必须给行为中包含的所有变量进行赋值。如果不这么做,则会在生成的设计中产生不希望的锁存。因此,所有用以实现组合逻辑的电平敏感行为电路的输入信号,都必须包含于事件控制表达式中。行为中赋值语句右边的操作数就是输入信号。同样,在行为中其变化会影响到目标寄存器变量赋值的任何控制信号,都应被认为是该行为的输入信号。
(2)记住如果一个电平敏感行为的敏感表不完整,一些变量就不会在输入信号的所有状况下被赋值,也就意味着需要存储器来实现。实际上,由于不完整的敏感表带来的风险如此巨大, HDL语言增加了一个通配符“*”来隐含形成一个完整的敏感表。在电平敏感行为的敏感表中可以使用@( * )和@*的形式,以代替设计者逐个填写敏感信号的烦琐工作。
在电平敏感周期性行为中,赋值语句的右表达式中任意信号都不再出现于其左表达式中。如果忽略这条规则,则行为中隐含了反馈并会综合出锁存器,而不再是无反馈的组合逻辑。
五、实验工具
pc机、moelsim软件等
五、实验视频

实验三

六、实验仿真图在这里插入图片描述
七、实验代码
module or4_behav #(parameter word_length = 4)(
output reg y, input [word_length-1:0] x_in);
integer k;
always @x_in begin:check_for_1
y=0;
for(k=0;k<=word_length-1;k=k+1)
if(x_in[k] == 1)begin
y=1;
disable check_for_1;
end
end
endmodule

module or4_behav_latch #(parameter word_length = 4)(
output reg or4, input [word_length - 1 : 0] x_in);
integer k;
always @(x_in[3:1]) begin:check_for_1
or4=0;
for(k=0;k<=word_length-1;k=k+1)
if(x_in[k] == 1)begin
or4=1;
disable check_for_1;
end
end
endmodule
测试代码
`timescale 1 ps/ 1 ps
module tb_or4;
reg [3:0] x_in;
wire y_behav;
wire y_latch;
reg y_gate;
or4_behav_latch latch(.x_in(x_in),.or4(y_latch));
or4_behav behav(.x_in(x_in),.y(y_behav));
initial
begin
x_in[3:0]=4’b0000;
#5 x_in=4’b1000;
#5 x_in=4’b1010;
#5 x_in=4’b0001;
#5 x_in=4’b0000;
#5 x_in=4’b0001;
#5 x_in=4’b1000;
#5 x_in=4’b1100;
#5 x_in=4’b0000;
#5 x_in=4’b0001;
#5 x_in=4’b0000;
#5 x_in=4’b0001;
#20 $stop;
end
always@(x_in[3:1])
if(x_in[1] | x_in[2] | x_in[3] )
y_gate = 1’b1;
else
y_gate = 1’b0;
endmodule

九、软件下载地址
Modelsim 10.x软件下载链接:https://pan.baidu.com/s/1PoKk4W_SG7Zqp9KNuwLdTQ
提取码:m7ja

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值