1 设计要求分析
计数是一种最简单基本的运算。计数器就是实现这种运算的逻辑电路,计数器在数字系统中主要是对脉冲的个数进行计数,以实现测量、计数和控制的功能,同时兼有分频功能。本次实验采用50MHz时钟进行系统仿真,并具备低电平有效的复位信号。计数从0~100,当计数器记满100后归零重新计数。
2 系统设计
2.1 总体设计思路
实验采用50MHZ时钟进行系统仿真,即20ns,可以计算得出计数范围为。计数从0到100,则需要一个至少7位()计数器,且记满后归零。并且计数器对脉冲个数计数,所以计数器需与时钟信号严格同步。同时还需要设计一个低电平有效复位信号,而此信号与时钟不同步,是异步复位,即当复位信号为低,则计数器立即复位,不需要等待时钟触发。
2.2 接口设计
端口数 | I/O | 功能描述 |
I_sys_clk_50MHz | input | 50MHz时钟 |
I_sys_rst_n | input | 低电平有效复位信号 |
O_cnt | output | 计数输出 |
2.3 计数器模块
首先输入为I_sys_clk_50Mhz和I_sys_rst_n,分别为wire型变量,代表输入时钟和输入低电平复位信号,此时复位信号是异步信号,不和时钟同步,该信号复位可发生在任意信号为低的时刻,所以在always块中,敏感列表包含时钟上升沿时刻和低电平复位信号下降沿。
输出端口为计数器O_cnt,变量类型为wire,为保证该模块输出为寄存器形式,即输出和系统时钟同步,引入中间变量O_cnt_temp,通过连续赋值语句assign再将O_cnt_temp赋给O_cnt。在系统复位时,需要给所有内部寄存器变量初始化,即O_cnt_temp<=7'd0。当计数器变量值在当前时钟上升沿已经为100时,采用非阻塞赋值,即时钟上升沿时刻出开始执行O_cnt_temp<=7'd0,达到重新计数的功能。在计数不满100的时候,O_cnt_temp变量,在时钟上升沿时刻依次递进1,达到计数功能。
3 功能仿真测试
3.1 源程序设计
`timescale 1ns / 1ps
module Counter(
input I_sys_clk_50MHz ,
input I_sys_rst_n ,
output [7:0] O_cnt
);
reg [7:0] O_cnt_temp;
assign O_cnt=O_cnt_temp;
always @(posedge I_sys_clk_50MHz or negedge I_sys_rst_n) begin
if(!I_sys_rst_n) begin
O_cnt_temp<=7'd0;
end
else if(O_cnt_temp==7'd100) begin
O_cnt_temp<=7'd0;
end
else begin
O_cnt_temp<=O_cnt_temp+7'd1;
end
end
endmodule
3.2 testbench程序测试
`timescale 1ns / 1ps
module testbench_Counter(
);
reg I_sys_clk_50MHz;
reg I_sys_rst_n;
wire [7:0] O_cnt;
initial begin
I_sys_clk_50MHz=1'b0;
I_sys_rst_n=1'b0;
#10 I_sys_rst_n=1'b1;
end
always #10 I_sys_clk_50MHz=~I_sys_clk_50MHz;
Counter Counter_u(
.I_sys_clk_50MHz (I_sys_clk_50MHz),
.I_sys_rst_n (I_sys_rst_n),
.O_cnt (O_cnt)
);
endmodule
3.3 时序仿真波形
3.4 结果分析
由上面时序波形图可知,复位信号为低时,计数器复位为0,复位信号为高时,计数器开始计数。计数器在时钟上升沿计数,在计数未满100时,计数加1,当计数已满100时,计数器归0重新开始计数。
4 思考
在代码中我们引入了reg型中间变量O_cnt_temp,并将这个reg型变量赋值给了wire型变量输出O_cnt。一个模块的输入input我们往往是wire的申明,因为wire为无逻辑连线,所以输入什么输出就是什么;但输出端口却要求需要做寄存器形式的输出,这是因为在过程语句块(initial,always)中,只能对reg数据进行赋值,且这种形式的输出比较稳定、扇出能力也较好。
可以简记为:当output作为过程赋值语句的左值,则应该用reg类型;如果output作为连续赋值语句的左值或元件例化输出,则应该用wire类型。文章来源:https://www.toymoban.com/news/detail-754924.html
5 技术小结与感想
通过这次实验,完成了一整套FPGA实现流程,实现了计数器的功能,在实验过程中了解了计数器的逻辑结构,更加理解了异步复位,时钟触发等的概念,同时也练习了利用Vivado完成Verilog的编写。文章来源地址https://www.toymoban.com/news/detail-754924.html
到了这里,关于数电实验1:计数器实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!