(资料图片仅供参考)
FPGA中一切与时间有关的电路都会使用到计数器计数是一种最简单的基本运算,计数器就是实现这种运算的逻辑电路,计数器在数字系统中主要是对脉冲的个数进行计数,以实现测量\计数和控制的功能,同时兼有分频功能.计数器在数字系统中应用广泛,如电子计算机的控制器中对指令地址进行计数,以便顺序取出下一条指令,在运算器中做乘法,除法运算时记下加法\减法次数;有如在数字仪器中对脉冲的计数等计数器在FPGA最常用的时序逻辑电路,通过计数器可以知道各个信号之间的关系计数器一般从0开始计数,计满清0或者是计到一定次数清0
计数器关键:什么时候开始计数,什么时候清零
module counter#( parameter CNT_MAX = 25"d24_999_999 // 例化模块的参数传递接口,参数之间加,)( input wire sys_clk, input wire sys_rst_n, output reg led_out); // 声明计数器变量,位宽25bit reg [24:0] cnt; // 参数定义 // 计数器的计数最大值 // parameter可以用与模块内部,也可以用于参数例化模块的参数传递 parameter CNT_MAX = 25"d24_999_999; // 普通模块参数定义 // localparam CNT_MAX = 25"d24_999_999; // 只用于模块内部 counter #( .CNT_MAX (100); // 实例化的时候参数也写在这个位置,并且可以修改参数 ) counter_inst1 // 带有参数的模块实例化的模块名称写在参数列表之后 ( .sys_clk (sys_clk), .sys_rst_n (sys_rst_n), .led_out (led_out) ); counter #( .CNT_MAX (100); // 实例化的时候参数也写在这个位置,并且可以修改参数 ) // 多个模块实例化可以传递不同的参数 counter_inst1 ( .sys_clk (sys_clk), .sys_rst_n (sys_rst_n), .led_out (led_out) );endmodule
module counter#( parameter CNT_MAX = 25"d24_999_999; // 例化模块的参数传递接口)( input wire sys_clk, input wire sys_rst_n, output reg led_out); // 声明计数器变量,位宽25bit reg [24:0] cnt; // 计数器变量赋值 always @ (posedge sys_clk or negedge sys_rst_n) begin if(sys_rst_n == 1"b0) begin cnt <= 25"d0; end else if(cnt = CNT_MAX) begin cnt <= 25"b0; end else cnt <= cnt + 25"d1; end // 输出信号赋值 always@(posedge sys_clk pr negedge sys_clk_n) begin if(sys_rst_n == 1"b0) led_out <= 1"b0; else if(cnt == CNT_MAX) led_out <= ~led_out; else led_out <= led_out; endendmodule
`timescale 1ns/1nsmodule tb_counter(); reg sys_clk; reg sys_rst_n; wire led_out; initial begin sys_clk = 1"b1; sys_rst_n <= 1"b0; #20; sys_rst_n <= 1"b1; end always #10 sys_clk = ~sys_clk; counter #( .CNT_MAX (25"d24) ) counter_inst ( .sys_clk (sys_clk), .sys_rst_n (sys_rst_n), .led_out (led_out) );endmodule
module counter#( parameter CNT_MAX = 25"d24_999_999; // 例化模块的参数传递接口)( input wire sys_clk, input wire sys_rst_n, output reg led_out); // 声明计数器变量,位宽25bit reg [24:0] cnt; reg cnt_flag; // 计数器变量赋值 always @ (posedge sys_clk or negedge sys_rst_n) begin if(sys_rst_n == 1"b0) begin cnt <= 25"d0; end else if(cnt = CNT_MAX) begin cnt <= 25"b0; end else cnt <= cnt + 25"d1; end // 计数器标志位赋值 always @ (posedge sys_clk or negedge sys_rst_n) if(sys_rst_n == 1"b0) cnt_flag <= 1"b0; else if(cnt ==(CNT_MAX - 25"d1)) cnt_flag <= 1"b1; else cnt_flag <= 1"b0; // 输出信号赋值 always@(posedge sys_clk pr negedge sys_clk_n) begin if(sys_rst_n == 1"b0) led_out <= 1"b0; else if(cnt_flag == 1"b1) led_out <= ~led_out; else led_out <= led_out; endendmodule
X 关闭
Copyright © 2015-2022 人人字画网版权所有 备案号:粤ICP备18023326号-36 联系邮箱:8557298@qq.com