VerilogHDL程序设计与仿真作业1:
——用一片CD4532构成8-3线编码器与用两片CD4532构成16线-4线优先编码器
文章目录
一、实验目的
- 一片CD4532构成8-3线编码器
- 两片CD4532串行构成16-4线译码器
二、一片CD4532构成8-3线编码器
1、设计思路
采用逻辑电路的行为级建模,参考CD4532的功能表,运用always,casex,else if语句实现CD4532的功能。
逻辑符号与引脚图

CD4532的功能表

附加输出信号的状态与含义

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、仿真
波形

监控器

三、用两片CD4532构成16线-4线优先编码器
1、设计思路
(1)当E I 2 EI_2EI2=0时,E O 2 EO_2EO2=E I 1 EI_1EI1=E O 1 EO_1EO1=0,G S 2 = G S 1 = G S = 0 GS_2=GS_1=GS=0GS2=GS1=GS=0,两个芯片都被禁止编码,无编码输出;
(2)当E I 2 EI_2EI2=1时,且当左边I I IIII号芯片有任何一个输入信号有效时,则使E O 2 = E I 1 = E O 1 = 0 EO_2=EI_1=EO_1=0EO2=EI1=EO1=0,I II号芯片被禁止编码,所有输出均为0,G S 2 = G S = 1 GS_2=GS=1GS2=GS=1,G S 1 = 0 GS_1=0GS1=0,L 3 = 1 L_3=1L3=1,信号L LL输出8到15。
而当左边I I IIII号芯片无有效输入信号时(例如8‘b00000000),则使E O 2 = E I 1 = 1 EO_2=EI_1=1EO2=EI1=1,I I IIII号芯片所有输出均为0(除了E O 2 EO_2EO2),I II号芯片才被允许编码(一片CD4532编码过程参考前文),这说明左边的I I IIII号芯片优先级比右边的I II号芯片要高,而对于每片芯片来说,优先级:I 7 > I 1 I_7>I_1I7>I1,则对于这种两片CD4532级联的解法,优先级:A 15 > A 0 A_{15}>A_0A15>A0。
采用自顶向下的方式,综合行为级建模,门级描述和数据流建模实现用两片CD4532构成16线-4线优先编码器。
原理图

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、仿真
波形

监视器

部分图源来自华科数电mooc ↩︎