此實驗在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電路圖: