Verilog 38译码器

一、原理

输入为n,输出为2^n。一种多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的对象。在这里3-8译码器则将3为二进制代码翻译为8位只有一位为低电平其余全为高电平的对象。

二、时序

在这里采用组合逻辑,每输入一个三位二进制,就立即对应输出8位译码。

三、代码

decoder_38.v

module decoder_38(
	input				clk,
	input 				rst_n,
	input		[2:0]	din,
	output	reg [7:0]	dout
);
	always @(*)begin
		case(din)
			3'b000:dout<=8'b11111110;
			3'b001:dout<=8'b11111101;
			3'b010:dout<=8'b11111011;
			3'b011:dout<=8'b11110111;
			3'b100:dout<=8'b11101111;
			3'b101:dout<=8'b11011111;
			3'b110:dout<=8'b10111111;
			3'b111:dout<=8'b01111111;
			default:;
		endcase
	end
endmodule

decoder_38_tb.v

`timescale 1ns/1ps
module decoder_38_tb();
	reg				tb_clk	;
	reg 			tb_rst_n;
	reg		[2:0]	tb_din	;
	wire	[7:0]	tb_dout	;
	
	decoder_38 u_decoder_38(
	.clk	(tb_clk		),
	.rst_n	(tb_rst_n	),
	.din	(tb_din		),
	.dout   (tb_dout	)
);

	parameter CYCLE_CLOCK = 20;
	initial tb_clk = 1'b1;
	always #(CYCLE_CLOCK/2) tb_clk = ~tb_clk;
	
	integer i=0,j=0;
	initial begin
		tb_din = 3'd0;
		tb_rst_n = 1'b1;
		#(20*CYCLE_CLOCK);
		tb_rst_n = 1'b0;
		#(20*CYCLE_CLOCK);
		tb_rst_n = 1'b1;
		repeat(20)begin
			for(i=0;i<10;i=i+1)begin
				j={$random}%10;
				#2;
				tb_din = {$random}%7;
				#(j*CYCLE_CLOCK);
			end
		end
	
	$stop;
	end

endmodule

decoder_38.do

#tcl脚本仿真

vlib work
#创建工作库 名为work

vmap work work
#映射工作库 work 到 work

vlog decoder_38_tb.v
#编译被testbench文件

vlog decoder_38.v
#编译被仿真文件


vsim -novopt work.decoder_38_tb 
#指定仿真顶层

add wave -position insertpoint sim:/decoder_38_tb//*
#添加testbench顶层模块中的信号波形窗

四、总结

可以对其进行扩展,例如4-16译码器,5-32译码器等等。

  • 3
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值