概述:
计数器是FPGA开发中最常用的电路,列如通讯中记录时钟个数,跑马灯中时间记录,存储器中地址的控制等等。本节给出向上计数器,上下计数器以及双向计数器案例。
内容
1. 向上计数器
2.向下计数器
3.向上向下计数器
1. 向上计数器
代码
module regtest(input clk , // system clock 50Mhz on boardinput rst_n, // system rst, low active input en_clk,input load_enable,input [3:0] load_data,output [3:0] y1 // output signal);
reg [3:0] up_cnt;
assign y1 = up_cnt;
always @(posedge clk or negedge rst_n)if (rst_n==0)up_cnt <= 0;else if (en_clk)if (load_enable)up_cnt <= load_data;elseup_cnt <= up_cnt + 1;endmodule
RTL结构图
技术原理图,基本的计数器结构是由触发器与组合逻辑来设计的,在FPGA中触发器有fdc来实现,组合逻辑使用lut查找表来实现,
2.向下计数器
代码
module regtest(input clk , // system clock 50Mhz on boardinput rst_n, // system rst, low active input en_clk,input load_enable,input [3:0] load_data,output [3:0] y1 // output signal);
reg [3:0] down_cnt;
assign y1 = down_cnt;
always @(posedge clk or negedge rst_n)if (rst_n==0)down_cnt <= 0;else if (en_clk)if (load_enable)down_cnt <= load_data;elsedown_cnt <=down_cnt- 1;endmodule
RTL结构图
技术原理图
3.向上向下计数器
代码
module regtest(input clk , // system clock 50Mhz on boardinput rst_n, // system rst, low active input en_clk,input load_enable,input [3:0] load_data,input up,output [3:0] y1 // output signal);
reg [3:0] up_down_cnt;
assign y1 = up_down_cnt;
always @(posedge clk or negedge rst_n)if (rst_n==0)up_down_cnt <= 0;else if (en_clk)if (load_enable)up_down_cnt <= load_data;else if (up)up_down_cnt <=up_down_cnt+ 1;elseup_down_cnt <=up_down_cnt- 1;endmodule
RTL结构图
技术原理图
总结:
计数器是基础,要理解它的设计电路图。