4-16译码器和8-3优先编码器的实现
通过两个实验:理解由小逻辑单元组合成更大逻辑单元的概念,掌握模块例化的语法,了解使能信号的运用;熟悉8-3优先编码器的工作原理,并与3-8译码器进行比较联系。
使用两片3-8 DECODER和任意逻辑门实现一个4-16译码器(增加一个使能信号)
74138(3-8译码器)Function Tables:

声明输出信号V为有效,当数据输入I0+I1+I2+I3+I4+I5+I6+I7=1 时,V=1
(1)分析实验目的,使用两片3-8 DECODER,在top design中需要调用3-8译码器模块两次,两次调用的输出分别为4-16译码器输出的高八位和低八位。
(2)两次调用的输出是否有效通过G1,G2A,G2B(74138的使能信号)决定,其中G1即4-16译码器四位输入信号的一位,本次实验取最高位为G1,低三位为调用3-8译码器时的输入信号。G2A与G2B可通过拨号开关输入(本次实验采用该方式),也可直接赋值为低电平(赋值为0)。
(3)分析整理好思路后画出真值表,根据真值表进行后续编程操作。
(4)用verilog语言在vivado环境下编写源文件,基于3-8译码器实现4-16译码器。
(5)综合、实现、生成bitstream文件后,将bit文件下载到NEXYS4 DDR开发板上测试功能(六个指定的拨动开关代表输入,上拨值为1,下拨值为0;16个指定的led灯代表输出,灯亮代表H高电平1,不亮代表L低电平0。)
module top416(
input [3:0]D,
input EN1,//G2A
input EN2,//G2B
output [15:0]U//16输出
);
wire S3;
wire[2:0]M;
wire[7:0]YL,YH;
assign S3=D[3];
assign M=D[2:0];
ThrEightymq m381(S3,EN1,EN2,M,YL);
ThrEightymq m382(~S3,EN1,EN2,M,YH);
assign U[7:0]=YL;
assign U[15:8]=YH;
endmodule
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分析:
Ⅰtop.v文件:
①input一个四位向量D作为4-16译码器的输入信号,其中最高位在调用74138(3-8)译码器时映射到G1,低三位映射到3-8译码器的输入信号。另外input两个使能信号EN1,EN2,在调用3-8译码器模块时分别映射到G2A和G2B。
②output一个十六位向量U作为4-16译码器的输出信号,1代表高电平,0代表低电平,分别控制led灯亮熄,
③为方便调用3-8模块:定义wire型变量S3,将D的最高位赋值给S3;定义wire型变量M,将D的低三位赋给M;定义wire型变量YL和YH。YL作为第一次调用的output,代表输出D的低八位。YH作为第二次调用的output,代表输出D的高八位。
Ⅱ3-8.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 。
# Nexys4 Pin Assignments
############################
# On-board Slide Switches #
############################
set_property PACKAGE_PIN J15 [get_ports D[0]]
set_property IOSTANDARD LVCMOS33 [get_ports D[0]]
set_property PACKAGE_PIN L16 [get_ports D[1]]
set_property IOSTANDARD LVCMOS33 [get_ports D[1]]
set_property PACKAGE_PIN M13 [get_ports D[2]]
set_property IOSTANDARD LVCMOS33 [get_ports D[2]]
set_property PACKAGE_PIN R15 [get_ports D[3]]
set_property IOSTANDARD LVCMOS33 [get_ports D[3]]
set_property PACKAGE_PIN R17 [get_ports EN1]
set_property IOSTANDARD LVCMOS33 [get_ports EN1]
set_property PACKAGE_PIN T18 [get_ports EN2]
set_property IOSTANDARD LVCMOS33 [get_ports EN2]
#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 U[0]]
set_property IOSTANDARD LVCMOS33 [get_ports U[0]]
set_property PACKAGE_PIN K15 [get_ports U[1]]
set_property IOSTANDARD LVCMOS33 [get_ports U[1]]
set_property PACKAGE_PIN J13 [get_ports U[2]]
set_property IOSTANDARD LVCMOS33 [get_ports U[2]]
set_property PACKAGE_PIN N14 [get_ports U[3]]
set_property IOSTANDARD LVCMOS33 [get_ports U[3]]
set_property PACKAGE_PIN R18 [get_ports U[4]]
set_property IOSTANDARD LVCMOS33 [get_ports U[4]]
set_property PACKAGE_PIN V17 [get_ports U[5]]
set_property IOSTANDARD LVCMOS33 [get_ports U[5]]
set_property PACKAGE_PIN U17 [get_ports U[6]]
set_property IOSTANDARD LVCMOS33 [get_ports U[6]]
set_property PACKAGE_PIN U16 [get_ports U[7]]
set_property IOSTANDARD LVCMOS33 [get_ports U[7]]
set_property PACKAGE_PIN V16 [get_ports U[8]]
set_property IOSTANDARD LVCMOS33 [get_ports U[8]]
set_property PACKAGE_PIN T15 [get_ports U[9]]
set_property IOSTANDARD LVCMOS33 [get_ports U[9]]
set_property PACKAGE_PIN U14 [get_ports U[10]]
set_property IOSTANDARD LVCMOS33 [get_ports U[10]]
set_property PACKAGE_PIN T16 [get_ports U[11]]
set_property IOSTANDARD LVCMOS33 [get_ports U[11]]
set_property PACKAGE_PIN V15 [get_ports U[12]]
set_property IOSTANDARD LVCMOS33 [get_ports U[12]]
set_property PACKAGE_PIN V14 [get_ports U[13]]
set_property IOSTANDARD LVCMOS33 [get_ports U[13]]
set_property PACKAGE_PIN V12 [get_ports U[14]]
set_property IOSTANDARD LVCMOS33 [get_ports U[14]]
set_property PACKAGE_PIN V11 [get_ports U[15]]
set_property IOSTANDARD LVCMOS33 [get_ports U[15]]
.xdc分析
① “#”代表被注释的引脚。
② 每个引脚两行语句:第一行代表引脚在实验板上的位置;第二行代表输入输出标准电平3.3V
③ 引脚锁定文件使用到的引脚名称与design source中所使用到变量名称相对应
(3)Elaborated design:
在vivado中模拟逻辑电路如下:

(1)分析实验目的,8-3优先译码器的实现,输入8位信号,输出3位信号,另增加一位信号V表示输出是否有效,当8位输入中有一位为1时,V有效。
(2)根据输入信号的优先级做出真值表,根据真值表进行后续编程操作。
(3)用verilog语言在vivado环境下编写源文件,综合、实现、生成bitstream文件后,将bit文件下载到NEXYS4 DDR开发板上测试功能(8个指定的拨动开关代表输入,上拨值为1,下拨值为0; 4个指定的led灯代表输出,灯亮代表H高电平1,不亮代表L低电平0。)
module priorityencoder83(
input [7:0]I,
output reg [2:0]Y,
output V
);
assign V=I[0]|I[1]|I[2]|I[3]|I[4]|I[5]|I[6]|I[7];
always@(*)
begin
if(I[0]) //第一优先
Y=3'b0;
else if(I[1])
Y=3'b001;
else if(I[2])
Y=3'b010;
else if(I[3])
Y=3'b011;
else if(I[4])
Y=3'b100;
else if(I[5])
Y=3'b101;
else if(I[6])
Y=3'b110;
else if(I[7])
Y=3'b111;
else //I的每一位都为0,输出无效
Y=3'b111;//高电平输出无效
end
endmodule
.v分析:
① input一个八位向量I作为8-3优先编码器的输入信号
② output一个三位向量Y作为8-3优先编码器的输出信号
③ 另外output 变量V,V=1表示输出有效
④ 用always语句,内部使用if-elseif来实现优先级,I[0]为第一优先,其后依次为I[1],I[2],I[3],I[4],I[5],I[6],I[7],当I的每一位都为0时,输出无效,对应else的情况,三位输出全为高电平
# Nexys4 Pin Assignments
############################
# On-board Slide Switches #
############################
set_property PACKAGE_PIN J15 [get_ports I[0]]
set_property IOSTANDARD LVCMOS33 [get_ports I[0]]
set_property PACKAGE_PIN L16 [get_ports I[1]]
set_property IOSTANDARD LVCMOS33 [get_ports I[1]]
set_property PACKAGE_PIN M13 [get_ports I[2]]
set_property IOSTANDARD LVCMOS33 [get_ports I[2]]
set_property PACKAGE_PIN R15 [get_ports I[3]]
set_property IOSTANDARD LVCMOS33 [get_ports I[3]]
set_property PACKAGE_PIN R17 [get_ports I[4]]
set_property IOSTANDARD LVCMOS33 [get_ports I[4]]
set_property PACKAGE_PIN T18 [get_ports I[5]]
set_property IOSTANDARD LVCMOS33 [get_ports I[5]]
set_property PACKAGE_PIN U18 [get_ports I[6]]
set_property IOSTANDARD LVCMOS33 [get_ports I[6]]
set_property PACKAGE_PIN R13 [get_ports I[7]]
set_property IOSTANDARD LVCMOS33 [get_ports I[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 V]
set_property IOSTANDARD LVCMOS33 [get_ports V]
#set_property PACKAGE_PIN R18 [get_ports led[4]]
#set_property IOSTANDARD LVCMOS33 [get_ports led[4]]
#set_property PACKAGE_PIN V17 [get_ports led[5]]
#set_property IOSTANDARD LVCMOS33 [get_ports led[5]]
#set_property PACKAGE_PIN U17 [get_ports led[6]]
#set_property IOSTANDARD LVCMOS33 [get_ports led[6]]
#set_property PACKAGE_PIN U16 [get_ports led[7]]
#set_property IOSTANDARD LVCMOS33 [get_ports led[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中所使用到变量名称相对应
(3)Elaborated design:
在vivado中模拟逻辑电路如下:

① 通过调用74138 3-8译码器模块实现了4-16译码器并验证其功能,当输入一个4位信号时,16个led灯的显示出对应的亮暗排列。EN1+EN2=0且使能信号S3=1,则低八位输出有效,高八位输出无效;EN1+EN2=0且使能信号S3=0,则高八位输出有效,低八位输出无效;EN1+EN2=1时,高八位和低八位都无效。无效输出时,每一位都是高电平。
② 实现8-3优先编码器并验证其功能,输入一个8位信号时,3个led灯显示出对应的亮暗排列。Output V表示输出是否有效,无效时,每一位都是高电平。
③ 模块例化有两种书写方式,在端口映射时,若.a(b)/其中a为调用模块中定义的端口名,b为top文件中的端口名/则不用严格规定顺序,若直接在()中写入映射到调用模块端口的变量名,则需要和调用模块中的端口名对应。
④ 对3-8译码器和8-3优先编码器进行比较,两者实现功能中8-3的优先要求使用if-else语句突出优先顺序,若没有优先要求,编码器和译码器在逻辑上是相反的过程
当输入输出的引脚增多时,操作的精确性会降低,在之后的实验中,应当在书写代码的同时,对应引脚熟悉验证功能的流程,以保证实验的顺利进行。
本次实验中我实践了“复杂电路都是由更小的功能块的联合来实现”的思想,同时对优先编码器的工作原理更加清晰。
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我正在使用ruby1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主
我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功
在Ruby中,是否有一种简单的方法可以将n维数组中的每个元素乘以一个数字?这样:[1,2,3,4,5].multiplied_by2==[2,4,6,8,10]和[[1,2,3],[1,2,3]].multiplied_by2==[[2,4,6],[2,4,6]]?(很明显,我编写了multiplied_by函数以区别于*,它似乎连接了数组的多个副本,不幸的是这不是我需要的)。谢谢! 最佳答案 它的长格式等价物是:[1,2,3,4,5].collect{|n|n*2}其实并没有那么复杂。你总是可以使你的multiply_by方法:c
查看Ruby代码,它具有以下proc_arity:staticVALUEproc_arity(VALUEself){intarity=rb_proc_arity(self);returnINT2FIX(arity);}更多的是C编码风格问题,但为什么staticVALUE在单独的一行而不是像这样的:staticVALUEproc_arity(VALUEself) 最佳答案 它来自UNIX世界,因为它有助于轻松grep函数的定义:$grep-n'^proc_arity'*.c或使用vim:/^proc_arity