[FPGA] 从画时序图开始的计数器

[复制链接]
 楼主| 不是张角 发表于 2025-3-6 11:39 | 显示全部楼层 |阅读模式
本帖最后由 不是张角 于 2025-3-6 17:20 编辑

#有奖活动# #申请原创#@21小跑堂
该图是通过timegen3所画


  1. module counter(
  2.     input clk,
  3.     input reset_n,
  4.     output reg out
  5.     );

  6.     always @(posedge clk or negedge reset_n)
  7.         if(!reset_n)
  8.             out <= 0;
  9.         else
  10.             out <= 1;
  11.         
  12. endmodule

这句的意思就是每当时钟上升或者复位就进入

看图可以知道在第二个始终上升沿reset_n上拉,但是此时他还是0,所以到下一个时钟上升沿out就会为1

  1. module counter_tb;
  2.     reg clk;
  3.     reg reset_n;
  4.     wire out;

  5.     counter counter_tb0(
  6.         .clk(clk),
  7.         .reset_n(reset_n),
  8.         .out(out)

  9.     );

  10.     initial clk = 1;
  11.     always #10 clk = ~clk;

  12.     initial begin
  13.         reset_n = 0;
  14.         #201;
  15.         reset_n = 1;
  16.         #40000000;
  17.         $stop;            
  18.     end


  19. endmodule
下来就要考虑计数器的情况:
得到的时序图和自己需要得到的一致


  1. parameter MAX_COUNT_S = 'd49_999_999;//一秒
  2.     parameter MAX_COUNT_M = 'd59;//一分钟
  3.     reg [25:0]counter_delay_s;
  4.     reg [7:0]counter_delay_m;//分钟

  5. //HS秒
  6.     always @(posedge clk or negedge reset_n) //表示只要是始终上升沿或复位下降沿都会运行
  7.         if(!reset_n)
  8.             counter_delay_s <= 'd0;
  9.         else if(counter_delay_s == MAX_COUNT_S)
  10.             counter_delay_s <= 0;
  11.         else
  12.             counter_delay_s <= counter_delay_s + 1'b1;

  13. //HS分
  14.         always @(posedge clk or negedge reset_n) //表示只要是始终上升沿或复位下降沿都会运行
  15.         if(!reset_n)
  16.             counter_delay_m <= 'd0;
  17.         else if(counter_delay_s == MAX_COUNT_S && counter_delay_m == MAX_COUNT_M)//当一分钟时候
  18.             counter_delay_m <= 0;
  19.         else if(counter_delay_s == MAX_COUNT_S)
  20.             counter_delay_m <= counter_delay_m + 1'b1;

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评论

感谢分享,欢迎了解并参与原创奖励活动: https://bbs.21ic.com/icview-3431776-1-1.html  发表于 2025-3-25 15:53
穷得掉渣大侠 发表于 2025-4-16 10:19 | 显示全部楼层
我注意到在计数器的代码中,out的值在复位后直接变为1,这似乎不太符合常规的计数器逻辑,通常复位后应该从0开始计数。
暗夜幽灵骑士 发表于 2025-4-27 09:49 | 显示全部楼层
这个时序图和代码解释得很清楚,学习了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

3

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部