verilog——74X138译码器及其应用

Verilog——74X138仿真并用74X139和74X138构成5线-32线译码器

74X138的仿真

设计思路

采用行为级建模,根据74X138译码器的功能表编程即可。

功能表

代码实现

设计模块
//filename:74X138.v
module _74X138(A,E3,E2,E1,Y);
input [2:0] A;
input E2,E1,E3;
output reg [7:0] Y; 
/*输入输出端口说明。
  输入端口:E3,E2,E1为使能信号。
  输出端口:Y为译码输出。
*/
always@(*)  begin
if(E3==1&&E2==0&&E1==0) begin   //使能端有效,芯片工作
    case(A)
	3'b000: Y=8'b0111_1111;  
	3'b001: Y=8'b1011_1111;
	3'b010: Y=8'b1101_1111;
	3'b011: Y=8'b1110_1111;
	3'b100: Y=8'b1111_0111;
	3'b101: Y=8'b1111_1011;
	3'b110: Y=8'b1111_1101;
	3'b111: Y=8'b1111_1110;
    endcase
end
else	Y=8'b1111_1111;    //使能端为无效
end
endmodule
测试模块
//filename:tb_74X138
`timescale 10ns/1ns
module tb_74X138();
reg [2:0] A;
reg E3,E2,E1;
wire [7:0] Y;

_74X138 U1(A,E3,E2,E1,Y);//元件实例化
initial 
	$monitor($time,":\t A=%b,E3=%b,E2=%b,E1=%b",A,E3,E2,E1);//监视器监视。
initial begin
//控制信号无效。
	E3=0;E2=0;E1=0;A=3'b000;
	#5                     
	E3=1;E2=1;E1=0;A=3'b000;
	#5
	//控制信号有效。
	E3=1;E2=0;E1=0;A=3'b000;
	#5
	E3=1;E2=0;E1=0;A=3'b010;
	#5
	E3=1;E2=0;E1=0;A=3'b111;
	#5
	//停止仿真。
	$stop;
end
endmodule

仿真

监视器
波形图

用74X139和74X138构成5线-32线译码器

设计思路

用74X139的四个输出端分别控制四片74X138的E1使能端,电路原理图如下:
原理图

准备工作:74X139的仿真

设计模块
//filename:_74X139.v

module _74X139(A,E,Y);
input [1:0] A;
input E;
output reg [3:0] Y;
/*输入输出端口说明。
  输入端口:E为使能信号。A输入的待译码数字。
  输出端口:Y为译码输出。
*/
always@(*)begin
if(E)	Y=4'b1111;
else begin
	case(A)
	2'b00:Y=4'b0111;
	2'b01:Y=4'b1011;
	2'b10:Y=4'b1101;
	2'b11:Y=4'b1110;
	endcase
end
end
endmodule
测试模块
//filename:tb_74X139
`timescale 10ns/1ns
module tb_74X139();
reg [1:0] A;
reg E;
wire [3:0] Y;
/*输入输出端口说明。
  输入端口:E3,E2,E1为使能信号。
  输出端口:Y为译码输出。
*/
_74X139 U2(A,E,Y);//元件实例化。
initial 
	$monitor($time,":\tA=%b,E=%b,Y=%b",A,E,Y);//监视器监视。
initial begin
	//控制信号无效。
	E=1;A=2'b00;
	#5
	//控制信号有效。
	E=0;A=2'b00;
	#5
	E=0;A=2'b11;
	#5	
	$stop;
end
endmodule

5-32线译码器的代码实现

设计模块
//filename:decoder.v
module _74X138(A,E3,E2,E1,Y);
input [2:0] A;
input E2,E1,E3;
output reg [7:0] Y;

always@(*)  begin
if(E3==1&&E2==0&&E1==0) begin
    case(A)
	3'b000: Y=8'b0111_1111;  
	3'b001: Y=8'b1011_1111;
	3'b010: Y=8'b1101_1111;
	3'b011: Y=8'b1110_1111;
	3'b100: Y=8'b1111_0111;
	3'b101: Y=8'b1111_1011;
	3'b110: Y=8'b1111_1101;
	3'b111: Y=8'b1111_1110;
    endcase
