ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

5 - 时序逻辑代码设计与仿真

2021-11-19 22:32:50  阅读:233  来源: 互联网

标签:仿真 clk res 代码 脉冲 pulse 时序 计数 num


5 - 时序逻辑代码设计与仿真

秒计数器(0-9 循环计数)

image-20211119162832961

把系统时钟进行分频,得到秒脉冲,对秒脉冲进行计数。

image-20211119163730565

con_t 是秒脉冲分频计数器,需要对 24M 来计数,至少需要 25 位。

s_pulse 是秒脉冲尖,con_t 为 0 时为1,1 秒有 24M 个脉冲,但只有 1 个脉冲时 s_pulse=1。

s_num 是秒计数器,看到 s_pulse 为 1 时计数。

//2021.11.19 lyw
//Second counter 0-9 cycles

`timescale 1ns/10ps
module s_counter (
                clk,
                res,
                s_num
);
input           clk;
input           res;
output[3:0]     s_num;

parameter       frequency_clk = 24; //24MHz
reg[24:0]       con_t;  //Second pulse frequency division counter
reg             s_pulse;    //Second pulse tip
reg[3:0]        s_num;

always @(posedge clk or negedge res) begin
    if(~res) begin
        con_t<=0;
        s_pulse<=0;
        s_num<=0;
    end
    else begin
        //without 'if' con_t will be 0 until overflow rather than 24M
        if (con_t == frequency_clk*1000000-1) begin
            con_t<=0;
        end
        else begin
            con_t<=con_t+1;
        end

    if (con_t==0) begin
        s_pulse<=1;
    end
    else begin
        s_pulse<=0;
    end

    if (s_pulse) begin
        if (s_num==9) begin
            s_num<=0;
        end
        else begin
            s_num<=s_num+1;
        end     
    end
    end
end
    
endmodule

//----testbench of s_counter----
module s_counter_tb;
reg             clk;
reg             res;
wire[3:0]       s_num;

s_counter s_counter (
                .clk(clk),
                .res(res),
                .s_num(s_num)
);

initial begin
            clk<=0;
            res<=0;
    #17     res<=1;
    #1000   $stop;
end

always #5   clk=~clk;
    

endmodule

PS:所有的 if…else 都必须写在 always 里面否则会编译报错。

仿真波形

image-20211119195231657

刚从 0 计数到 1,仿真就结束了。

因为 #1000 $stop; 里面的 1000 选的太短了,如何选择合适的时长?

点击 【continue run】+【break】继续画波形,因为 clk 太密了,把 clk 删掉画波形会更快。

但画完以后还是计数到 1,因为 24M 实在太大了,很难仿真完,这里把分频系数改小 1000 倍。

改完 reload,重新编译,并配合【continue run】+【break】。

image-20211119200411787

同时也得到了合适的时间,修改时间后重新画图。

image-20211119200950051

可以从图中观察得到:每过24000个时钟周期,s_pulse 出现一个 1,s_num 进行一次计数。(变化后下一个时钟上升沿才能看到)

image-20211119201349069

在放大的过程中需要用到的两个功能:

image-20211119201614207

上面的框是局部放大,选择一块区域放大;下面的框是以金色的线为中心放大。

数码管 0-9 秒显示

image-20211119202125119

数码管 0-59 秒显示

image-20211119202315974

本节有个问题是关于秒计数器

24MHz 即 24000000 个时钟为 1 秒,那一个时钟周期应该会是 1/24000000 秒,所以`timescale 1ns 这里是不是要改成1000/24。


学习内容总结自网络,主讲教师北交李金诚。

标签:仿真,clk,res,代码,脉冲,pulse,时序,计数,num
来源: https://blog.csdn.net/weixin_44356019/article/details/121432279

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有