基于小脚丫FPGA实现频率计和计数器
首先使用FPGA产生PWM信号,与待测信号进行比较,产生0-3.3V的脉冲,FPGA对脉冲信号捕获并计数,通过计数值得出待测信号的频率,将频率转换为bcd码并且在oled屏上显示。 通过按键K2及数码管进行计数。可实现0-99的计数功能。
标签
FPGA
数字逻辑
2022寒假在家练
aaaaaaaaaa
更新2022-03-09
安徽师范大学
1672
  1. 项目介绍:本项目是利用板上的高速比较器和FPGA的逻辑实现高速频率计和计数器的功能
  2. 硬件介绍Fu2JYgYjs7SuPaQBKssnM7UzeEd7
  • 核心模块:使用小脚丫FPGA核心板
  • 显示模块:128*64OLED
  • 控制模块:旋转编码器/按键
  • 信号模块:高速ADC,DAC,高速比较器
  • 传感器:三轴姿态传感器

3.系统框图FgpWOO6C2kTmKFMAsxLtLuBqMXS-

4.设计思路FqcfNcgR-jX5b2eXZHteEkVqkI9K

首先使用FPGA产生PWM信号,与待测信号进行比较,产生0-3.3V的脉冲,FPGA对脉冲信号捕获并计数,通过计数值得出待测信号的频率,将频率转换为bcd码并且在oled屏上显示。

通过按键K3及数码管进行计数。可实现0-99的计数功能。

  1. 代码展示

(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

 
	

 

  1. 效果演示FhP7McVhX0XlOEcDs6SzZEm0OUFzFszg9g7Kdyk8LOtwJBXjzexBW2aY

当按下按键时,可以实现计数功能。

接入信号发生器测频率Foe1fazEGrrybSNLi7ndqIhUnv-P

FPGA资源占用

Fk5bkTeKAsNx1COKid9bH1xe0ZZQ

8.问题分析及总结

这次项目对于使用Fpga控制 oled屏的方法还是不够了解,同时对于软件——diamond的使用,不够熟练,在完成项目的过程中,常常会因为对于软件的不够了解而无从下手。以及板子的其他功能自己也还没有去摸索,希望自己未来可以不断进步。

 

附件下载
WinterP2022 (4).zip
团队介绍
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号