二、5【FPGA】简单的组合逻辑——设计译码器

前言

学习说明:以下为本人学习笔记

学习视频:是根据野火FPGA视频教程——第六讲
https://www.bilibili.com/video/BV1nQ4y1Z7zN?p=3

学习资料:《数字电子技术基础》清华大学出版社

理论学习

相关数字电路基础理论学习请参考本人的另一个笔记,可以让你深刻理解相关知识

《数字电子技术基础》4.3 若干常用的组合逻辑电路 学习笔记_FPGA-桥的博客-CSDN博客《数字电子技术基础》常用的组合逻辑电路编码器和译码器、数据选择器和数据分配器、加法器、数值比较器、奇偶发生/校验器https://blog.csdn.net/ARM_qiao/article/details/124052097

实战演练 

一、设计规划

1.1 实验(项目)目标

设计仿真验证3-8译码器功能,输入相应的三位二进制编码,输入不同的8位编码,具体理论请看上面理论部分。

1.2 硬件资源

由于板上的按键与LED资源数量不够,所以本章只进行仿真,不进行上板验证。

二、程序设计

2.1 模块框图 

2.2 端口信号及其真值表 

端口信号信息
信号位宽类型功能描述
in_11bitinput输入地址信号1
in_21bitinput输入地址信号2
in_31bitinput输入地址信号3
out8bitoutput输出译码信号
端口真值表
输入(input)输出(output)
in_1in_2in_3out
0000000_0001
0010000_0010
0100000_0100
0110000_1000
1000001_0000
1010010_0000
1100100_0000
1111000_0000

2.3 波形图绘制

通过端口信号真值表绘制波形图

2.4 代码编写

使用两种实现方式:

`timescale 1ns / 1ps
//
// Company: 追逐者——桥的小作坊
// Engineer: 
// 
// Create Date: 2022/04/15 22:38:38
// Design Name: 实现3-8译码器
// Module Name: decoder3_8
// Project Name: 
// Target Devices: 
// Tool Versions: Vivado 2018_3
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:学习代码
// 
//


module decoder3_8(
    input wire in_1,
    input wire in_2,
    input wire in_3,
    
    output reg [7:0] out              //wire型是assign语句;reg型是always语句
    );

//实现方式一:always 中 if-else 实现方法
/*
    always@(*)      //"*"为通配符,表示只要 if 括号中的条件或赋值号右边的变量发生变化
        if( {in_1, in_2, in_3} == 3'b000 )
            out = 8'b0000_0001;                  //_ 仅仅是增强可读性没有任何意义
        else if({in_1, in_2, in_3} == 3'b001)
            out = 8'b0000_0010;
        else if({in_1, in_2, in_3} == 3'b010) 
            out = 8'b0000_0100;
        else if({in_1, in_2, in_3} == 3'b011) 
            out = 8'b0000_1000;
        else if({in_1, in_2, in_3} == 3'b100) 
            out = 8'b0001_0000;
        else if({in_1, in_2, in_3} == 3'b101) 
            out = 8'b0010_0000;
        else if({in_1, in_2, in_3} == 3'b110) 
            out = 8'b0100_0000;
        else if({in_1, in_2, in_3} == 3'b111) 
            out = 8'b1000_0000;
        else              //如果以上考虑的不全面会产生大量的冗余逻辑并产生latch(锁存器)               
            out = 8'b0000_0001; 
*/

//实现方式二: always 中 case 实现方式 
    always@(*)
        case ({in_1, in_2, in_3})
            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;
            
            default : out = 8'b0000_0001;    //也是防止latch的产生
        endcase
endmodule

方式一RTL原理图:串行执行,多路选择器实现

 方式二RTL原理图:并行执行,ROM实现

 三、逻辑仿真

3.1 仿真文件的编写

`timescale 1ns / 1ps
//
// Company: 追逐者——桥的小作坊
// Engineer: 
// 
// Create Date: 2022/04/16 08:10:19
// Design Name: 实现3-8译码器的仿真文件
// Module Name: tb_decoder3_8
// Project Name: 
// Target Devices: 
// Tool Versions: Vivado 2018_3
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:学习代码
// 
//


module tb_decoder3_8();
    
    reg  in_1;
    reg  in_2;
    reg  in_3;
    
    wire [7:0]  out ;
    
    initial 
        begin
            in_1 <= 1'b0;
            in_2 <= 1'b0;
            in_3 <= 1'b0;
        end
    
    always #10 in_1 <= {$random} % 2;
    always #10 in_2 <= {$random} % 2;
    always #10 in_3 <= {$random} % 2;
    
    initial begin
        $timeformat(-12, 0, "ps", 6);
        $monitor("@time %t:in_1=%b in_2=%b in_3=%b out=%b", $time, in_1, in_2, in_3, out);
    end

    decoder3_8  decoder3_8_ins(
    .in_1(in_1),
    .in_2(in_2),
    .in_3(in_3),
    
    .out(out)             //wire型是assign语句;reg型是always、initial语句
    );


endmodule

3.2 仿真波形图对比

 

 通过查看一个时刻的值可以看出,仿真与绘制的波形图相同。

四、上板验证

由于不进行上板验证,所以这里不进行管脚约束及程序固化。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追逐者-桥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值