左边为输入信号,右边为输出信号,clk为时钟,rst为复位信号,本代码计划当时钟信号变化CNT_MAX+1个周期时将led_out变化一次。
代码如下,其中cnt为计数器,cnt_flag为标志进行,使用标志信号的原因是可以更好地节省fpga的资源。
module counter
#(
parameter CNT_MAX = 25'd24_999_999
)
(
input wire sys_clk ,
input wire sys_rst_n ,
output reg led_out
);
reg [24:0] cnt ;
reg cnt_flag ;
//for cnt
always @(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==1'b0)
cnt<=25'b0;
else if(cnt==CNT_MAX)
cnt<=25'b0;
else
cnt<=cnt+25'b1;
//for cnt_flag
always @(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==1'b0)
cnt_flag<=1'b0;
else if(cnt==CNT_MAX-1)
cnt_flag<=1;
else
cnt_flag<=0;
//for led_out
always @(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==1'b0)
led_out<=1'b0;
else if(cnt_flag==1'b1)
led_out<=~led_out;
else
led_out<=led_out;
endmodule
最终的RTL视图如下:
编写仿真文件:
`timescale 1ns/1ns
module tb_counter();
reg sys_clk ;
reg sys_rst_n ;
wire led_out ;
initial begin
sys_clk=1'b1;
sys_rst_n<=1'b0;
#20
sys_rst_n<=1'b1;
end
always #10 sys_clk=~sys_clk;
counter #(.CNT_MAX(25'd12)
) counter_inst
(
.sys_clk (sys_clk ),
.sys_rst_n (sys_rst_n ),
.led_out (led_out )
);
endmodule
最终的仿真波形图如下:
从图中可以看出仿真成功,若连接FPGA的led灯接口,可实现灯每隔13个时钟周期闪烁一次。