3-8译码器的实现
实验目的
用连续值 或者always语句实现3-8译码器74138
了解3-8译码器的功能,锻炼根据功能表实现硬件功能的能力
熟悉上板操作的步骤和流程
74138的器件手册中的Function Tables:
实验内容
(一)实验流程:
用verilog语言在vivado环境下编写源文件,实现3-8译码器。经综合、实现、生成bitstream文件后,将bit文件下载到NEXYS4 DDR开发板上测试功能(三个指定的拨动开关代表输入,上拨值为1,下拨值为0; 八个指定的led灯代表输出,灯亮代表H高电平1,不亮代表L低电平0。)
(二)verilog代码分析:
1.Design source(.v文件):
module ThrEightymq(
input G1,
input G2A,
input G2B, //Enable
input [2:0]S, //input
output reg [7:0]Y //output
);
wire G2;
assign G2=G2A|G2B;
always@(*)
begin
case({G1,G2})
2'b10:
begin
case(S)
3'b000 : Y = 8'b11111110;
3'b001 : Y = 8'b11111101;
3'b010 : Y = 8'b11111011;
3'b011 : Y = 8'b11110111;
3'b100 : Y = 8'b11101111;
3'b101 : Y = 8'b11011111;
3'b110 : Y = 8'b10111111;
3'b111 : Y = 8'b01111111;
default: Y = 8'b00000000;
endcase
end
default: Y=8'b11111111;
endcase
end
endmodule
.v分析:
①input三个使能信号,G1,G2A,G2B,其中G1为高电平且G2A,G2B均为低电平时,输出有效,输出无效的状态为led灯全亮(全为高电平)。
②input三位的向量S,代表拨动开关输入的真值
③output八位的向量Y,代表led输出的真值
④定义一个wire型变量G2,G2=G2A+G2B;
⑤赋值部分采用了两个case语句嵌套。外层为{G1,G2}的值,当{G1,G2}=2’b10时,即输出有效时,采用case语句,根据输入S的值对reg [7:0] Y赋值。当输出无效时,则将八位的Y每位赋值为1 。
2.Constraints source(.xdc文件)
#Nexys4 Pin Assignments
############################
#On-board Slide Switches #
############################
set_property PACKAGE_PIN J15 [get_ports G1]
set_property IOSTANDARD LVCMOS33 [get_ports G1]
set_property PACKAGE_PIN L16 [get_ports G2A]
set_property IOSTANDARD LVCMOS33 [get_ports G2A]
set_property PACKAGE_PIN M13 [get_ports G2B]
set_property IOSTANDARD LVCMOS33 [get_ports G2B]
set_property PACKAGE_PIN R15 [get_ports S[0]]
set_property IOSTANDARD LVCMOS33 [get_ports S[0]]
set_property PACKAGE_PIN R17 [get_ports S[1]]
set_property IOSTANDARD LVCMOS33 [get_ports S[1]]
set_property PACKAGE_PIN T18 [get_ports S[2]]
set_property IOSTANDARD LVCMOS33 [get_ports S[2]]
#set_property PACKAGE_PIN U18 [get_ports swt[6]]
#set_property IOSTANDARD LVCMOS33 [get_ports swt[6]]
#set_property PACKAGE_PIN R13 [get_ports swt[7]]
#set_property IOSTANDARD LVCMOS33 [get_ports swt[7]]
#set_property PACKAGE_PIN T8 [get_ports swt[8]]
#set_property IOSTANDARD LVCMOS33 [get_ports swt[8]]
#set_property PACKAGE_PIN U8 [get_ports swt[9]]
#set_property IOSTANDARD LVCMOS33 [get_ports swt[9]]
#set_property PACKAGE_PIN R16 [get_ports swt[10]]
#set_property IOSTANDARD LVCMOS33 [get_ports swt[10]]
#set_property PACKAGE_PIN T13 [get_ports swt[11]]
#set_property IOSTANDARD LVCMOS33 [get_ports swt[11]]
#set_property PACKAGE_PIN H6 [get_ports swt[12]]
#set_property IOSTANDARD LVCMOS33 [get_ports swt[12]]
#set_property PACKAGE_PIN U12 [get_ports swt[13]]
#set_property IOSTANDARD LVCMOS33 [get_ports swt[13]]
#set_property PACKAGE_PIN U11 [get_ports swt[14]]
#set_property IOSTANDARD LVCMOS33 [get_ports swt[14]]
#set_property PACKAGE_PIN V10 [get_ports swt[15]]
#set_property IOSTANDARD LVCMOS33 [get_ports swt[15]]
############################
#On-board led #
############################
set_property PACKAGE_PIN H17 [get_ports Y[0]]
set_property IOSTANDARD LVCMOS33 [get_ports Y[0]]
set_property PACKAGE_PIN K15 [get_ports Y[1]]
set_property IOSTANDARD LVCMOS33 [get_ports Y[1]]
set_property PACKAGE_PIN J13 [get_ports Y[2]]
set_property IOSTANDARD LVCMOS33 [get_ports Y[2]]
set_property PACKAGE_PIN N14 [get_ports Y[3]]
set_property IOSTANDARD LVCMOS33 [get_ports Y[3]]
set_property PACKAGE_PIN R18 [get_ports Y[4]]
set_property IOSTANDARD LVCMOS33 [get_ports Y[4]]
set_property PACKAGE_PIN V17 [get_ports Y[5]]
set_property IOSTANDARD LVCMOS33 [get_ports Y[5]]
set_property PACKAGE_PIN U17 [get_ports Y[6]]
set_property IOSTANDARD LVCMOS33 [get_ports Y[6]]
set_property PACKAGE_PIN U16 [get_ports Y[7]]
set_property IOSTANDARD LVCMOS33 [get_ports Y[7]]
#set_property PACKAGE_PIN V16 [get_ports led[8]]
#set_property IOSTANDARD LVCMOS33 [get_ports led[8]]
#set_property PACKAGE_PIN T15 [get_ports led[9]]
#set_property IOSTANDARD LVCMOS33 [get_ports led[9]]
#set_property PACKAGE_PIN U14 [get_ports led[10]]
#set_property IOSTANDARD LVCMOS33 [get_ports led[10]]
#set_property PACKAGE_PIN T16 [get_ports led[11]]
#set_property IOSTANDARD LVCMOS33 [get_ports led[11]]
#set_property PACKAGE_PIN V15 [get_ports led[12]]
#set_property IOSTANDARD LVCMOS33 [get_ports led[12]]
#set_property PACKAGE_PIN V14 [get_ports led[13]]
#set_property IOSTANDARD LVCMOS33 [get_ports led[13]]
#set_property PACKAGE_PIN V12 [get_ports led[14]]
#set_property IOSTANDARD LVCMOS33 [get_ports led[14]]
#set_property PACKAGE_PIN V11 [get_ports led[15]]
#set_property IOSTANDARD LVCMOS33 [get_ports led[15]]
.xdc分析:
“#”代表被注释的引脚。
每个引脚两行语句:第一行代表引脚在实验板上的位置;第二行代表输入输出标准电平3.3V
引脚锁定文件使用到的引脚名称与design source中所使用到变量名称相对应
(三)Elaborated design:
在vivado中模拟逻辑电路如下:
实验结论
根据74138的器件手册中的Function Tables,用verilog语言实现了3-8译码器并且用NEXYS4 DDR开发板验证了其功能,当输入一个3位二进制数作为信号时,led灯会产生对应信号的亮暗排列。
思考与讨论
(一)问题与提升:
①本次实验中,使能信号部分可以用两个与门和两个非门实现,定义变量I=G1&G2A&G2B。
②.v文件的赋值部分采用case语句嵌套,其中外层嵌套的case语句可以替换为if else语句。
(二)实验感想:
经过本次的实验,我对数字逻辑的概念和3-8译码器的功能有了更加深入的理解。同时意识到实验前的准备工作和实验后的反思总结是实验顺利完成不可缺少的一部分。