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