38译码器 verilog FPGA 基础练习0

38译码器 verilog FPGA 基础练习0

发现问题,用技术解决问题。兴趣是自己的源动力 !

前言

译码器是可以将输入二进制代码的状态翻译成输出信号,以表示其原来含义的电路。


一、端口的扩展

假如我们有8个led灯需要单独控制,理论上我们需要用8个I/O口,普通的单片机也够用,但是如果我们控制的不是8个led灯,而是一个点阵屏,那就可想而知我们要使用的I/O口数量不是一般控制器就能满足的了,即便是I/O资源丰 富的FPGA在面对巨大的点阵屏时也可能面临管脚资源不够用的尴尬境地。

二、解决方案

此种情况下使用3-8译码器就可以很好的解决这个问题,我们可以通过控制器控制3个I/O输出的8种情况来分别控制8个输出状态,相当于用3个I/O口就可以独立控制8个led灯,即一个3-8译码器就能够节约出来5个I/O口,算起来是相当合算 的

三、实现方案

3.1 if else版本

if-else版本译码器代码如下:

module decoder3_8(
input  wire      in1,
input  wire      in2,
input  wire      in3,
output reg [7:0] out  // 8bit,每一个bit表示一个LED灯
);

always@(*)
    if({in3,in2,in1} == 3'b000)
		out = 8'b0000_0001;  // 表示亮第一盏灯
	else if({in3,in2,in1} == 3'b001)
		out = 8'b0000_0010;   // 表示亮第二个灯,后续递推...
	else if({in3,in2,in1} == 3'b010)
		out = 8'b0000_0100;
	else if({in3,in2,in1} == 3'b011)
		out = 8'b0000_1000;
	else if({in3,in2,in1} == 3'b100)
		out = 8'b0001_0000;
	else if({in3,in2,in1} == 3'b101)
		out = 8'b0010_0000;
	else if({in3,in2,in1} == 3'b110)
		out = 8'b0100_0000;
	else if({in3,in2,in1} == 3'b111)
		out = 8'b1000_0000;
	else 
		out = 8'b0000_0000; // 最后一个else避免latch的产生

endmodule

3.2 case 版本

case版本代码如下:

module decoder3_8(
input  wire      in1,
input  wire      in2,
input  wire      in3,
output reg [7:0] out
);	
always@(*)
	case({in3,in2,in1})
		3'b000 : out = 8'b0000_0001; 
		3'b001 : out = 8'b0000_0010;
		3'b010 : out = 8'b0000_0100;
		3'b011 : out = 8'b0000_1000;
		3'b100 : out = 8'b0001_0000;
		3'b101 : out = 8'b0010_0000;
		3'b110 : out = 8'b0100_0000;
		3'b111 : out = 8'b1000_0000;
	endcase
endmodule

3.3.仿真代码

`timescale 1ns/1ns
module tb_top();

// 模块的接口参数定义
reg in1;
reg in2;
reg in3;
wire [7:0] out;

initial 
	begin
		in1 <= 1'b0;
		in2 <= 1'b0;
		in3 <= 1'b0;		
	end

always #10 in1 <= {$random} % 2;
always #10 in2 <= {$random} % 2;
always #10 in3 <= {$random} % 2;

// 实现译码的功能,使得可以通过3bit能控制8个LED灯
decoder3_8 u0_decoder3_8
(
.in1  (in1),
.in2  (in2),
.in3  (in3),
.out  (out)
);

endmodule

3.4 小知识点

if-else的这种写法是存在优先级的,即第一个if中的条件的优先级最高,后面的if中的条件的优先级依次递减,好在该if中的条件只有一个,也只会产生一种情况,并不会产生优先级的冲突,所以这里优先级的高低关系并不会对最后的功能产生任何影响。而case在 任何时候都不存在优先级的问题,而是通过判断case中的条件来选择对应的输出。

3.4 仿真结果

3-8译码器仿真结果比较


总结

核心思想:如果能够明白在不同场景下,能够用尽可能少的bit位来控制多bit位的数据,那么就完成思想上的升华。其处理手段和流程:输入数据预处理(通过拼接符“{}”)、数据映射(通过条件选择语句进行3-8译码映射)、输出

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值