FPGA学习笔记(四)——计数器设计与验证

此实验在FPGA学习笔记(三)中记录一遍了,此文再加入相应的电路图。

实验内容:

LED在计数器的控制下,每500ms,状态翻转一次。

系统时钟为50M,对应的时钟周期是20ns。

500ms = 500 000us = 500 000 000 ns

则500ms翻转一次,对应25 000 000个时钟周期之后翻转一次,则需要一个计数器寄存器对时钟周期进行计数统计。

500 000 000ns/20 = 25 000 000个周期

源代码:

module main(
	Clk_100M,
	Rst_n,
	led
    );
input Clk_100M;//系统时钟,100M
input Rst_n;//全局复位,低电平复位

output reg led;
/*********************************/
//计数器计数控制进程
reg [24:0] cnt;//计数器寄存器
always@(posedge Clk_100M or negedge Rst_n) begin
if(!Rst_n)
    cnt <= 25'd0;
else if(cnt == 25'd24_999_999)
    cnt <= 25'd0;
else 
    cnt <= cnt + 1'b1;
end
/*********************************/
//led控制进程
always@(posedge Clk_100M or negedge Rst_n) begin
if(!Rst_n)
    led <= 1'b0;
else if(cnt == 25'd24_999_999)
    led <= ~led;
else
    led <= led;
end
/*********************************/
endmodule

仿真代码:
 

`timescale 1ns / 1ps

`define clock_period 20
module main_test;

// Inputs
reg Clk_100M;
reg Rst_n;

// Outputs
wire led;

// Instantiate the Unit Under Test (UUT)
main uut (
	.Clk_100M(Clk_100M), 
	.Rst_n(Rst_n), 
	.led(led)
);

initial begin
    // Initialize Inputs
    Clk_100M = 1;
    Rst_n = 0;

    // Wait 100 ns for global reset to finish
    #(`clock_period*200);
    Rst_n = 1;
    #2000_000_000;
    $stop;
        
    // Add stimulus here

end
always #(`clock_period/2) Clk_100M = ~Clk_100M; 
endmodule

整体电路图:

 计数器cnt电路图:

猜你喜欢

转载自blog.csdn.net/weixin_38621214/article/details/87386248