内容介绍
内容介绍
- 项目介绍:本项目是利用板上的高速比较器和FPGA的逻辑实现高速频率计和计数器的功能
- 硬件介绍
- 核心模块:使用小脚丫FPGA核心板
- 显示模块:128*64OLED
- 控制模块:旋转编码器/按键
- 信号模块:高速ADC,DAC,高速比较器
- 传感器:三轴姿态传感器
3.系统框图
4.设计思路
首先使用FPGA产生PWM信号,与待测信号进行比较,产生0-3.3V的脉冲,FPGA对脉冲信号捕获并计数,通过计数值得出待测信号的频率,将频率转换为bcd码并且在oled屏上显示。
通过按键K3及数码管进行计数。可实现0-99的计数功能。
- 代码展示
(1)形成比较电压
module divider (
input wire sys_clk,
input wire sys_rst_n,
output reg pwm_out
);
reg [7:0] cnt;
always @(posedge sys_clk or negedge sys_rst_n) begin
if(sys_rst_n == 1'b0)
cnt <= 8'b0;
else if(cnt == 8'b1010)
cnt <= 8'b0;
else
cnt = cnt + 1'b1;
end
always @(posedge sys_clk or negedge sys_rst_n) begin
if(sys_rst_n == 1'b0)
pwm_out <= 1'b0;
else if(cnt <= 8'd5)
pwm_out <= 1'b1;
else
pwm_out <= 1'b0;
end
endmodule
(2)获取频率值
module freq (
input wire sys_clk,
input wire sys_rst_n,
input wire clk_test, //待测信号
output reg [25:0] freq
);
reg [23:0] clk_cnt;
reg clk_1s;
reg [25:0] freq_cnt;
reg [25:0] freq_cnt_buff;
always @(posedge sys_clk or negedge sys_rst_n) begin
if(sys_rst_n == 1'b0)
clk_cnt <= 24'b0;
else if(clk_cnt == 24'd5999999)
clk_cnt <= 24'b0;
else
clk_cnt <= clk_cnt + 1'b1;
end
always @(posedge sys_clk or negedge sys_rst_n) begin
if(sys_rst_n == 1'b0)
clk_1s <= 1'b0;
else if(clk_cnt == 24'd5999999)
clk_1s <= ~clk_1s;
end
always @(posedge clk_test or negedge sys_rst_n) begin
if(sys_rst_n == 1'b0)
freq_cnt <= 26'b0;
else
freq_cnt <= freq_cnt + 1'b1;
end
always @(posedge clk_1s or negedge clk_1s or negedge sys_rst_n) begin
if(sys_rst_n == 1'b0)
freq <= 26'b0;
else begin
if(freq_cnt >= freq_cnt_buff) freq = freq_cnt - freq_cnt_buff;
freq_cnt_buff = freq_cnt;
end
end
endmodule
(3)将频率值在oled上显示
case(state)
IDLE:begin
cnt_main <= 1'b0; cnt_init <= 1'b0; cnt_scan <= 1'b0; cnt_write <= 1'b0;
y_p <= 1'b0; x_ph <= 1'b0; x_pl <= 1'b0;
num <= 1'b0; char <= 1'b0; char_reg <= 1'b0;
num_delay <= 16'd5; cnt_delay <= 1'b0; cnt <= 1'b0;
oled_rst <= HIGH; oled_dcn <= CMD; oled_clk <= HIGH; oled_dat <= LOW;
state <= MAIN; state_back <= MAIN;
end
MAIN:begin
if(cnt_main >= 5'd2) cnt_main <= 5'd1; //if(cnt_main >= 5'd8) cnt_main <= 5'd5;
else cnt_main <= cnt_main + 1'b1;
case(cnt_main) //MAIN状态
5'd0: begin state <= INIT; end
5'd1: begin y_p <= 8'hb0; x_ph <= 8'h10; x_pl <= 8'h00; num <= 5'd16; char <= "F: Hz";state <= SCAN; end
5'd2: begin y_p <= 8'hb0; x_ph <= 8'h12; x_pl <= 8'h00; num <= 5'd14; char <= str_out; state <= SCAN; end
default: state <= IDLE;
endcase
end
(4)通过按键和数码管实现计数功能
// 启动/暂停按键进行消抖
debounce U2 (
.clk(clk),
.rst(rst),
.key(hold),
.key_pulse(hold_pulse)
);
//按键动作标志信号产生
always @ (posedge hold_pulse)
if(!rst==1)
hold_flag <= 0;
else
hold_flag <= ~hold_flag;
//计时完成标志信号产生
always @ (posedge hold_pulse or negedge rst) begin
if (!rst == 1) begin
cnt_ge <= 4'd0;
cnt_shi <= 4'd0;
end
else if(cnt_shi==9 && cnt_ge==9) begin
cnt_shi <= 4'd0;
cnt_ge <= 4'd0;
end
else if(cnt_ge==4'd9)begin
cnt_ge <= 4'd0;
cnt_shi <= cnt_shi+1;
end
else
cnt_ge <= cnt_ge +1;
end
- 效果演示
当按下按键时,可以实现计数功能。
接入信号发生器测频率
FPGA资源占用
8.问题分析及总结
这次项目对于使用Fpga控制 oled屏的方法还是不够了解,同时对于软件——diamond的使用,不够熟练,在完成项目的过程中,常常会因为对于软件的不够了解而无从下手。以及板子的其他功能自己也还没有去摸索,希望自己未来可以不断进步。
附件下载
WinterP2022 (4).zip
团队介绍
评论
0 / 100
查看更多
猜你喜欢
基于小脚丫的电赛训练平台实现高速频率计和计数器的功能基于小脚丫FPGA的电赛训练平台,利用板上的高速比较器和FPGA的逻辑实现高速频率计和计数器的功能。以FPGA输出PWM波,经过一阶低通滤波,与输入信号比较,产生稳定的脉冲信号,方便FPGA捕获以及计数和计算频率。
胡超杰
1957
2024年寒假练 - 基于Lattice LCMXO2-4000HC 小脚丫FPGA实现计数器设计该项目使用了Lattice LCMXO2-4000HC 小脚丫FPGA,实现了秒表功能计数器的设计,它的主要功能为:秒表:使用小脚丫FPGA核心板上的两个数码管和轻触按键制作一个秒表。秒表将通过按键控制其功能,并在数码管上显示数值。秒表将从0.0秒计数到9.9秒,然后翻转,计数值每0.1秒精确更新一次。 按键操作:秒表的操作将通过四个按钮实现:开始、停止、增量和清除(重置)。
小屁孩06
497
2025寒假练 -基于小脚丫FPGA实现语音计算器该项目使用了小脚丫FPGA开发板、python上位机、百度语音大模型,实现了语音计算器的设计,它的主要功能为:PC上语音控制生成命令,小脚丫FPGA逻辑实现计算器,在LCD屏幕上显示。
niuniu
22