文章目录
一.实验1
安装配置Quartus和ModelSim软件后,首先使用Logsim绘制一个3-8译码器电路图,列出3-8译码器的逻辑真值表。然后采用Verilog编程(if-else或者case)设计一个3-8译码器,生成RTL原理电路图;编写一个仿真测试文件,对3-8译码器进行仿真测试,输出测试波形图和Transcript结果
logsim 3-8译码器电路图
Verilog【if-else 语句实现】
module my_3_8_tb (in_data,out_data);
input wire [2:0] in_data;
output reg [7:0] out_data;
always @(*)
begin
if (in_data==3'b000) out_data<=8'b1111_1110;
else if (in_data==3'b001) out_data<=8'b1111_1101;
else if (in_data==3'b010) out_data<=8'b1111_1011;
else if (in_data==3'b011) out_data<=8'b1111_0111;
else if (in_data==3'b100) out_data<=8'b1110_1111;
else if (in_data==3'b101) out_data<=8'b1101_1111;
else if (in_data==3'b110) out_data<=8'b1011_1111;
else out_data<=8'b0111_1111;
end
endmodule
RTL仿真图
真值表
In | Out |
---|---|
000 | 10000000 |
001 | 01000000 |
010 | 00100000 |
011 | 00010000 |
100 | 00001000 |
101 | 00000100 |
110 | 00000010 |
111 | 00000001 |
问题讨论
1.Verilog 综合生成的3-8译码器电路原理图与原始设计电路存在什么差异? 仿真测试生成的结果是否与真值表一致?
答:Verilog综合生成的3-8译码器电路原理图与原始设计电路之间存在一些差异。综合工具会根据所选择的逻辑元件库和优化策略,对原始设计进行优化和重新映射,也会对输入的逻辑进行优化,合并重复的逻辑、消除冗余逻辑,因此会产生差异;仿真测试生成的结果与真值表一致。
2.Verilog代码设计的3-8译码器模块的输出信号 为何要定义为 reg类型而不用默认wire(导线)类型?改成wire型是否可以?
答:reg
类型表示可写寄存器,在Verilog中用于表示存储状态和数据的变量。3-8译码器的输出信号通常需要由内部逻辑进行计算并存储,然后通过寄存器的方式进行输出。因此,使用reg
类型可以更好地描述这种行为,并使代码更易于理解。wire
类型表示连续赋值型导线,用于连接模块之间的信号传输。尽管可以使用wire
类型定义3-8译码器的输出信号,但是这样定义的信号将被作为纯连接,可能无法进行内部逻辑计算或存储状态。
二.实验2
在logsim中完成的 “1位全加器”和“4位全加器”逻辑门电路
1)然后用Verilog的门级描述方式写一个“1位全加器”, 生成RTL电路,与Logsim的“1位全加器”进行对比。
2)采用Verilog模块调用子模块的方式,用4个上面的“1位全加器”级联方式,构成一个“4位全加器”(即串行全加器),生成RTL电路,与Logsim的“4位全加器”电路进行对比;
3)采用Verilog设计一个8位全加器模块。
logsim1位全加器
Verilog1位全加器
代码
module quanjia (a,b,cin,cout,sum);
input a,b;
input cin;
output cout;
output sum;
wire [2:0] w;
and
a1(w[0],a,cin),
a2(w[1],a,b),
a3(w[2],b,cin);
xor a4(sum,a,b,cin);
or a5(cout,w[0],w[1],w[2]);
endmodule
RTL视图
波形图
Verilog中调用子模块的方式4位全加器
module quanjia4 (a,b,cin,cout,sum);
input [3:0] a,b;
input cin;
output cout;
output [3:0] sum;
wire [3:1] c;
quanjia u1 (a[0],b[0],cin,c[1],sum[0]);
quanjia u2 (a[1],b[1],c[1],c[2],sum[1]);
quanjia u3 (a[2],b[2],c[2],c[3],sum[2]);
quanjia u4 (a[3],b[3],c[3],cout,sum[3]);
endmodule
Verilog中8位全加器
module quanjia8(a,b,cin,cout,dout);
input [7:0] a,b;
input cin;
output {7:0} dout;
output cout;
assign {cout,dout}=a+b+cin;
endmodule