8-3编码器,3-8译码器的verilog实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8-3编码器,3-8译码器的verilog实现
在数字系统中,由于采⽤⼆进制运算处理数据,因此通常将信息变成若⼲位⼆进制代码。
在逻辑电路中,信号都是以⾼,低电平的形式输出。
编码器:实现编码的数字电路,把输⼊的每个⾼低电平信号编成⼀组对应的⼆进制代码。
设计⼀个输⼊为8个⾼电平有效信号,输出代码为原码输出的3位⼆进制编码器。
化简逻辑表达式:由逻辑表达式可以得出,普通的8-3编码器⽤或门即可实现。
对应的verilog程序如下:
module mb_83(x,y);
input [7:0]x;
output [2:0]y;
reg [2:0]y;
always@(x)
begin
case (x)
8'b00000001:y=3'b000; //当当 x=8 ’b00000001,则则 y 输出为 3 ’b000
8'b00000010:y=3'b001; //当当 x=8 ’b00000010,则则 y 输出为 3 ’b001
8'b00000100:y=3'b010; //当当 x=8 ’b00000100,则则 y 输出为 3 ’b010
8'b00001000:y=3'b011; //当当 x=8 ’b00001000,则则 y 输出为 3 ’b011
8'b00010000:y=3'b100; //当当 x=8 ’b00010000,则则 y 输出为 3 ’b100
8'b00100000:y=3'b101; //当当 x=8 ’b00100000,则则 y 输出为 3 ’b101
8'b01000000:y=3'b110; //当当 x=8 ’b01000000,则则 y 输出为 3 ’b110
8'b10000000:y=3'b111; //当当 x=8 ’b10000000,则则 y 输出为 3 ’b111
default: y=3'b000;
endcase
end
endmodule
上述编码器有⼀个缺点,即在某⼀个时刻只允许有⼀个有效的输⼊,⽽同时若⼜有两个或两个以上的输⼊信号要求编码,输出端⼀定会发⽣混乱,出现错误。
为了解决这个问题,引⼊了优先编码器。
优先编码器的功能是允许同时在⼏个输⼊端有输⼊信号,编码器按照输⼊信号预先排定的优先顺序,只对同时输⼊的⼏个信号中有优先权⾼位的⼀个信号编码。
对应的真值表为
对应的verilog程序:(输⼊信号:i[7:0];输⼊使能端:ei;输出信号端:y: [2:0];输出使能端eo;优先标志端gs)
module yxbm_83(y,eo,gs,i,ei);
input [7:0] i; //8 位输⼊ i
input ei; // 使能输⼊端 ei
output eo,gs; // 使能输出端 eo ,优先标志端 gs
output[2:0] y; //3 位输出 y
reg[2:0] y; //3 位输出寄存器 y
reg eo,gs; // 使能输出寄存器,
always@(i,ei) // 电平触发⽅式,当 i 跟跟 ei 有改变的时候,执⾏以下操作
begin
if(ei==1'b1) //当 ei 为为 1 的时候
begin
y<=3'b111;
gs<=1'b1;
eo<=1'b1;
end
else
begin
if(i[7]==1'b0) //当 i 的第 8 为为 0 时候
begin
y<=3'b000;
gs<=1'b0;
eo<=1'b1;
end
else if(i[6]==1'b0) //当 i 的第七位为 0 时候
begin
y<=3'b001;
gs<=1'b0;
eo<=1'b1;
end
else if(i[5]==1'b0) //当 i 的第 6 位为 0 时候
begin
y<=3'b010;
gs<=1'b0;
eo<=1'b1;
end
else if(i[4]==1'b0) //当 i 的第 5 位为 0 时候
begin
y<=3'b011;
gs<=1'b0;
eo<=1'b1;
end
else if(i[3]==1'b0) //当 i 的第 4 位为 0 时候
begin
y<=3'b100;
gs<=1'b0;
eo<=1'b1;
end
else if(i[2]==1'b0) //当 i 的第 3 位为 0 时候
begin
y<=3'b101;
gs<=1'b0;
eo<=1'b1;
end
else if(i[1]==1'b0) //当 i 的第 2 位为 0 时候
begin
y<=3'b110;
gs<=1'b0;
eo<=1'b1;
end
else if(i[0]==1'b0)//当 i 的第 1 位为 0 时候
begin
y<=3'b111;
gs<=1'b0;
eo<=1'b1;
end
else if(i==8'b11111111)//当 i 为为 8'b11111111 时候
begin
y<=3'b111;
gs<=1'b1;
eo<=1'b0;
end
end
end
endmodule
时序仿真的结果:
译码器(Decoder):把代码状态的特定含义翻译过来的过程为译码。
译码器:实现译码操作的逻辑电路,就是把⼀种代码转换为另⼀种代码的电路。
译码器与编码器图解:
设计⼀个具有三个使能端的3-8译码器:
真值表为:3位编码输⼊端a[2:0],使能输⼊端g1,g2,g3;输出信号:8位编码输出端y[7:0]。
module ym_3_8(a,g1,g2,g3,y);
input[2:0] a; //3 位位 2 进制编码输⼊端
input g1,g2,g3; //3 个使能输⼊端
output[7:0] y; //8 位编码输出端
reg[7:0] y;
always@(a or g1 or g2 or g3) // 电平触发⽅式
begin
if(g1==0) y=8'b11111111; // 如果 g1 为为 0 ,则 y 输出为 11111111
else if(g2==1) y=8'b11111111; // 如果 g2 为为 1 ,则 y 输出为 11111111
else if(g3==1) y=8'b11111111; // 如果 g3 为为 1 ,则 y 输出为 11111111
else
case(a[2:0]) // 判断 a 的值,并通过 a 的值来给 y
// 设置输出值
3'b000:y[7:0]=8'b11111110;
3'b001:y[7:0]=8'b11111101;
3'b010:y[7:0]=8'b11111011;
3'b011:y[7:0]=8'b11110111;
3'b100:y[7:0]=8'b11101111;
3'b101:y[7:0]=8'b11011111;
3'b110:y[7:0]=8'b10111111;
3'b111:y[7:0]=8'b11111111;
endcase
end
endmodule。