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
时间: 2024-10-17 05:07:28

8-3编码器,3-8译码器的verilog实现的相关文章

ISE,FPGA和LDPCC译码器

阶段总结 V1.0 2015/5/03 ISE,FPGA和LDPCC译码器 ? 概述 ? 本文总结了LDPC码的译码器设计方法,包括MATLAB和FPGA代码,以及ISE使用过程中的一些问题.本文内容具体包括以下几个部分 总体思路 功能设计 存储设计 完成LDPC码译码器 观察综合报告 时序收敛和流水线 编程策略初探 我犯了什么错误 代码验证 其他 修订历史 以下表格展示了本文档的修订过程 日期 版本号 修订内容 2015/05/03 V1.0 初始版本 ? 简介 ? 不知不觉中,接触LDPC码

Netty in Action (二十) 第十章节 codecs

第十章,第十一章序 对于网络而言,数据只是原始字节序列,但是我们的程序将这些字节按照某种方式去组织成我们能够看懂的语言,我们一般称这些信息叫"信息",将信息转换成字节或者从网络中将字节装换成我们能够看懂的信息这些都是我们网络传输中最最常见的任务之一,你可能需要在标准的格式或者协议下工作,例如FTP协议或者Telnet协议,或者是从第三方自定义的专有协议,亦或者是根据字自已的应用去继承一种已有的信息格式 处理将网络中的数据转化成应用数据的组件叫做解码器或者编码器,相对应而言,一个单独的组

Verilog学习笔记简单功能实现(四)...............译码器和编码器

这里以简单的3-8译码器和8-3编码器为例: module decoder3_8(a,out); input [2:0]a; output [7:0]out; assign out=1'b1<<a;/*把最低位的1左移in位(根据in口输入的值)并赋予out*/ endmodule 8-3编码器程序: 1)利用for循环 1 module encoder8_3(a,out,none_on); 2 input [7:0]a; 3 output [2:0]out; 4 output none_on

3_8译码器Verilog HDL语言的简单实现

最近在学Verilog HDL语言,觉得learn in doing是比较好的学习方式,所以我们来直接分析分析代码好了. 先来一波代码: 1 module q_decode_38(data_in,data_out); 2 3 input[2:0] data_in; //端口声明 4 output[7:0] data_out; 5 reg[7:0] data_out; 6 7 always@(data_in) 8 begin 9 case(data_in) 10 3'd0:data_out = 8

verilog之:旋转编码器驱动

旋转编码器可通过旋转可以计数正方向和反方向转动过程中输出脉冲的次数,旋转计数不像电位计,这种转动计数是没有限制的.配合旋转编码器上的按键,可以复位到初始状态,即从0开始计数. 工作原理: 增量编码器是一种将旋转位移转换为一连串数字脉冲信号的旋转式传感器.这些脉冲用来控制角位移.在Eltra编码器中角位移的转换采用了光电扫描原理.读数系统以由交替的透光窗口和不透光窗口构成的径向分度盘(码盘)的旋转为依据,同时被一个红外光源垂直照射,光把码盘的图像投射到接收器表面上.接收器覆盖着一层衍射光栅,它具有

用Verilog语言设计一个3-8译码器

case语句 if_case语句 源代码 // case语句 module decoder38(din,dout); input [2:0] din; output reg[7:0] dout; [email protected](*) begin case(din) 3'b000: dout = 8'h01; 3'b001: dout = 8'h02; 3'b010: dout = 8'h04; 3'b011: dout = 8'h08; 3'b100: dout = 8'h10; 3'b10

对Verilog 初学者比较有用的整理(转自它处)

对Verilog 初学者比较有用的整理(转自它处) ******************************************************************************************************************** *作者: Ian11122840    时间: 2010-9-27 09:04                                                                   

自己动手写处理器之第二阶段(3)——Verilog HDL行为语句

将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第七篇,我尽量每周四篇 2.6 Verilog HDL行为语句 2.6.1 过程语句 Verilog定义的模块一般包括有过程语句,过程语句有两种:initial.always.其中initial常用于仿真中的初始化,其中的语句只执行一次,而always中语句则是不断重复执行的.此外,always过程语句是可综合的,initial过程语句是不可综合的.       1.always过程语句 always过程语句的格式如图2-10所示.

LDPC译码器的FPGA实现

应用笔记 V0.0 2015/3/17 LDPC译码器的FPGA实现 ? 概述 ? 本文将介绍LDPC译码器的FPGA实现,译码器设计对应CCSDS131x1o1s文档中提到的适用于深空通信任务的LDPC编码.本文档将简述Verilog代码的基本结构和信号说明. 修订历史 以下表格展示了本文档的修订过程 日期 版本号 修订内容 2015/03/16 V1.0 初始版本,ISim仿真基本正确 ? 简介 ? 本文中FPGA实现特指通过Verilog HDL实现LDPC译码器功能,然而对于VHDL来说