一、项目要求
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、串口通信模块。
三、各模块代码
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、串口通信模块参考例程给出代码并作出修改
四、资源占用报告
五、心得体会
1、第一次接触fpga,切身感受到fpga与单片机的不同,也体会到了不同的编程方式和单片机所没有强大功能。
2、温度传感器模块一开始不知道输出怎么处理,后来参考大家的思路转换成bcd码。
3、出现了资源不足的情况,后来用case语句有效地解决了资源不足的问题。
4、串口通信那一块一直没整明白,借鉴他人思路得到解决,还花时间学习了一下上位机的使用。
5、总的来说很感谢这次机会,学到很多东西,受益匪浅。