译码器的逻辑功能是将每个输入的二进制代码译成对应的输出高、低电平信号或另外一个代码。
38译码器由三路信号输入,八路信号输出的译码器(2^3 = 8)。
以芯片74HC138为例:
由上图芯片使能由E1,E2,E3共同控制
三路信号输入:A0,A1,A2
八路信号输出:Y0,Y1,Y2,Y3,Y4,Y5,Y6,Y7
结合74HC138的结构原理及实验平台STEP-Baseboard的硬件配置,我们使用:
通过38译码器的原理及程序设计框图,我们不难发现这是一个比较简单的组合逻辑设计。
正如我们在原理及硬件连接中描述的,我们需要一路芯片使能端口、三路信号输入端口和八路信号输出端口。模块端口设计如下:
module Decode38 ( input Enable, input [2:0] A_in, output reg [7:0] Y_out );
逻辑部分,当芯片使能信号无效时,输出全部置高,当芯片使能信号有效时,根据三路信号的输入状态译码控制八路信号输出。
always@(A_in or Enable) begin if (Enable) case (A_in) 3'b000: Y_out = 8'b11111110; 3'b001: Y_out = 8'b11111101; 3'b010: Y_out = 8'b11111011; 3'b011: Y_out = 8'b11110111; 3'b100: Y_out = 8'b11101111; 3'b101: Y_out = 8'b11011111; 3'b110: Y_out = 8'b10111111; 3'b111: Y_out = 8'b01111111; default:Y_out = 8'b11111111; endcase else Y_out = 8'b11111111; end
测试文件中,我们要生成被测文件输入信号需要的激励,我们设计Enable信号每隔200ns(200个时间单位)进行翻转,三路信号输入为每20ns取随机值($random)。
reg Enable; reg [2:0] A_in; initial begin Enable = 1'b0; A_in = 3'b000; end always Enable = #200 ~Enable; always A_in = #20 $random;
引脚分配如下:
管脚名称 | Enable | Ain[0]| Ain[1] | Ain[2] | Yout[0] | Yout[1] |Yout[2] | Yout[3] |Yout[4] | Yout[5] |Yout[6] | Y_out[7] | |||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
FPGA管脚 | P12 | M13 | M14 | N13 | B14 | C14 | E14 | F14 | G14 | J14 | K14 | L14 |
资源 | 数量 | 比例 | 说明 |
---|---|---|---|
LUTs | 8 | 1% | |
寄存器 | 0 | 0% | |
存储器 | 0 | 0% | |
IO管脚 | 12 | ||
时钟频率 | 25MHz |
文件名称 | 功能 |
---|---|
Decode38.v | 38译码器 |
Decode38_test.v | 测试文件 |