此实验在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电路图: