Verilog学习——三八译码器实现跑马灯

本文介绍了使用Verilog语言设计并实现了一个跑马灯电路,通过模块调用和三八译码器控制LED阵列,同时提供了仿真模块测试计数器和选择器的工作状态。

一、代码实现

设计定义:利用模块的调用,通过三八译码器来实现跑马灯。

`timescale 1ns / 1ns

module led_run2(
    input        clk  ,
    input        rstn ,
    output[7:0]  led
    );
    
    reg[24:0]    cnt  ;
    reg[2:0]     sel  ;

    always @(posedge clk or negedge rstn) begin
        if(!rstn)
            cnt <= 0;
        else if(cnt == 25_000_000-1)
            cnt <= 0;
        else
            cnt <= cnt + 1'd1;
        
    end
    always @(posedge clk or negedge rstn) begin
        if(!rstn)
            sel <= 0;
        else if(cnt == 25_000_000-1)
            sel <= sel + 1'd1;
    end
    decoder_3_8 inst0(
    .S0  (sel[0]) ,
    .S1  (sel[1]) ,
    .S2  (sel[2]) ,
    .out (led)   //output reg[7:0] led
    );
endmodule

二、仿真

`timescale 1ns / 1ns

module led_run_tb();
### Verilog 实现三八译码器仿真方法 在 Verilog实现三八译码器并对其进行仿真是常见的数字电路设计实践。以下是基于已有引用内容以及标准做法的一个完整的解决方案。 #### 1. **三八译码器模块** 首先,构建一个基本的三八译码器模块。此部分可以参考已有的代码结构: ```verilog `timescale 1ns / 1ps module decoder_3_8 ( input S0, input S1, input S2, output reg [7:0] out ); always @(*) begin case ({S2, S1, S0}) 3&#39;b000: out = 8&#39;b0000_0001; 3&#39;b001: out = 8&#39;b0000_0010; 3&#39;b010: out = 8&#39;b0000_0100; 3&#39;b011: out = 8&#39;b0000_1000; 3&#39;b100: out = 8&#39;b0001_0000; 3&#39;b101: out = 8&#39;b0010_0000; 3&#39;b110: out = 8&#39;b0100_0000; 3&#39;b111: out = 8&#39;b1000_0000; default: out = 8&#39;b0000_0000; endcase end endmodule ``` 这段代码实现三八译码器的核心逻辑功能[^3]。 --- #### 2. **测试平台(Testbench)** 为了验证该模块的功能是否正确,需要编写一个测试平台来进行仿真。以下是一个简单的测试平台示例: ```verilog `timescale 1ns / 1ps module tb_decoder_3_8; // Inputs reg S0; reg S1; reg S2; // Outputs wire [7:0] out; // Instantiate the Unit Under Test (UUT) decoder_3_8 uut ( .S0(S0), .S1(S1), .S2(S2), .out(out) ); initial begin $dumpfile("decoder_3_8.vcd"); $dumpvars(0, tb_decoder_3_8); // Initialize inputs S0 = 0; S1 = 0; S2 = 0; // Apply all possible combinations of inputs repeat (8) begin #10; // Wait for 10 time units between each test case {S2, S1, S0} = {S2, S1, S0} + 1; // Increment the input values end #10; // Final delay before finishing simulation $finish; end endmodule ``` 这个测试平台会依次遍历所有的输入组合,并记录输出结果到波形文件中以便观察其行为[^1]。 --- #### 3. **运行仿真工具** 完成以上两步之后,可以选择合适的仿真工具(如 ModelSim、Vivado Simulator 或 Icarus Verilog)。具体操作如下: - 使用命令行启动仿真: ```bash iverilog -o sim.out decoder_3_8_tb.v && vvp sim.out ``` - 如果使用图形化界面,则加载 `.v` 文件至相应环境,并执行仿真流程。 通过查看生成的波形图,能够确认每组输入对应的输出是否满足预期。 --- #### 4. **扩展应用实例:跑马灯控制** 如果希望进一步拓展三八译码器的应用场景,可将其嵌入更复杂的系统之中,比如用于驱动 LED 跑马灯效果。这种情况下,可以通过计数器动态改变选通信号 `sel` 的值来触发不同的亮灭状态[^2]。 ```verilog `timescale 1ns / 1ns module led_run2( input clk, input rstn, output reg [7:0] led ); reg [24:0] cnt; reg [2:0] sel; always @(posedge clk or negedge rstn) begin if (!rstn) begin cnt <= 0; sel <= 0; end else if (cnt == 25_000_000 - 1) begin cnt <= 0; sel <= sel + 1&#39;d1; end else begin cnt <= cnt + 1&#39;d1; end end wire [7:0] decoded_output; decoder_3_8 inst0(.S0(sel[0]), .S1(sel[1]), .S2(sel[2]), .out(decoded_output)); assign led = ~decoded_output; // Invert to match typical LED behavior endmodule ``` 在此基础上调整参数即可适配实际硬件需求。 --- ### 总结 上述方案提供了从基础模块开发到高级应用场景的一整套解决思路。无论是单独验证还是集成于更大规模的设计当中,均具备良好的适用性和灵活性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值