一、译码器的学习
译码器定义:简单来说就是将输入的二进制代码状态翻译成输出信号,以此来表示原来的含义的电路。译码器可以分为两大类
(1)变量译码
输入n个则最多输出为2的n次方个,比如38译码器,输入为2,则输出最多为2的3次方,即为8
(2)显示译码
将对应的二进制代码转换为7段码,一般用于驱动led或者lcd
1.其过程和之前的类似,先建立四个文件夹,然后绘制visio波形,编写代码等过程不在赘述,参考前面
代码可以用if-else语句来实现也可以用case语句来实现,两者区别比较大,第一种生成的rtl电路比较复杂,占用很大的内存。而第二种使用case语句电路简单并且占用资源较小
2.程序
程序文件
module decoder
(
input wire in1,
input wire in2,
input wire in3,
output reg [7:0] out
);
always@(*)
case({in1,in2,in3})
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;
default: out = 8’b0000_0000;
endcase
endmodule
测试文件
`timescale 1ns/1ns
module tb_decoder();
reg in1;
reg in2;
reg in3;
wire[7:0] out;
initial
begin
in1 <= 1’b0;
in2 <= 1’b0;
in3 <= 1’b0;
end
always #10 in1 <= {KaTeX parse error: Expected 'EOF', got '}' at position 7: random}̲ % 2; always #1…random} % 2;
always #10 in3 <= {$random} % 2;
initial
begin
$timeformat(-9,0,“ns”,6);
m
o
n
i
t
o
r
(
"
@
t
i
m
e
monitor("@time %t:in1=%b,in2=%b,in3=%b,out=%b",
monitor("@timetime,in1,in2,in3,out);
end
decoder decoder_inst
(
.in1(in1),
.in2(in2),
.in3(in3),
.out(out)
);
endmodule
二、半加器
半加器定义:半加器电路是指对两个输入数据位相加,输出一个结果位和进位,没有进位输入的加法器电路。是实现两个一位二进制数的加法运算电路。
全加器是在半加器的基础上的升级版,除了加数和被加数加和外还要加上上一级传进来的进位信号。
1.visio分析视图
2.代码
程序代码
module half_adder
(
input wire in1,
input wire in2,
/*
output reg sum,
output reg count
*/
output wire sum,
output wire count
);
assign {count,sum} = in1 + in2;
/*
always@(*)
case({in1,in2})
2’b00: {sum,count} = 2’b00;
2’b01: {sum,count} = 2’b10;
2’b10: {sum,count} = 2’b10;
2’b11: {sum,count} = 2’b01;
default:{sum,count} = 2’b00;
endcase
*/
/* 与上一种情况一样
always@(*)
case({in1,in2})
2’b00:begin sum=0;count=0; end
2’b01:begin sum=1;count=0; end
2’b10:begin sum=1;count=0; end
2’b11:begin sum=0;count=1; end
default:begin sum=0;count=0; end
endcase
*/
endmodule
测试代码
`timescale 1ns/1ns
module tb_half_adder ();
reg in1;
reg in2;
wire sum;
wire count;
initial
begin
in1 <= 1’b0;
in2 <= 1’b1;
end
always #10 in1 <= (KaTeX parse error: Expected 'EOF', got '#' at position 21: …m) %2; always #̲10 in2 <= (random) %2;
initial
begin
$timeformat(-9,0,“ns”,6);
m
o
n
i
t
o
r
(
"
@
t
i
m
e
monitor("@time %t:in1=%b,in2=%b,sum=%b,count=%b",
monitor("@timetime,in1,in2,sum,count);
end
half_adder half_adder_inst
(
.in1(in1),
.in2(in2),
.sum(sum),
.count(count)
);
endmodule
三、modelsim技巧
1.在波形图界面上,输入输出信号带路径,比较难以区分,可以去掉路径。只显示信号名称
2.modelsim窗口混乱问题,可以按照下面的步骤,对窗口进行一键还原
3.在波形窗口界面可以将测试模块与模块的波形同时显示在上面,
4.测试文件和模块都在波形界面上,但是比较容易混淆,可以多两者进行分组区分,只需要选中想要分组的选项,然后按下快捷键ctrl+g即可完成分组