• 分频流水灯


    开发板中,有一个内置的时钟周期,为100MHZ,我们需要使用这样一个时钟信号来设计一个1HZ的流水灯(使用8个led灯),也就是一秒钟有一个灯是亮起的,依次从左到右。
    另外还有一个低有效的复位使能端、一个同步保持使能(有效时流水灯亮起状况不变)

    首先,1HZ和100MHZ的时钟周期需要进行转换,然后利用新的时钟信号进行led灯信号变更即可。

    思路是这样的,既然是100MHZ,也就是时钟周期,那么我们就需要进行计数,当计数到10^8时,才是一个新的时钟信号的一个周期;但是我们知道时钟信号是会有一个高低电平翻转的,也就是说当计数到10^8的一半时,需要有一个信号翻转

    分频就是将原来高频率的周期转变为低频率的周期,通过计数的方式

    一个周期包含一次翻转,即在一个周期中,时钟信号有一半时间是1,一半时间是0,才能有上升沿与下降沿检测出来

    1. `timescale 1ns / 1ps
    2. module divider(
    3. input rst_n_i, //一个低有效的复位使能
    4. input clk_i,
    5. output reg clk_o
    6. );
    7. reg [28:0]cnt = 'b0;
    8. always@(posedge clk_i or negedge rst_n_i) begin
    9. if(rst_n_i == 1'b0) //复位使能有效
    10. cnt <= 'b0;
    11. else if(cnt == 9999_9999) //一个周期
    12. cnt <= 'b000;
    13. else //计数器递增
    14. cnt <= cnt + 1'b1;
    15. if(cnt <= 4999_9999 && rst_n_i) //翻转
    16. clk_o <= 1'b1;
    17. else
    18. clk_o <= 1'b0;
    19. end
    20. endmodule

     当数到1e8,即0~9999 9999时,分频后的周期过去了一个,就是说在相同的时间内,小周期进行了1e8次,大周期才进一次,每次周期都包含0和1的部分,都是1在周期前半部分,0在周期后半部分.

    cnt的位数与被记录的数字(分频大小)有关,分频越大,cnt位数越多

    即cnt连接新旧周期,cnt的值确定大周期此时的值,cnt所记录到的最大值决定分频的倍数

    cnt与其所能达到的最大值之间的比值,表示大周期此时进行到的百分比

    在一半之前,表示大周期还没到一半,大周期此时值为1

    此时clk_o信号就是1HZ信号

    1. `timescale 1ns / 1ps
    2. module flowLED(
    3. input clk_i,
    4. input rst_n_i, //低有效
    5. input en_i, //高有效
    6. output reg [7:0]led
    7. );
    8. reg [2:0]middle='b000; //中间变量计数器
    9. always@(posedge clk_i or negedge rst_n_i) begin
    10. if(rst_n_i == 1'b0) //复位使能
    11. begin
    12. middle <= 3'b000;
    13. led <=8'b0000_0000;
    14. end
    15. else if(en_i == 1'b0) //保持使能
    16. led <= led;
    17. else if(middle >= 'b111)
    18. middle <= 1'b0;
    19. else
    20. middle <= middle +1'b1;
    21. case(middle)
    22. 3'b000: led = 8'b0000_0001;
    23. 3'b001: led = 8'b0000_0010;
    24. 3'b010: led = 8'b0000_0100;
    25. 3'b011: led = 8'b0000_1000;
    26. 3'b100: led = 8'b0001_0000;
    27. 3'b101: led = 8'b0010_0000;
    28. 3'b110: led = 8'b0100_0000;
    29. 3'b111: led = 8'b1000_0000;
    30. endcase
    31. end
    32. endmodule

    利用新的时钟信号,设置一个计数器来控制led灯中亮起的部分(其实属于一个38译码器) 

  • 相关阅读:
    一次Python无法安装模块的问题探索与解决之旅
    [SpringBoot系列]缓存解决方案
    Spire.OCR for .NET 1.9.0 Crack
    MSQL系列(五) Mysql实战-索引最左侧匹配原则分析及实战
    RecSysOps: 大规模推荐系统运维最佳实践
    串联起深度学习的整体,以及其他领域
    【网络协议】聊聊HTTPDNS如何工作的
    pytorch基础学习(2)
    3.02_python+Django+mysql实现pdf转word项目_项目部署-Apache下载安装
    CAS、AtomicInteger、synchronized原理
  • 原文地址:https://blog.csdn.net/m0_73553411/article/details/133948238