FPGA学习-start-02

计数器

描述:LED灯,每500ms状态反转一次。

系统时钟为1s/50MHZ=>20ns,对应的周期为20ns

500ms=500_000_000ns /20 = 25_000_000;

 

counter.v

复制代码
 1 module counter(Clk50M,Rst_n,led); //Rst_n 低电平有效
 2     
 3     input Clk50M; //系统时钟,50M
 4     input Rst_n;   //全局复位,低电平复位
 5 
 6     output reg led;     //led输出,作为寄存器类型输出需要添加reg
 7 
 8     //3_8译码器使用组合逻辑
 9     //这里使用时序逻辑
10     
11     reg [24:0]cnt;    //定义计数器寄存器
12 
13     //计数器自加进程
14     //每来一个时钟上升沿,都自动执行一遍循环
15     always@(posedge Clk50M or negedge Rst_n)
16         if(Rst_n == 1'b0)
17             cnt <= 25'd0;
18         else if(cnt == 25'd24_999_999)
19             cnt <= 25'd0;
20         else
21             cnt <= cnt + 1'b1;
22 
23     //led输出控制进程
24     always@(posedge Clk50M or negedge Rst_n)
25         if(Rst_n == 1'b0)
26             led <= 1'b1;      //按键如果按下(复位状态),led灯复位(灭)
27         else if(cnt == 25'd24_999_999)
28             led <= ~led;      //实现led灯翻转
29         else
30             led <= led;        //led灯保持不变
31 
32 endmodule
复制代码

 

counter_tb.v

复制代码
 1 `timescale 1ns/1ns
 2 `define clock_period 20   //时钟周期是20ns
 3 
 4 module counter_tb;
 5     reg clk;
 6     reg rst_n;
 7 
 8     wire led;
 9 
10     counter counter0(
11        .Clk50M(clk),
12        .Rst_n(rst_n),
13        .led(led)
14     );
15     
16     initial clk = 1;   //仿真初始化时钟clk
17     always #(`clock_period/2) clk = ~clk;   //每10ns产生一个时钟信号
18 
19     initial begin
20         rst_n = 1'b0;   //使按键处于复位状态
21         #(`clock_period *200);  //延时200个时钟周期
22         rst_n = 1'b1;
23         #2000000000; //延时2s
24         $stop;
25     end
26 endmodule
复制代码

 

posted @   KairusZhang  阅读(40)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
主题色彩