verilog验证三八译码器
三八译码器:
138 为3 线-8 线译码器,共有 54/74S138和 54/74LS138 两种线路结构型式,其主 要电特性的典型值如下: 当一个选通端(G1)为高电平,另两个选通端(/(G2A)和/(G2B))为 低电平时,可将地址端(A、B、C)的二进制编码在一个对应的输出端以低 电平译出。 利用 G1、/(G2A)和/(G2B)可级联扩展成 24 线译码器;若外接一个反 相器还可级联扩展成 32 线译码器。 若将选通端中的一个作为数据输入端时,138 还可作数据分配器。
module decoder_38(E,A_in,Y_out); input [2:0] A_in; input [2:0] E; output [7:0] Y_out; reg [7:0] Y_out; always @(A_in or E ) begin if(E == 3'b100) begin case(A_in) 3'b000: Y_out = 8'b1111_1110; 3'b001: Y_out = 8'b1111_1101; 3'b010: Y_out = 8'b1111_1011; 3'b011: Y_out = 8'b1111_0111; 3'b100: Y_out = 8'b1110_1111; 3'b101: Y_out = 8'b1101_1111; 3'b110: Y_out = 8'b1011_1111; 3'b111: Y_out = 8'b0111_1111; endcase end else begin Y_out = 8'b1111_1111; end end endmodule
测试程序:
`timescale 1ns/1ps module decoder_38_tb(); reg [2:0] A_in; reg [2:0] E; wire [7:0] Y_out; decoder_38 D_38( .E(E), .A_in(A_in), .Y_out(Y_out) ); initial begin #5 E = 3'b100; A_in = 3'b000; #5 E = 3'b100; A_in = 3'b001; #5 E = 3'b100; A_in = 3'b010; #5 E = 3'b100; A_in = 3'b011; #5 E = 3'b100; A_in = 3'b100; #5 E = 3'b100; A_in = 3'b101; #5 E = 3'b100; A_in = 3'b110; #5 E = 3'b100; A_in = 3'b111; #5 E = 3'b101; //使能端无效 A_in = 3'b111; #5 $stop ; end endmodule