Verilog编程基础练习

一、制作3-8译码器

1、使用Logsim绘制一个3-8译码器电路图

请添加图片描述

2、列出3-8译码器的逻辑真值表。

输入输出
abcout
0000000_0001
0010000_0010
0100000_0100
0110000_1000
1000001_0000
1010010_0000
1100100_0000
1111000_0000

3、然后采用Verilog编程设计一个3-8译码器

代码如下:

module D3_8( 
	a, 
	b, 
	c, 
	out 
);
input a; //输入端口a 
input b; //输入端口b 
input c; //输入端口c 
output [7:0]out;//输出端口out 
 
reg [7:0]out; 
always@(a,b,c)
begin 
	case({a,b,c}) 
	3'b000:out = 8'b0000_0001; 
	3'b001:out = 8'b0000_0010; 
	3'b010:out = 8'b0000_0100; 
	3'b011:out = 8'b0000_1000; 
	3'b100:out = 8'b0001_0000; 
	3'b101:out = 8'b0010_0000; 
	3'b110:out = 8'b0100_0000; 
	3'b111:out = 8'b1000_0000; 
	endcase 
end
endmodule

4、生成RTL原理电路图

请添加图片描述

5、编写一个仿真测试文件

timescale 1ns/1ns

 module three_to_eight_tb();
 reg  a;
 reg  b;
 reg  c;
 wire   [7:0]   out;
 initial    begin
    a <= 1'b1;
    b <= 1'b0;
    c <= 1'b1;
 end
 //a:产生随机数,模拟 a 的输入情况
 always #10 a <= {$random} % 2;
 //b:产生随机数,模拟 b 的输入情况
 always #10 b <= {$random} % 2;
 //c:产生随机数,模拟c 的输入情况
 always #10 c <= {$random} % 2;
 initial begin
    $timeformat(-9, 0, "ns", 6);
    $monitor("@time %t:a=%b b=%b c=%b out=%b",$time,a,b,c,out);
 end
 three_to_eight three_to_eight_ins
 (
    .a(a), 
    .b(b),
    .c(c),
    .out(out)
 );
 endmodule

6、仿真波形分析

RTL 代码设计完成后,按照流程编写 Testbench,然后启动 ModelSim 进行仿真测试验证,同样我们也让波形跑了500ns,通过图所示的波形我们可以观察到,3 个输入的 in 均为任意随机数,所以由 in 组成的 3bit 数据也为随机数,而每个随机数都对一个 out 输出的 8bit 值,我们仔细核对输入 in 和输出 out 之间的对应关系,发现波形中 3 个输入 信号 in 与输出信号 out 之间的对应关系和编写的代码中的译码关系是完全一致的,完全符合我们代码中的逻辑设计。

请添加图片描述

7、问题

1、Verilog 综合生成的3-8译码器电路原理图与原始设计电路存在什么差异? 仿真测试生成的结果是否与真值表一致?

使用不同的技术库或综合设置可能会导致综合工具做出不同的选择,从而产生差异。在Verilog设计中,仿真测试应该与真值表一致。

2、Verilog代码设计的3-8译码器模块的输出信号 为何要定义为 reg类型而不用默认wire(导线)类型?改成wire型是否可以? (即是否可以把 output reg [7:0] out 改为 output [7:0] out) 修改后会出现什么错误?为什么会出错?

在Verilog中,reg类型并不一定表示物理上的寄存器,而是用来表示可以在always块中被赋值的变量。wire类型则用来表示连续赋值的信号,通常与assign语句一起使用,或者用于连接模块的输入输出端口。如果将output reg [7:0] out改为output [7:0] out,并且在代码中使用了always块来赋值,那么在编译时会出现错误,因为只有、reg类型的变量才能在always块中被赋值。

端口。如果将output reg [7:0] out改为output [7:0] out,并且在代码中使用了always块来赋值,那么在编译时会出现错误,因为只有、reg类型的变量才能在always块中被赋值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值