FPGA 04 线性序列机——LED实验

文章详细描述了一系列关于LED灯的控制实验,包括单个灯的定时亮灭、用户自定义模式、多个灯的独立操作以及定时状态循环。涉及的代码设计、testbench和仿真波形展示了各种控制逻辑的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1 实验1:单个灯,2条件亮灭

1.1设计代码

1.2 testbench

1.3 仿真波形

2 实验2:单个灯,4条件亮灭

2.1 设计代码

2.2 testbench

2.3 仿真波形

3 实验3:单个灯,用户指定

3.1 设计代码

3.2 testbench

3.3 仿真波形

4 实验4:单个灯,用户指定2

4.1 设计代码

4.2 testbench

4.3 仿真波形

5 实验5:多个灯,独立亮灭

5.1 设计代码

5.2 testbench

5.3 仿真波形

 6 实验6:每10ms,led状态循环一次

6.1 设计代码

6.2 testbench

6.3 仿真波形

 7 实验7:每隔10ms,led状态循环一次

7.1 设计代码

7.2 testbench

7.3 仿真波形


1 实验1:单个灯,2条件亮灭

        Q:亮0.25s,灭0.75s循环

1.1设计代码

dge clk or negedge reset_n)
    if(!reset_n)
        counter <= 0;
    else if(counter == MCNT-1)
        counter <= 0;
    else
        counter <= counter+1'b1;
    
    reg [2:0]cnt;
    always@(posedge clk or negedge reset_n)
    if(!reset_n)
        cnt <= 0;
    else if(counter == MCNT-1)
        cnt <= cnt+1'd1;
    else if(cnt == 4)
        cnt <= 0;
    
    always@(posedge clk or negedge reset_n)
    if(!reset_n)
        led <= 0;
    else case(cnt)
        0:led = 0;
        1:led = 1;
        2:led = 0;
        3:led = 0;
        4:led = 0;
        default:led = 0;
    endcase 
    
endmodule

1.2 testbench

        将MCNT设置为12500,为了将循环时间从1s缩短至1ms。

`timescale 1ns / 1ps

module LSM_LED_1_tb;
    reg clk;
    reg reset_n;
    wire led;
    
    LSM_LED_1 LSM_LED_1(
        .clk(clk),
        .reset_n(reset_n),
        .led(led)
        );
    defparam LSM_LED_1.MCNT = 12500;
    
    initial clk = 1;
    always #10 clk = ~clk;
    
    initial begin
        reset_n = 0;
        #201;
        reset_n = 1;
        #5000000;
        $stop;
    end
endmodule

1.3 仿真波形

        灯亮0.25ms,灭0.75ms,整个循环为1ms。

 

2 实验2:单个灯,4条件亮灭

        Q:亮0.25s,灭0.5s,亮0.75s,灭1s循环

2.1 设计代码

module LSM_LED_2(
    clk,
    reset_n,
    led
    );
    
    input clk;
    input reset_n;
    output reg led;
    
    reg [25:0]counter;
    parameter MCNT = 12500000;
    always@(posedge clk or negedge reset_n)
    if(!reset_n)
        counter <= 0;
    else if(counter == MCNT-1)
        counter <= 0;
    else
        counter <= counter+1'b1;
    
    reg [3:0]cnt;
    always@(posedge clk or negedge reset_n)
    if(!reset_n)
        cnt <= 0;
    else if(counter == MCNT-1)
        cnt <= cnt+1'd1;
    else if(cnt == 10)
        cnt <= 0;
        
    always@(posedge clk or negedge reset_n)
    if(!reset_n)
        led <= 0;
    else case(cnt)
        0:led = 0;
        1:led = 1;
        2:led = 0;
        3:led = 0;
        4:led = 1;
        5:led = 1;
        6:led = 1;
        7:led = 0;
        8:led = 0;
        9:led = 0;
        10:led = 0;
        default:led = 0;
    endcase
endmodule

2.2 testbench

        同1.2testbench。

2.3 仿真波形

3 实验3:单个灯,用户指定

        Q:用户指定亮暗模式,0.25s一个状态,8个状态1个循环

3.1 设计代码

`timescale 1ns / 1ps
//用户指定状态,0.25s一个状态,8个状态为1个循环
module LSM_LED_3(
    clk,
    reset_n,
    ctrl,
    led
    );
    
    input clk;
    input reset_n;
    input [7:0]ctrl;
    output reg led;
    
    reg [25:0]counter;
    parameter MCNT = 12500000;
    
    always@(posedge clk or negedge reset_n)
    if(!reset_n)
        counter <= 0;
    else if(counter == MCNT-1)
        counter <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值