最近做了一个手轮计数的模块,用QSYS在FPGA上做了一个简单的系统。功能就是转动手轮,然后在TFT屏幕上显示手轮计数0~99 顺时针增加计数,逆时针减少。
先是直接用中断函数,也就是将手轮脉冲的A,B作为NIOS的PIO输入。在A上升沿触发中断,然后根据B的电平判定正反转动。然后刷新TFT屏幕显示。这样做慢慢转动手轮的时候没有问题,但是快速连续转动的时候计数就跟不上了。分析后发现应该是中断函数花费的时间比较多,而手轮转动的比较快。所以不能采用中断来计数。
于是采用计数器+定时器的方式,也就是在硬件部分用一个8位寄存器储存计数值,当B上升沿的时候根据A的电平增加或减少计数,然后在QSYS系统中增加一个定时器并定义中断,最后在软件部分在定时器中断处理函数中读取寄存器的值,显示到屏幕上。
一、硬件部分(部分Verilog 代码)
reg [7:0] wheel_count;
reg [7:0] wheel_count_n;
parameter MIN_COUNT = 8'b0;
parameter MAX_COUNT = 8'b0110_0011;
always @(posedge B or negedge RST_N)
begin
if(!RST_N)
wheel_count <= 8'b0;
else
wheel_count <= wheel_count_n;
end
always @(*)
begin
if(A)
begin
if(wheel_count == MAX_COUNT)
wheel_count_n