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

2019-04-14 08:19发布

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