VerilogHDL程序设计与仿真作业1:
——用一片CD4532构成8-3线编码器与用两片CD4532构成16线-4线优先编码器
文章目录
VerilogHDL程序设计与仿真作业1:
——用一片CD4532构成8-3线编码器与用两片CD4532构成16线-4线优先编码器
一、实验目的
二、一片CD4532构成8-3线编码器
1、设计思路
2、实现代码
3、测试代码
4、仿真
三、用两片CD4532构成16线-4线优先编码器
1、设计思路
2、实现代码
3、测试代码
4、仿真
一、实验目的
一片CD4532构成8-3线编码器
两片CD4532串行构成16-4线译码器
二、一片CD4532构成8-3线编码器
1、设计思路
采用逻辑电路的行为级建模,参考CD4532的功能表,运用always,casex,else if语句实现CD4532的功能。
逻辑符号与引脚图![在这里插入图片描述](https://img-blog.csdnimg.cn/20201123200842216.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FudG9uaW94dg==,size_16,color_FFFFFF,t_70#pic_center)
CD4532的功能表![在这里插入图片描述](https://img-blog.csdnimg.cn/20201123200854781.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FudG9uaW94dg==,size_16,color_FFFFFF,t_70#pic_center)
附加输出信号的状态与含义![在这里插入图片描述](https://img-blog.csdnimg.cn/2020112320091080.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FudG9uaW94dg==,size_16,color_FFFFFF,t_70#pic_center)
2、实现代码
//文件名称:CD4532.v
//fuchaoxinHUST11052020
module CD4532(EI,I,Y,GS,EO);
input EI;
input [7:0] I;
output reg [2:0] Y;
output reg GS,EO;
/*说明:
输入端:EI使能信号,I7到I0代表输入的数,且I7的优先级别最高,I0的优先级别最低;
输出端:GS、EO用于级联,Y则代表编码后的二进制数;
EI=0 GS=0 EO=0,不工作;
EI=1 GS=0 EO=1,工作,但输入无效;
EI=1 GS=1 EO=0,工作,输入有效;
EI=1 GS=1 EO=1,不可能出现。
*/
always @(*)//全信号敏感
if(EI==0) begin
GS=0;
EO=0;
Y[2:0]=3'b000;
end
else begin//EI=1
GS=1;
EO=0;
casex(I[7:0])//x为任意项 输入有效情况
8'b1xxxxxxx: Y[2:0]=3'b111;
8'b01xxxxxx: Y[2:0]=3'b110;
8'b001xxxxx: Y[2:0]=3'b101;
8'b0001xxxx: Y[2:0]=3'b100;
8'b00001xxx: Y[2:0]=3'b011;
8'b000001xx: Y[2:0]=3'b010;
8'b0000001x: Y[2:0]=3'b001;
8'b00000001: Y[2:0]=3'b000;
default begin//EI=1
GS=0;
EO=0;
Y[2:0]=3'b000;// I[7:0]=8'b0000000 输入无效情况
end
endcase
end
endmodule
3、测试代码
//文件名称:Test_CD4532.v
//fuchaoxinHUST20201105
`timescale 10ns/1ns
module Test_CD4532;
reg EI;
reg [7:0] I;
wire [2:0] Y;
wire GS,EO;
CD4532 U0(EI,I,Y,GS,EO);//实例化元件
initial
$monitor($time,":\t I=%b, EI=%b, EO=%b, GS=%b, Y=%b \n", I, EI, EO, GS, Y);
//监视器的显示内容
initial begin
//使能信号为0时
EI=0; I=8'b1111_1111;
#1
EI=0; I=8'b0111_1111;
#1
EI=0; I=8'b0011_1111;
#1
//使能信号为1时
EI=1; I=8'b1111_1111;
#1
EI=1; I=8'b0111_1111;
#1
EI=1; I=8'b0011_1111;
#1
$stop;//停止模拟仿真
end
endmodule
4、仿真
波形![在这里插入图片描述](https://img-blog.csdnimg.cn/20201123201031818.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FudG9uaW94dg==,size_16,color_FFFFFF,t_70#pic_center)
监控器![在这里插入图片描述](https://img-blog.csdnimg.cn/20201123201040943.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FudG9uaW94dg==,size_16,color_FFFFFF,t_70#pic_center)
三、用两片CD4532构成16线-4线优先编码器
1、设计思路
(1)当 E I 2 EI_2 EI2=0时, E O 2 EO_2 EO2= E I 1 EI_1 EI1= E O 1 EO_1 EO1=0, G S 2 = G S 1 = G S = 0 GS_2=GS_1=GS=0 GS2=GS1=GS=0,两个芯片都被禁止编码,无编码输出;
(2)当 E I 2 EI_2 EI2=1时,且当左边 I I II II号芯片有任何一个输入信号有效时,则使 E O 2 = E I 1 = E O 1 = 0 EO_2=EI_1=EO_1=0 EO2=EI1=EO1=0, I I I号芯片被禁止编码,所有输出均为0, G S 2 = G S = 1 GS_2=GS=1 GS2=GS=1, G S 1 = 0 GS_1=0 GS1=0, L 3 = 1 L_3=1 L3=1,信号 L L L输出8到15。
而当左边 I I II II号芯片无有效输入信号时(例如8‘b00000000),则使 E O 2 = E I 1 = 1 EO_2=EI_1=1 EO2=EI1=1, I I II II号芯片所有输出均为0(除了 E O 2 EO_2 EO2), I I I号芯片才被允许编码(一片CD4532编码过程参考前文),这说明左边的 I I II II号芯片优先级比右边的 I I I号芯片要高,而对于每片芯片来说,优先级: I 7 > I 1 I_7>I_1 I7>I1,则对于这种两片CD4532级联的解法,优先级: A 15 > A 0 A_{15}>A_0 A15>A0。
采用自顶向下的方式,综合行为级建模,门级描述和数据流建模实现用两片CD4532构成16线-4线优先编码器。
原理图 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201123201055832.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FudG9uaW94dg==,size_16,color_FFFFFF,t_70#pic_center)
2、实现代码
//文件名称:CD4532.v
//文件名称:CD4532_2.v
//fuchaoxinHUST11052020
module CD4532(EI,I,Y,GS,EO);
input EI;
input [7:0] I;
output reg [2:0] Y;
output reg GS, EO;
/*说明:
输入端:EI使能信号,I7到I0代表输入的数,且I7的优先级别最高,I0的优先级别最低;
输出端:GS、EO用于级联,Y则代表处理后的二进制数;
EI=0 GS=0 EO=0,不工作;
EI=1 GS=0 EO=1,工作,但输入无效;
EI=1 GS=1 EO=0,工作,输入有效;
EI=1 GS=1 EO=1,不可能出现。
*/
always @(*)//全信号敏感
if(EI==0) begin
GS=0;
EO=0;
Y[2:0]=3'b000;
end
else begin//EI=1
GS=1;
EO=0;
casex(I[7:0])//x为任意项 输入有效情况
8'b1xxxxxxx: Y[2:0]=3'b111;
8'b01xxxxxx: Y[2:0]=3'b110;
8'b001xxxxx: Y[2:0]=3'b101;
8'b0001xxxx: Y[2:0]=3'b100;
8'b00001xxx: Y[2:0]=3'b011;
8'b000001xx: Y[2:0]=3'b010;
8'b0000001x: Y[2:0]=3'b001;
8'b00000001: Y[2:0]=3'b000;
default begin//EI=1
GS=0;
EO=0;
Y[2:0]=3'b000;// I[7:0]=8'b0000000 输入无效情况
end
endcase
end
endmodule
//单片CD4532
module CD4532_2(EI,A,L,GS,EO);
input EI;
input [15:0] A; //[15:0] A对应的是II号芯片的[7:0] I号芯片到I的[7:0] I
output [3:0] L; //L[3]=GS_2 L[2]=Y_2[2]||Y_1[2] L[1]=Y_2[1]||Y_1[1] L[0]=Y_2[0]||Y_1[0]
output GS, EO; //GS=GS_1||GS_2 EO=EO_1
//逻辑或 || 全部使用 or(output,input,···)进行处理
/*说明:
输入端:EI使能信号,A15到A0代表输入的数,且A15的优先级别最高,A0的优先级别最低;
输出端:GS、EO用于级联,L则代表处理后的四位二进制数;
将两片连接后看成一片:
EI=0 GS=0 EO=0,不工作;
EI=1 GS=0 EO=1,工作,但输入无效;
EI=1 GS=1 EO=0,工作,输入有效;
EI=1 GS=1 EO=1,不可能出现。
*/
//中间变量定义
wire [7:0] I_1,I_2;
wire [2:0] Y_1,Y_2;
wire GS_1,GS_2,EO_2;//EI_1=EO_2 两者共用一个变量 已有EI=EI_2 EO=EO_1
//输入部分
genvar i;
for(i=7;i>=0;i=i-1) assign I_1[i] = A[i];
for(i=15;i>=8;i=i-1) assign I_2[i-8] = A[i];
//先后执行两片CD4532 得到输出量EO 中间变量GS_1 GS_2 EO_2 Y[]
CD4532 C2(EI,I_2,Y_2,GS_2,EO_2);//2片 EI_2=EI EI是input
CD4532 C1(EO_2,I_1,Y_1,GS_1,EO);//1片 EI_1=EO_2 EO_2由第2片得到 EO=EO_1 EO是output
//输出部分
or G0(L[0],Y_1[0],Y_2[0]);
or G1(L[1],Y_1[1],Y_2[1]);
or G2(L[2],Y_1[2],Y_2[2]);
assign L[3] = GS_2; //L[3]直接由GS_2决定
or G3(GS,GS_1,GS_2);//G3门输出GS
//先输入,经过CD4532处理后得到第一次输出,再次用OR门处理得到输出值
endmodule
//用两片CD4532构成16线-4线优先编码器
3、测试代码
//文件名称:Test_CD4532_2.v
//fuchaoxinHUST20201105
`timescale 10ns/1ns
module Test_CD4532_2;
reg EI;
reg [15:0] A;
wire [3:0] L;
wire GS,EO;
CD4532 U1(EI,A,L,GS,EO);//实例化元件
initial
$monitor($time,":\t A=%b, EI=%b, EO=%b, GS=%b, L=%b \n", A, EI, EO, GS, L);
//监视器的显示内容
initial begin
//使能信号为0
EI=0;A=16'b0000_0000_0000_0000;
#5
EI=0;A=16'b0000_0000_0000_0000;
#5
EI=0;A=16'b0000_0000_0000_0000;
#5
//使能信号为1
EI=1;A=16'b1111_0000_0000_0000;
#5
EI=1;A=16'b0001_0000_0000_0000;
#5
EI=1;A=16'b0000_0001_0000_0000;
#5
$stop;//停止测试
end
endmodule
4、仿真
波形![在这里插入图片描述](https://img-blog.csdnimg.cn/2020112320110813.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FudG9uaW94dg==,size_16,color_FFFFFF,t_70#pic_center)
监视器![在这里插入图片描述](https://img-blog.csdnimg.cn/2020112320111575.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FudG9uaW94dg==,size_16,color_FFFFFF,t_70#pic_center)
部分图源来自华科数电mooc ︎
|