Loading

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 @ 2023-01-11 11:36  KairusZhang  阅读(35)  评论(0编辑  收藏  举报