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電路圖:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章