小梅哥 -从计数器到可控线性序列机(led八部曲)

一、题目1

1让LED灯按照亮0.25秒,灭0.75秒的状态循环亮灭

2.让LED灯按照亮0.25秒,灭0.5秒,亮0.75秒,灭1秒的状态循环亮灭

3.让LED灯按照指定的亮灭模式亮灭,亮灭模式未知,由用户随机指定。以0.25秒为一个变化周期,8个变化状态为一个循环。

4. 让LED灯按照指定的亮灭模式亮灭,亮灭模式未知,由用户随机指定。8个变化状态为 一个循环,每个变化状态的时间值可以根据不同的应用场景选择。

5. 让多个LED灯按照设置的模式各自在一个变化循环内独立亮灭变化

6.每隔10ms,让LED灯的一个8状态循环执行一次(每个状态的变化时间值小一点,方便测试,比如设置为10us)

二、思路1

  1. 亮0.25秒,灭0.75秒,总共1s 。所以定义的counter计数:1s=1000000000ns 1000000000ns/20ns =50000000 49999999二进制: 10111110101111000001111111 26位

三、设计文件1

`timescale 1ns / 1ns
// 让LED灯按照亮0.25秒,灭0.75秒的状态循环亮灭
module counter_led1(clk,reset_n,led

    );
    input clk;
    input reset_n;
    output reg led;
    reg [25:0]counter;//d50_000_000=b10_1111_1010_1111_0000_1000_0000
    parameter MCNT=26'd50_000_000;//以1s为一个周期,1s后计数清零;1s=1000_000_000ns,1000_000_000ns/20ns=50_000_000次
    //计数进程
    always@(posedge clk or negedge reset_n)
    if(!reset_n)
        counter <=0;
    else if(counter == MCNT -1)//此处的是常数,可以直接相减
        counter <=0;
    else
        counter <= counter + 1'b1;
        
    //led进程
    always@(posedge clk or negedge reset_n)
    if(!reset_n)
        led <=0;
    else if(counter == (MCNT/2+MCNT/4) -1)
        led <=1;    
    else if(counter == MCNT -1)
        led <=0;
           
endmodule

四、激励文件1

`timescale 1ns / 1ns
module counter_led_tb(
    );
    reg clk;
    reg reset_n;
    wire led;
    counter_led1 counter_led1_inst(
        .clk(clk),
        .reset_n(reset_n),
        .led(led)
        );
    initial clk = 1'b1;
    always #10 clk=~clk; //延时半个周期10ns,翻转clk值,模拟实现时钟信号
    initial begin
        reset_n = 1'b0;
        #201;//延迟时间不应为周期的整数倍
        reset_n = 1'b1;
//        #2000000000;//等待两秒,看实际状态
//        $stop;
    end
endmodule

五、总结

1、if....else if.....else if语句 和if.....else if.....else的区别:else是无条件的通过 else if后面跟了条件

 always@(posedge clk or negedge reset_n)
    if(!reset_n)
        led <=0;
    else if(counter == (MCNT/2+MCNT/4) -1)
        led <=1;    
    else if(counter == MCNT -1)
        led <=0;

一、题目2

让LED灯按照亮0.25秒,灭0.5秒,亮0.75秒,灭1秒的状态循环亮灭

二、思路2

0.25+0.5+0.75+1=2.5 也就是counter至少要27位

三、设计文件2

`timescale 1ns / 1ns
// 让LED灯按照亮0.25秒,灭0.5秒,亮0.75秒,灭1秒的状态循环亮灭
module counter_led2(clk,reset_n,led

    );
    input clk;
    input reset_n;
    output reg led;
    reg [26:0]counter;//d125_000_000=b111_0111_0011_0101_1001_0100_0000,二进制共需要27位表示
    parameter MCNT=27'd125_000_000;//以2.5s为一个周期,2.5s后计数清零;2.5s=2500_000_000ns,2500_000_000ns/20ns=125_000_000次
//    parameter MCNT=27'd125;//缩小仿真时间,观察仿真图的波形
    //计数进程
    always@(posedge clk or negedge reset_n)
    if(!reset_n)
        counter <=0;
    else if(counter == MCNT -1)//此处的是常数,可以直接相减
        counter <=0;
    else
        counter <= counter + 1'b1;
        
    //led进程
    always@(posedge clk or negedge reset_n)
    if(!reset_n)
        led <=1;
    else if(counter == MCNT/10 -1)//0.25s是一个周期2.5s的1/10;
        led <=0;    
    else if(counter == (MCNT/10+MCNT/5) -1)//0.5s是一个周期2.5s的1/5;
        led <=1;
//    else if(counter == (MCNT/10+MCNT/5)*2 -1)    
    else if(counter == (MCNT/10+MCNT/5+MCNT*3/10) -1)//0.75s是一个周期2.5s的3/10;
        led <=0;
     else if(counter == MCNT -1)
        led <=1;
             
endmodule

四、激励文件2

`timescale 1ns / 1ns
module counter_led_tb(
    );
    reg clk;
    reg reset_n;
    wire led;
    counter_led2 counter_led2_inst(
        .clk(clk),
        .reset_n(reset_n),
        .led(led)
        );
    initial clk = 1'b1;
    always #10 clk=~clk; //延时半个周期10ns,翻转clk值,模拟实现时钟信号
    initial begin
        reset_n = 1'b0;
        #201;//延迟时间不应为周期的整数倍
        reset_n = 1'b1;
//        #2000000000;//等待两秒,看实际状态
//        $stop;
    end
endmodule

五、总结补充2

 always@(posedge clk or negedge reset_n)
    if(!reset_n)
        led <=1;
    else if(counter == MCNT/10 -1)//0.25s是一个周期2.5s的1/10;
        led <=0;    
    else if(counter == (MCNT/10+MCNT/5) -1)//0.5s是一个周期2.5s的1/5;
        led <=1;
//    else if(counter == (MCNT/10+MCNT/5)*2 -1)    
    else if(counter == (MCNT/10+MCNT/5+MCNT*3/10) -1)//0.75s是一个周期2.5s的3/10;
        led <=0;
     else if(counter == MCNT -1)
        led <=1;

采用的是前一段时间加上后一段时间的方式来控制亮灭时间


一、题目3

让LED灯按照指定的亮灭模式亮灭,亮灭模式未知,由用户随机指定。以0.25秒为一个变化周期,8个变化状态为一个循环

二、思路3

LED灯按照指定的亮灭模式亮灭,指的是某一段0.25s可亮可灭,完全由用户指定,所以需要引入一个指定亮灭的端口ctrl ,八段所以ctrl需要八位,通过激励文件对ctrl进行赋值,从而实现用户指定亮灭。

一个周期八段,每段0.25s 8x0.25s = 2s counter 为101_1111_0101_1110_0001_0000_0000 至少27位

三、设计文件3

本来counter是100_000_000次 设计文件中为了减小仿真时间 counter为100

`timescale 1ns / 1ns

// 让LED灯按照指定
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值