【Verilog 3-8译码器设计与仿真:深入理解case语句与组合逻辑】

Verilog 3-8译码器设计与仿真:深入理解case语句与组合逻辑

一、概述

在数字电路设计中,3-8译码器是一个基础而重要的组件,它能够将3位二进制输入转换为8位输出,每次只有一位输出为高电平。本文将通过一个完整的Verilog实现,深入讲解如何使用case语句实现3-8译码器,并配合Testbench进行功能验证。

二、3-8译码器原理

3-8译码器的功能是将3位二进制码转换为8位独热码(One-Hot Code):

输入:3位二进制信号(in[2:0])

输出:8位信号(out[7:0])

使能信号:en,控制译码器是否工作

完整真值表:

三、Verilog代码详解

3.1 主模块设计

c 复制代码
module test(
    input          en,      // 使能信号
    input   [2:0]  in,      // 3位输入信号
    
    output reg [7:0]   out   // 8位输出信号,定义为reg类型
);

always @(*) begin
    if(en) begin
        case(in)
            3'b000 : out = 8'b0000_0001;  // 输入000,输出第0位为1
            3'b001 : out = 8'b0000_0010;  // 输入001,输出第1位为1
            3'b010 : out = 8'b0000_0100;  // 输入010,输出第2位为1
            3'b011 : out = 8'b0000_1000;  // 输入011,输出第3位为1
            3'b100 : out = 8'b0001_0000;  // 输入100,输出第4位为1
            3'b101 : out = 8'b0010_0000;  // 输入101,输出第5位为1
            3'b110 : out = 8'b0100_0000;  // 输入110,输出第6位为1
            3'b111 : out = 8'b1000_0000;  // 输入111,输出第7位为1
        endcase
    end
    else begin
        out = 8'b0000_0000;  // 使能无效时,输出全0
    end
end

endmodule

代码解析:

模块接口定义

输入:en(1位使能),in[2:0](3位输入)

输出:out[7:0](8位输出),使用reg类型是因为在always块中赋值

组合逻辑设计

使用always @()表示组合逻辑,敏感列表中的 表示所有输入信号

当en=1时,根据in的值选择对应的输出

当en=0时,无论输入为何值,输出都为0

case语句使用

case语句是Verilog中实现多路选择的高效方式

每个case项对应一个输入值和对应的输出

下划线_用于提高可读性,不影响数值

3.2 Testbench设计

c 复制代码
`timescale 1ns/1ps  // 时间单位1ns,精度1ps

module test_tb();

    reg    en;           // 测试激励:使能信号
    reg    [2:0]   in;   // 测试激励:输入信号
    wire   [7:0]   out;  // 观察响应:输出信号
    
    // 实例化被测试模块
    test u_test(
        .en    (en),
        .in    (in),
        .out   (out)
    );
    
    // 测试激励生成
    initial begin
        // 初始状态
        en = 1'b0;
        in = 3'b000;
        
        // 测试序列
        #20  en = 1'b1; in = 3'b001;  // 20ns后,测试001
        #30  en = 1'b1; in = 3'b011;  // 再30ns后,测试011
        #25  en = 1'b1; in = 3'b101;  // 再25ns后,测试101
        #20  en = 1'b1; in = 3'b100;  // 再20ns后,测试100
        #25  en = 1'b0; in = 3'b101;  // 测试使能无效的情况
        #35  en = 1'b0; in = 3'b111;
        #25  en = 1'b1; in = 3'b000;  // 测试000输入
        #35  en = 1'b0; in = 3'b111;
        
        #300  $stop;  // 300ns后停止仿真
    end

endmodule

Testbench解析:

时间单位和精度

timescale 1ns/1ps:仿真的基本时间单位是1ns,精度为1ps

信号定义

使用reg类型定义需要驱动的输入信号

使用wire类型定义需要观察的输出信号

测试激励生成

使用initial块生成测试序列

#表示延迟,如#20表示延迟20个时间单位

测试覆盖了部分输入组合和使能信号的变化

实例化被测试模块

使用命名端口连接方式,提高代码可读性

四、仿真截图

相关推荐
Risehuxyc2 小时前
<= 是Verilog中的非阻塞赋值操作符
fpga开发
扣脑壳的FPGAer2 小时前
傅里叶级数、傅里叶变换、Z变换、数字滤波器
fpga开发·信号处理
Risehuxyc4 小时前
HDL中assigned 与 always 有什么区别?
fpga开发
我爱C编程6 小时前
【3.5】固定旋转因子系数乘法模块的FPGA实现1——45°旋转因子和高阶蝶形修正因子
fpga开发·固定旋转因子·旋转因子
Terasic友晶科技16 小时前
答疑解惑 | DE25-Nano开发板串口在访问FPGA端外设LED时卡死,无任何反应
fpga开发·串口·led·de25-nano
尤老师FPGA20 小时前
LVDS系列46:Xilinx Ultrascale系 ADC LVDS接口参考方法(八)
fpga开发
何如呢1 天前
uw_inserter
fpga开发
何如呢1 天前
SC-FDE_tx_comb_part
fpga开发
LCMICRO-133108477461 天前
长芯微LCMDC8588完全P2P替代ADS8588,是一款16位、8通道同步采样的逐次逼近型(SAR)模数转换器
stm32·单片机·嵌入式硬件·fpga开发·硬件工程·模数转换器