2021寒假在家一起练项目四
一个基于小脚丫fpga的综合模块,有电子时钟,报警,串口通信,温度显示等功能。第一次接触fpga,切身感受到fpga与单片机的不同,也体会到了不同的编程方式和单片机所没有强大功能。总的来说很感谢这次机会,学到很多东西,受益匪浅。
标签
FPGA
郭永鹏
更新2021-03-01
1019

一、项目要求

1、实现一个可定时时钟的功能,用小脚丫FPGA核心模块的4个按键设置当前的时间,OLED显示数字钟的当前时间,精确到分钟即可,到整点的时候比如8:00,蜂鸣器报警,播放音频信号,最长可持续30秒;

2、实现温度计的功能,小脚丫通过板上的温度传感器实时测量环境温度,并同时间一起显示在OLED的屏幕上;

3、定时时钟整点报警的同时,将温度信息通过UART传递到电脑上,电脑上能够显示当前板子上的温度信息(任何显示形式都可以),要与OLED显示的温度值一致;

4、PC收到报警的温度信号以后,将一段音频文件(自己制作,持续10秒钟左右)通过UART发送给小脚丫FPGA,蜂鸣器播放收到的这段音频文件,OLED屏幕上显示的时间信息和温度信息都停住不再更新

二、设计思路
1、时钟模块:负责计时,并能够接收外部按键输入设定时间,能够置零,整点报警发出信号到蜂鸣器模块和串口通信模块,从而播放音乐,并在PC端显示该时刻温度信息。
2、蜂鸣器模块:内置一段报警音乐,并从串口通信模块接收到来自PC端音乐并播放。
3、温度模块:通过温度传感器DS18B20采集温度信息,输出数据需转化成bcd码才能在oled屏上正常显示。
4、分频器模块:为各模块提供时钟序列。
5、oled模块:显示温度和时间信息
6、串口通信模块。FpTJd83GUrt3vdI8lvw_hNP6BYi0

三、各模块代码

1、时钟模块:

module clock_(rst_n,sw_set,key,clk,clk_1s,sec_l,sec_h,min_l,min_h,hour_l,hour_h,o_clock);
//时间设置
input[3:0] key;
//input[1:0] sw;
input rst_n,sw_set,clk,clk_1s;
output reg[3:0] sec_l,sec_h,min_l,min_h,hour_l,hour_h;
output o_clock;
reg [5:0]sec_buff,min_buff,hour_buff,sec,min,hour,min_set,hour_set;
//reg rst_n,sw_set;
//assign rst_n=sw[0];
//assign sw_set=sw[1];
always@(posedge clk or negedge rst_n) begin
   if(!rst_n) begin
      min_set <= 6'd0;hour_set <= 6'd0;
   end
   else if(sw_set)begin
      case(key)             
        4'b0001:  begin min_set <= min_set + 1'd1;end
        4'b0010:  begin min_set <= min_set - 1'd1;end
        4'b0100:  begin hour_set <= hour_set + 1'd1;end
        4'b1000:  begin hour_set <= hour_set - 1'd1;end
        default: begin min_set <= min_set;hour_set <= hour_set;end  
      endcase
    end
    else begin min_set <= min;hour_set <= hour;end
end

//时间变化

always@(posedge clk_1s or negedge rst_n) begin

    if(!rst_n) begin

      sec <= 6'd0; min <= 6'd0;hour <= 6'd0;

      sec_buff <= 6'd0; min_buff <= 6'd0; hour_buff <= 6'd0;

    end

    else if(sw_set)begin

       sec_buff <= sec;

       min_buff <= min_set;

       min <= min_set;

       hour_buff <= hour_set;

       hour <= hour_set;

    end
    else if(o_clock)begin
       sec_buff <= sec_buff;
       min_buff <= min_buff;
       hour_buff <= hour_buff;
       if(sec == 6'd59) begin
          sec <= 1'd0;
          min <= min + 1'd1;
       end
       else begin
          if(hour == 6'd24) hour <= 6'd0;
          sec <= sec + 1'd1;
       end                         
       if((min == 6'd59) && (sec == 6'd59))begin
          min <= 1'd0;
          hour <= hour + 1'd1;
        end
     end
     else begin
        sec_buff <= sec;
        min_buff <= min;
        hour_buff <= hour;
     
        if(sec == 6'd59) begin
           sec <= 1'd0;
           min <= min + 1'd1;
        end
        else begin
           if(hour == 6'd24) hour <= 6'd0;
              sec <= sec + 1'd1;
           end
                      
           if((min == 6'd59) && (sec == 6'd59))begin
              min <= 1'd0;
              hour <= hour + 1'd1;
            end
        end
      sec_l <= sec_buff % 10;
      sec_h <= sec_buff / 10;
      min_l <= min_buff % 10;
      min_h <= min_buff / 10;
      hour_l <= hour_buff % 10;
      hour_h <= hour_buff / 10;
end
endmodule

2、蜂鸣器模块参考例程给出代码并作出修改

3、温度模块参考例程给出代码并作出修改

4、分频器模块:

module div(clk_in,clk_out);
input clk_in;
output reg clk_out;
reg [22:0] cnt;
parameter num=6000000;
initial
cnt=0;
always @(posedge clk_in)
    begin
	 if(cnt< num)//1hz
	     begin
		  cnt= cnt+1;
		  end
	 else
	     begin
		  clk_out= ~clk_out;
		  cnt= 0;
		  end
	 end
endmodule

5、oled模块参考例程给出代码并作出修改

6、串口通信模块参考例程给出代码并作出修改

 

 

 

四、资源占用报告

FuIWyoy9PMg9rD5kcxrm4-0I8jJo

五、心得体会

1、第一次接触fpga,切身感受到fpga与单片机的不同,也体会到了不同的编程方式和单片机所没有强大功能。

2、温度传感器模块一开始不知道输出怎么处理,后来参考大家的思路转换成bcd码。

3、出现了资源不足的情况,后来用case语句有效地解决了资源不足的问题。

4、串口通信那一块一直没整明白,借鉴他人思路得到解决,还花时间学习了一下上位机的使用。

5、总的来说很感谢这次机会,学到很多东西,受益匪浅。

附件下载
pro_last.sof
团队介绍
空工大
团队成员
郭永鹏
大三,初学fpga
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号