FPGA 计数器验证与设计 Verilog语言

案例:计数器

功能:让LED每500ms状态翻转一次

1.设计定义–>分析,将问题转化控制电路

分析:FPGA系统时钟50MHz,对应周期20ns,计数次数=50ms/20ns=25_000_000
rst_n低电平复位,高电平计数,计数记到25_000_000,计数清零,led状态翻转。

计数器模块设计
在这里插入图片描述
2.综合

计数器模块.v

module counter(clk50M,rst_n,led);
/*
功能:让LED每500ms状态翻转一次
分析:FPGA系统时钟50MHz,对应周期20ns,计数次数=50ms/20ns=25_000_000
rst_n低电平复位,高电平计数,计数记到25_000_000,计数清零,led状态翻转
*/
input clk50M;//输入信号
input rst_n;//复位信号,低电平有效
output led;//输出信号

reg led;
reg [24:0]cnt;
 
always @(posedge clk50M or negedge rst_n)
 begin
 if(rst_n == 1'b0)
  begin
  cnt<=25'd0;
  led<=1'b1;  
  end
 else
  begin
  cnt<=cnt+1;
  if(cnt == 25'd25_000_000)
   begin
	cnt<=25'd0;
   led=~led;	
	end 
  end
 end

endmodule

计数器模块仿真

`timescale 1ns/1ns
`define clock_period 20  //频率50MHz,周期20ns,
module counter_tb;

reg clk50M,rst_n;//输入信号
wire led;//输出信号

counter counter1(//端口关联激励信号
	 .clk50M(clk50M),
	 .rst_n(rst_n),
	 .led(led)
	 );

initial
 begin
 rst_n=0;clk50M=1;
 #(`clock_period*2) rst_n=1;
 #2000_000_000 $stop; 
 end

 always//时钟周期20ns,每10ns翻转一次
 #(`clock_period/2) clk50M=~clk50M;
 
endmodule

3.布局布线
4.时序仿真与功能仿真
在这里插入图片描述
在这里插入图片描述
5.编程下载和在线测试

猜你喜欢

转载自blog.csdn.net/weixin_43319452/article/details/112787914