User Tools

Site Tools


encoder_decoder

Tutorial 4: 编码器, 译码器

编码器

实验目的

  • 了解编码器这种组合逻辑电路
  • 学会用门电路和Verilog HDL分别描述编码器

实验原理

1. 什么是编码器?为什么需要编码器?

为了区分一系列不同的食物, 将其中的每一个事物都用一路电信号表示, 并给每一路都标上号, 即有一个二进制码的表示, 这就是编码.
比如下图所示的这个薄膜键盘: 其电路图如下图所示: 线1-4称为列线, 线5-8称为行线;当我们选中某一行 (对应的导线接高电平) , 就可以通过读取4根列线的电平信号来确定该行的哪一个按键被按下, 如果我们要设计一块芯片来快速地循环扫描每一行以捕捉用户的每一个输入, 就需要设计一个编码器.

2. 编码器的输入输出

有了上面这个薄膜键盘的例子, 我们可以为它设计一个4线-2线编码器, 其输入输出如下表所示:

I0 I1 I2 I3 Y1 Y0 LINE NO.
1 0 0 0 0 0 0
0 1 0 0 0 1 1
0 0 1 0 1 0 2
0 0 0 1 1 1 3

可见, 每当有一路为高电平时, 编码器就会输出该路的二进制编号. 由此, 可以得到Y1 和 Y0的逻辑函数:

  • Y1=I'0I'1I2I'3+I'0I'1I'2I3
  • Y0=I'0I1I'2I'3+I'0I'1I'2I3

3. 优先编码器

上面这个编码器只允许一次输入一个高电平信号, 否则输出会一直是二进制的00. 而优先编码器则允许两个以上的高电平信号输入 (当高电平输入为有效输入时) , 但是这些高电平信号有优先顺序, 只对优先级最高的高电平信号进行编码. 如果有效输入为低电平, 则只对优先级最高的低电平信号进行编码. 另外, 优先编码器还引入了一个使能端, 只有该使能端输入为低电平时, 才接受信号输入. 增加了输出引脚Y'S和Y'EX分别表示是否被使能以及是否有有效输入.

取低电平为有效输入, 编号越大的优先级越高, 则其输入输出如下表所示:

S' I'0 I'1 I'2 I'3 Y'0 Y'1 Y'S Y'EX
1 x x x x 1 1 1 1
0 1 1 1 1 1 1 0 1
0 x x x 0 0 0 1 0
0 x x 0 1 1 0 1 0
0 x 0 1 1 0 1 1 0
0 0 1 1 1 1 1 1 0

由此可得各个输出的逻辑函数:

  • Y'0=S'+I'1I'3+I2I'3
  • Y'1=S'+I'2I'3
  • Y'S=S'+I0+I1+I2+I3
  • Y'EX=S'+I'0I'1I'2I'3

实验内容

简单编码器

绘图法
  1. 在Quartus中新建一个空的工程项目
  2. 新建一个Block Diagram文件, 根据: Y1=I'0I'1I2I'3+I'0I'1I'2I3 和 Y0=I'0I1I'2I'3+I'0I'1I'2I3 构造如下的电路:
  3. 烧入FPGA进行测试
Verilog HDL
  1. 在Quartus中新建一个空的工程项目
  2. 新建一个Verilog HDL文件, 输入如下代码:
    module encoder4to2(Y0,Y1,I0,I1,I2,I3);
     
    input I0,I1,I2,I3;
    output Y0,Y1;
     
        assign Y0=(!I0 && I1 && !I2 && !I3) || (!I0 && !I1 && !I2 && I3);
        assign Y1=(!I0 && !I1 && I2 && !I3) || (!I0 && !I1 && !I2 && I3);
     
    endmodule
  3. 绘制顶层设计图:
  4. 烧入FPGA进行测试

上面的代码用逻辑表达式描述电路结构, 算法级描述. 我们也可以直接描述门电路之间的连接, 门级描述. 代码如下:

module encoder4to2(Y0,Y1,I0,I1,I2,I3);
 
input I0,I1,I2,I3;
output Y0,Y1;
wire nI0,nI1,nI2,nI3,y00,y01,y10,y11;
 
   not    u1(nI0,I0);
   not	  u2(nI1,I1);
   not    u3(nI2,I2);
   not    u4(nI3,I3);
   and #1 u5(y00,nI0,I1,nI2,nI3);
   and #1 u6(y01,nI0,nI1,nI2,I3);
   and #1 u7(y10,nI0,nI1,I2,nI3);
   and #1 u8(y11,nI0,nI1,nI2,I3);
   or  #1 u9(Y0,y00,y01);
   or  #1 u10(Y1,y10,y11);
 
endmodule

优先编码器

绘图法

根据前面描述的优先编码器的逻辑函数, 可以得到如下的电路图:

Verilog HDL
module encoder4to2_prio(nY0,nY1,nYs,nYex,nS,nI0,nI1,nI2,nI3);
 
input nS,nI0,nI1,nI2,nI3;
output nY0,nY1,nYs,nYex;
 
	assign nY0=nS || (nI1 && nI3) || (!nI2 && nI3);
	assign nY1=nS || (nI2 && nI3);
	assign nYs=nS || !nI0 || !nI1 || !nI2 || !nI3;
	assign nYex=nS || (nI0 && nI1 && nI2 && nI3);
 
endmodule

对应的顶层设计图为:

收入FPGA测试, 结果应符合对应的真值表.

译码器

实验目的

  • 了解译码器这种组合逻辑电路
  • 学会用门电路和Verilog HDL分别描述译码器

实验原理

1. 什么是译码器?

译码器 (Decoder) 执行的是编码器的逆操作, 根据输入的二进制数值 (称为地址) , 选中对应的线路.

2. 译码器的输入输出

除了用于输入地址的端口, 多路输出端口外, 译码器一般还有S1, S'23两个端口. S1为使能端, 高电平使能;S'23为进位控制, 用于多片译码器的串联以拓展输入输出位宽, 高电平时进位, 当前译码器禁用, 输出端口封锁在高电平. 下表为2线-4线译码器的真值表:

S1 S'23 A1 A0 Y'0 Y'1 Y'2 Y'3
0 x x x 1 1 1 1
x 1 x x 1 1 1 1
1 0 0 0 0 1 1 1
1 0 0 1 1 0 1 1
1 0 1 0 1 1 0 1
1 0 1 1 1 1 1 0

得到下列逻辑函数:

  • Y'0=(S1S'23I'0I'1)'
  • Y'1=(S1S'23I0I'1)'
  • Y'2=(S1S'23I'0I1)'
  • Y'3=(S1S'23I0I1)'

实验内容

绘图法设计2线-4线译码器

门级电路图如下所示:

工程项目文件: DECODER_2to4.zip

Verilog HDL

用Verilog代码描述, 代码如下:

module decoder2to4(nY0,nY1,nY2,nY3,nI0,nI1,S1,nS2);
 
input nI0,nI1,S1,nS2;
output nY0,nY1,nY2,nY3;
 
wire s;
 
	assign s=S1 && !nS2;
	assign nY0=!(nI0 && nI1 && s);
	assign nY1=!(nI0 && !nI1 && s);
	assign nY2=!(!nI0 && nI1 && s);
	assign nY3=!(!nI0 && !nI1 && s);
 
endmodule

对应的顶级设计图如下:

工程项目文件: DECODER_2to4_Verilog.zip

encoder_decoder.txt · Last modified: 2019/01/07 20:12 by daizhirui