目录
1.38译码器概述
2.VIVADO步骤
2.1创建工程,添加源文件
2.2添加仿真文件,并进行仿真
2.3添加管脚约束
2.4生成bit文件
2.5 烧录程序
3.实验结果
1.38译码器概述
即三个输入A2A1A0,输出的十进制数,例如LHL(010)=2,即Y2非为低电平,其他都为高电平。等价于Y2为高电平,其他都为低电平。
2.VIVADO步骤
2.1创建工程,添加源文件
decoder_3_8代码:
module decoder_3_8(
A2,
A1,
A0,
Y0,
Y1,
Y2,
Y3,
Y4,
Y5,
Y6,
Y7
);
input A2;
input A1;
input A0;
output Y0;
output Y1;
output Y2;
output Y3;
output Y4;
output Y5;
output Y6;
output Y7;
reg Y0; reg Y1; reg Y2; reg Y3;
reg Y4; reg Y5; reg Y6; reg Y7;
always@(*)
begin
case({A2,A1,A0})
3'b000:{Y7,Y6,Y5,Y4,Y3,Y2,Y1,Y0 }= 8'b0000_0001;
3'b001:{Y7,Y6,Y5,Y4,Y3,Y2,Y1,Y0 }= 8'b0000_0010;
3'b010:{Y7,Y6,Y5,Y4,Y3,Y2,Y1,Y0 }= 8'b0000_0100;
3'b011:{Y7,Y6,Y5,Y4,Y3,Y2,Y1,Y0 }= 8'b0000_1000;
3'b100:{Y7,Y6,Y5,Y4,Y3,Y2,Y1,Y0 }= 8'b0001_0000;
3'b101:{Y7,Y6,Y5,Y4,Y3,Y2,Y1,Y0 }= 8'b0010_0000;
3'b110:{Y7,Y6,Y5,Y4,Y3,Y2,Y1,Y0 }= 8'b0100_0000;
3'b111:{Y7,Y6,Y5,Y4,Y3,Y2,Y1,Y0 }= 8'b1000_0000;
default:{Y7,Y6,Y5,Y4,Y3,Y2,Y1,Y0 }= 8'b0000_0000;
endcase
end
endmodule
2.2添加仿真文件,并进行仿真
凡是always这种语句块中要修改值的信号一律用reg类型。为什么test bench不需要端口声明,因为在仿真里面已经形成了闭环,不需要输入输出。代码如下:
`timescale 1ns / 1ps
module decoder_3_8_tb( );
reg A2;reg A1;reg A0;
wire Y0; wire Y1; wire Y2; wire Y3;
wire Y4; wire Y5; wire Y6; wire Y7;
decoder_3_8 decoder_3_8_inst0(
.A2(A2),
.A1(A1),
.A0(A0),
.Y0(Y0),
.Y1(Y1),
.Y2(Y2),
.Y3(Y3),
.Y4(Y4),
.Y5(Y5),
.Y6(Y6),
.Y7(Y7)
);
initial begin
A2=0;A1=0;A0=0;
#20;
A2=0;A1=0;A0=1;
#20;
A2=0;A1=1;A0=0;
#20;
A2=0;A1=1;A0=1;
#20;
A2=1;A1=0;A0=0;
#20;
A2=1;A1=0;A0=1;
#20;
A2=1;A1=1;A0=0;
#20;
A2=1;A1=1;A0=1;
#20;
$stop;
end
endmodule
$stop的作用是停止仿真,不然会像二选1数据选择器仿真一样,后面仿真波形如下,与预期一致。
有时候这样看起很麻烦,直接将输入信号合成一个。
2.3添加管脚约束
在RTL ANALYSIS下添加I/O口。硬件上SW0~SW2,代表A0~A2,Y0~Y7代表LED0~LED1。
2.4生成bit文件
点击 Generate Bitstream,等待右上角出现write_bitstream Complete
2.5 烧录程序
3.实验结果
1.SW2,SW1,SW0=000,LED0灯亮,其他灯灭。
2.SW2,SW1,SW0=110=6,LED6亮,其他灯灭。