end
else	Y=8'b1111_1111;
end
endmodule


module _74X139(A,E,Y);
input [1:0] A;
input E;
output reg [3:0] Y;

always@(*)begin
if(E)	Y=4'b1111;
else begin
	case(A)
	2'b00:Y=4'b0111;
	2'b01:Y=4'b1011;
	2'b10:Y=4'b1101;
	2'b11:Y=4'b1110;
	endcase
end
end
endmodule

module decoder(B,E,L);
input [4:0] B;
input E;
output [31:0] L;
/*输入输出端口说明。
  输入端口:E为使能信号,B为输入的待译码五位二进制。
  输出端口:Y为译码输出。
*/
wire [1:0] B1;
wire [2:0] B2;
wire [3:0] Y;
wire [7:0] L0;
wire [7:0] L1;
wire [7:0] L2;
wire [7:0] L3;
wire E2,E3;//中间变量。
genvar k;//循环变量。
for(k=4;k>=3;k=k-1) assign B1[k-3]=B[k];
for(k=2;k>=0;k=k-1) assign B2[k]=B[k];//中间变量赋值。
assign E2=1'b0;
assign E3=1'b1;
//元件实例化。
 _74X139 U(B1,E,Y);
 _74X138 U0(B2,E3,E2,Y[0],L0);
 _74X138 U1(B2,E3,E2,Y[1],L1);
 _74X138 U2(B2,E3,E2,Y[2],L2);
 _74X138 U3(B2,E3,E2,Y[3],L3);
assign L={L3,L2,L1,L0};
endmodule
测试代码
//filename:tb_decoder
`timescale 10ns/1ns
module tb_decoder();
reg [4:0] B;
reg E;
wire [31:0] L;

decoder U4(B,E,L);//元件实例化。
initial 
	$monitor($time,":\tB=%b,E=%b,L=%b",B,E,L);//监视器监视。
initial begin
	//控制信号无效。
	E=1;B=5'b00001;
	#5
	//控制信号有效。
	E=0;B=5'b00001;
	#5
	E=0;B=5'b11111;
	#5
	E=0;B=5'b00100;
	#5
	$stop;
end
endmodule

仿真

波形图
监视器

  • 17
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Verilog中的三八译码器可以使用以下代码进行实现: ```verilog module decoder38(input [2:0] A, output reg [7:0] Y); always @(*) begin case(A) 3'b000 : Y = 8'b00000001; 3'b001 : Y = 8'b00000010; 3'b010 : Y = 8'b00000100; 3'b011 : Y = 8'b00001000; 3'b100 : Y = 8'b00010000; 3'b101 : Y = 8'b00100000; 3'b110 : Y = 8'b01000000; 3'b111 : Y = 8'b10000000; endcase end endmodule ``` 以上代码中,模块`decoder38`包含一个三位输入端口`A`和一个八位输出端口`Y`。使用`case`语句实现了三八译码器的功能,将输入的三位二进制数转化为对应的八位输出。 以下是一个简单的测试激励代码,用于测试三八译码器: ```verilog module test_decoder38(); reg [2:0] A; wire [7:0] Y; decoder38 dut(A, Y); initial begin $monitor("A = %b, Y = %b", A, Y); #10 A = 3'b000; #10 A = 3'b001; #10 A = 3'b010; #10 A = 3'b011; #10 A = 3'b100; #10 A = 3'b101; #10 A = 3'b110; #10 A = 3'b111; #10 $stop; end endmodule ``` 以上代码中,模块`test_decoder38`包含一个三位输入端口`A`、一个八位输出端口`Y`和一个三八译码器实例`dut`。使用`initial`块进行测试激励,对`A`的八种输入情况分别进行测试,并在每次输入时输出当前的输入和输出。最后使用`$stop`停止仿真。 在仿真中运行`test_decoder38`模块,可以得到以下结果: ``` A = xxx, Y = xxxxxxxx A = 000, Y = 00000001 A = 001, Y = 00000010 A = 010, Y = 00000100 A = 011, Y = 00001000 A = 100, Y = 00010000 A = 101, Y = 00100000 A = 110, Y = 01000000 A = 111, Y = 10000000 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值