内容介绍
项目备注
内容介绍
项目需求:
- 实现一个可定时时钟的功能,用小脚丫FPGA核心模块的4个按键设置当前的时间,OLED显示数字钟的当前时间,精确到分钟即可,到整点的时候比如8:00,蜂鸣器报警,播放音频信号,最长可持续30秒;
- 实现温度计的功能,小脚丫通过板上的温度传感器实时测量环境温度,并同时间一起显示在OLED的屏幕上;
- 定时时钟整点报警的同时,将温度信息通过UART传递到电脑上,电脑上能够显示当前板子上的温度信息(任何显示形式都可以),要与OLED显示的温度值一致;
- PC收到报警的温度信号以后,将一段音频文件(自己制作,持续10秒钟左右)通过UART发送给小脚丫FPGA,蜂鸣器播放收到的这段音频文件,OLED屏幕上显示的时间信息和温度信息都停住不再更新;
- 音频文件播放完毕,OLED开始更新时间信息和当前的温度信息
项目模块划分
- 时钟分频模块
- 蜂鸣器模块
- 二进制转BCD码模块
- 温度信息采集及显示模块
- Uart收发模块
- 顶层模块
- 上位机模块
时钟模块
时间模块用于产生时间数据发送到OLED显示屏,并可以被四个按键来修改当前时间。该模块全部由自己完成。模块输出BCD码到OLED显示屏。可以通过长按按钮来修改时间。
温度获取
通过温度总线与温度传感器外设进行数据交互,得到外界温度数据,并将其分发到UART数据传输模块和OLED显示屏模块。首先计数器分频产生1MHz的时钟信号,再使用1MHz时钟信号做触发完成状态机的功能。获取到16位的温度输出后处理得到温度的整数部分和小数部分后,转为BCD码形式,在OLED上显示。
蜂鸣器
不同的震荡频率会产生不同的音节,通过赋给蜂鸣器不同的频率会奏出一段音乐。
通过编写一个状态机可以实现音乐数据装载、逐步读取音乐数据并发送到蜂鸣器的功能。UART收发器
使用UART在板子和PC端进行数据传送。当整点时,向上位机发送温度信息,并接收上位机传输的乐谱信息,记录计时终点。将接收报警信号以及报警音乐数据送至蜂鸣器。
OLED显示屏
完成温度数据和时间数据的显示,并在温度报警信号来临时暂停OLED显示屏的刷新。本项目使用的OLED显示屏代码主要来自于电子森林的案例分享,通过稍加修改使得其能够接收温度数据以及时间数据并将其显示在显示屏上,并能够接收温度报警信号实现显示屏停止刷新的功能。
1.时钟模块
always @ ( posedge clk_in_5hz or negedge rst_n_in ) if (~rst_n_in) time_shi <= 8'd0; else if( en && ((time_fen[7:4]==4'd5 && time_fen[3:0]==4'd9 && time_miao[7:4]==4'd5 && time_miao[3:0]==4'd9 && cnt == 3'd4) || ~control[2]) )begin if( time_shi[7:4]==4'd2 && time_shi[3:0]==4'd3 ) time_shi <= 8'd0; else if ( time_shi[3:0]==4'd9 ) begin time_shi[7:4] <= time_shi[7:4] + 1'b1; time_shi[3:0] <= 4'd0; end else time_shi[3:0] <= time_shi[3:0] + 1'b1; end always @ ( posedge clk_in_5hz or negedge rst_n_in ) if (~rst_n_in) time_fen <= 8'd0; else if( en && ((time_miao[7:4]==4'd5 && time_miao[3:0]==4'd9 && cnt == 3'd4) || ~control[1]) )begin if( time_fen[7:4]==4'd5 && time_fen[3:0]==4'd9 ) time_fen <= 8'd0; else if ( time_fen[3:0]==4'd9 ) begin time_fen[7:4] <= time_fen[7:4] + 1'b1; time_fen[3:0] <= 4'd0; end else time_fen[3:0] <= time_fen[3:0] + 1'b1; end always @ ( posedge clk_in_5hz or negedge rst_n_in ) if (~rst_n_in) time_miao <= 8'd0; else if ( en && (cnt == 3'd4 || ~control[0])) begin if( time_miao[7:4]==4'd5 && time_miao[3:0]==4'd9) time_miao <= 8'd0; else if ( time_miao[3:0]==4'd9 ) begin time_miao[7:4] <= time_miao[7:4] + 1'b1; time_miao[3:0] <= 4'd0; end else time_miao[3:0] <= time_miao[3:0] + 1'b1; end
2.温度模块
/tamp_out always @ (posedge clk_in_1mhz or negedge rst_n_in) if ( ~rst_n_in ) tamp_out <= 12'd0; else if (en) begin case(data_out[2:0]) 3'b000: tamp_out[3:0] <= (data_out[3])?4'd5:4'd0; 3'b001,3'b010: tamp_out[3:0] <= (data_out[3])?4'd6:4'd1; 3'b011: tamp_out[3:0] <= (data_out[3])?4'd7:4'd2; 3'b100,3'b101: tamp_out[3:0] <= (data_out[3])?4'd8:4'd3; 3'b110,3'b111: tamp_out[3:0] <= (data_out[3])?4'd9:4'd4; endcase case(data_out[7:4]) 4'b0000: begin tamp_out[11:8] <= (data_out[8])?4'd1:4'd0; tamp_out[7:4] <= (data_out[8])?4'd6:4'd0; end 4'b0001: begin tamp_out[11:8] <= (data_out[8])?4'd1:4'd0; tamp_out[7:4] <= (data_out[8])?4'd7:4'd1; end 4'b0010: begin tamp_out[11:8] <= (data_out[8])?4'd1:4'd0; tamp_out[7:4] <= (data_out[8])?4'd8:4'd2; end 4'b0011: begin tamp_out[11:8] <= (data_out[8])?4'd1:4'd0; tamp_out[7:4] <= (data_out[8])?4'd9:4'd3; end 4'b0100: begin tamp_out[11:8] <= (data_out[8])?4'd2:4'd0; tamp_out[7:4] <= (data_out[8])?4'd0:4'd4; end 4'b0101: begin tamp_out[11:8] <= (data_out[8])?4'd2:4'd0; tamp_out[7:4] <= (data_out[8])?4'd1:4'd5; end 4'b0110: begin tamp_out[11:8] <= (data_out[8])?4'd2:4'd0; tamp_out[7:4] <= (data_out[8])?4'd2:4'd6; end 4'b0111: begin tamp_out[11:8] <= (data_out[8])?4'd2:4'd0; tamp_out[7:4] <= (data_out[8])?4'd3:4'd7; end 4'b1000: begin tamp_out[11:8] <= (data_out[8])?4'd2:4'd0; tamp_out[7:4] <= (data_out[8])?4'd4:4'd8; end 4'b1001: begin tamp_out[11:8] <= (data_out[8])?4'd2:4'd0; tamp_out[7:4] <= (data_out[8])?4'd5:4'd9; end 4'b1010: begin tamp_out[11:8] <= (data_out[8])?4'd2:4'd1; tamp_out[7:4] <= (data_out[8])?4'd6:4'd0; end 4'b1011: begin tamp_out[11:8] <= (data_out[8])?4'd2:4'd1; tamp_out[7:4] <= (data_out[8])?4'd7:4'd1; end 4'b1100: begin tamp_out[11:8] <= (data_out[8])?4'd2:4'd1; tamp_out[7:4] <= (data_out[8])?4'd8:4'd2; end 4'b1101: begin tamp_out[11:8] <= (data_out[8])?4'd2:4'd1; tamp_out[7:4] <= (data_out[8])?4'd9:4'd3; end 4'b1110: begin tamp_out[11:8] <= (data_out[8])?4'd3:4'd1; tamp_out[7:4] <= (data_out[8])?4'd0:4'd4; end 4'b1111: begin tamp_out[11:8] <= (data_out[8])?4'd3:4'd1; tamp_out[7:4] <= (data_out[8])?4'd1:4'd5; end endcase
3.OLED模块
always@(posedge rst_n_in) begin //0 mem1[ 0] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'hF0, 8'h1F, 8'h00}; mem1[ 1] = {8'h00, 8'hFE, 8'hFF, 8'h00, 8'h00, 8'hFF, 8'hFF, 8'h03}; mem1[ 2] = {8'h80, 8'h07, 8'hC0, 8'h03, 8'hC0, 8'h01, 8'h00, 8'h07}; mem1[ 3] = {8'hC0, 8'h00, 8'h00, 8'h06, 8'hC0, 8'h00, 8'h00, 8'h0E}; mem1[ 4] = {8'hC0, 8'h00, 8'h00, 8'h0E, 8'hC0, 8'h00, 8'h00, 8'h06}; mem1[ 5] = {8'hC0, 8'h03, 8'h00, 8'h07, 8'h80, 8'h0F, 8'hE0, 8'h03}; mem1[ 6] = {8'h00, 8'hFF, 8'hFF, 8'h01, 8'h00, 8'hFC, 8'h7F, 8'h00}; mem1[ 7] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; //1 mem1[ 8] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; mem1[ 9] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h1C, 8'h00, 8'h00}; mem1[10] = {8'h00, 8'h0C, 8'h00, 8'h00, 8'h00, 8'h06, 8'h00, 8'h00}; mem1[11] = {8'h00, 8'h03, 8'h00, 8'h00, 8'hC0, 8'hFF, 8'hFF, 8'h07}; mem1[12] = {8'hC0, 8'hFF, 8'hFF, 8'h07, 8'hC0, 8'hFF, 8'hFF, 8'h07}; mem1[13] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; mem1[14] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; mem1[15] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; //2 mem1[16] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h04, 8'h00, 8'h00}; mem1[17] = {8'h00, 8'h07, 8'h00, 8'h07, 8'h80, 8'h07, 8'h80, 8'h07}; mem1[18] = {8'hC0, 8'h03, 8'hC0, 8'h07, 8'hC0, 8'h01, 8'hE0, 8'h07}; mem1[19] = {8'hC0, 8'h00, 8'h70, 8'h06, 8'hC0, 8'h00, 8'h38, 8'h06}; mem1[20] = {8'hC0, 8'h00, 8'h1E, 8'h06, 8'hC0, 8'h00, 8'h0F, 8'h06}; mem1[21] = {8'hC0, 8'hC1, 8'h03, 8'h06, 8'h80, 8'hFF, 8'h01, 8'h06}; mem1[22] = {8'h80, 8'hFF, 8'h00, 8'h06, 8'h00, 8'h1E, 8'h00, 8'h06}; mem1[23] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; //3 mem1[24] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h40, 8'h00}; mem1[25] = {8'h00, 8'h06, 8'hC0, 8'h01, 8'h00, 8'h0F, 8'hE0, 8'h03}; mem1[26] = {8'h80, 8'h03, 8'h80, 8'h07, 8'hC0, 8'h01, 8'h00, 8'h07}; mem1[27] = {8'hC0, 8'h80, 8'h01, 8'h06, 8'hC0, 8'h80, 8'h01, 8'h0E}; mem1[28] = {8'hC0, 8'h80, 8'h01, 8'h0E, 8'hC0, 8'hC0, 8'h03, 8'h06}; mem1[29] = {8'hC0, 8'hC1, 8'h03, 8'h07, 8'h80, 8'h7F, 8'hDF, 8'h03}; mem1[30] = {8'h80, 8'h7F, 8'hFE, 8'h03, 8'h00, 8'h1E, 8'hFC, 8'h00}; mem1[31] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; //4 mem1[32] = {8'h00, 8'h00, 8'h70, 8'h00, 8'h00, 8'h00, 8'h78, 8'h00}; mem1[33] = {8'h00, 8'h00, 8'h7E, 8'h00, 8'h00, 8'h00, 8'h7F, 8'h00}; mem1[34] = {8'h00, 8'hC0, 8'h73, 8'h00, 8'h00, 8'hE0, 8'h71, 8'h00}; mem1[35] = {8'h00, 8'h70, 8'h70, 8'h00, 8'h00, 8'h3C, 8'h70, 8'h00}; mem1[36] = {8'h00, 8'h1E, 8'h70, 8'h00, 8'h80, 8'h07, 8'h70, 8'h00}; mem1[37] = {8'hC0, 8'hFF, 8'hFF, 8'h07, 8'hC0, 8'hFF, 8'hFF, 8'h07}; mem1[38] = {8'h00, 8'h00, 8'h70, 8'h00, 8'h00, 8'h00, 8'h70, 8'h00}; mem1[39] = {8'h00, 8'h00, 8'h70, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; //5 mem1[40] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h80, 8'hC1, 8'h01}; mem1[41] = {8'h00, 8'hF8, 8'hE1, 8'h03, 8'hC0, 8'hFF, 8'h81, 8'h07}; mem1[42] = {8'hC0, 8'hCF, 8'h00, 8'h06, 8'hC0, 8'h60, 8'h00, 8'h0E}; mem1[43] = {8'hC0, 8'h60, 8'h00, 8'h0E, 8'hC0, 8'h60, 8'h00, 8'h0E}; mem1[44] = {8'hC0, 8'h60, 8'h00, 8'h0E, 8'hC0, 8'hE0, 8'h00, 8'h07}; mem1[45] = {8'hC0, 8'hC0, 8'h01, 8'h07, 8'hC0, 8'hC0, 8'hE7, 8'h03}; mem1[46] = {8'hC0, 8'h80, 8'hFF, 8'h01, 8'h00, 8'h00, 8'hFE, 8'h00}; mem1[47] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; //6 mem1[48] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h7C, 8'h00}; mem1[49] = {8'h00, 8'h00, 8'hFF, 8'h01, 8'h00, 8'hC0, 8'hFF, 8'h03}; mem1[50] = {8'h00, 8'hF0, 8'h83, 8'h07, 8'h00, 8'hF8, 8'h01, 8'h07}; mem1[51] = {8'h00, 8'hFE, 8'h00, 8'h06, 8'h00, 8'hCF, 8'h00, 8'h0E}; mem1[52] = {8'hC0, 8'hC7, 8'h00, 8'h0E, 8'hC0, 8'hC1, 8'h00, 8'h0E}; mem1[53] = {8'hC0, 8'hC0, 8'h00, 8'h06, 8'h00, 8'hC0, 8'h01, 8'h07}; mem1[54] = {8'h00, 8'h80, 8'hFF, 8'h03, 8'h00, 8'h00, 8'hFF, 8'h01}; mem1[55] = {8'h00, 8'h00, 8'hFE, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; //7 mem1[56] = {8'h00, 8'h00, 8'h00, 8'h00, 8'hC0, 8'h00, 8'h00, 8'h00}; mem1[57] = {8'hC0, 8'h00, 8'h00, 8'h00, 8'hC0, 8'h00, 8'h00, 8'h00}; mem1[58] = {8'hC0, 8'h00, 8'h00, 8'h04, 8'hC0, 8'h00, 8'h80, 8'h07}; mem1[59] = {8'hC0, 8'h00, 8'hF0, 8'h07, 8'hC0, 8'h00, 8'hFE, 8'h01}; mem1[60] = {8'hC0, 8'h80, 8'h3F, 8'h00, 8'hC0, 8'hE0, 8'h07, 8'h00}; mem1[61] = {8'hC0, 8'hF8, 8'h00, 8'h00, 8'hC0, 8'h3E, 8'h00, 8'h00}; mem1[62] = {8'hC0, 8'h0F, 8'h00, 8'h00, 8'hC0, 8'h03, 8'h00, 8'h00}; mem1[63] = {8'hC0, 8'h01, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; //8 mem1[64] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'hFC, 8'h01}; mem1[65] = {8'h00, 8'h7F, 8'hFE, 8'h03, 8'h80, 8'h7F, 8'hCF, 8'h07}; mem1[66] = {8'hC0, 8'hE1, 8'h07, 8'h07, 8'hC0, 8'hC0, 8'h03, 8'h06}; mem1[67] = {8'hC0, 8'h80, 8'h01, 8'h0E, 8'hC0, 8'h80, 8'h01, 8'h0E}; mem1[68] = {8'hC0, 8'h80, 8'h01, 8'h0E, 8'hC0, 8'hC0, 8'h03, 8'h06}; mem1[69] = {8'hC0, 8'hE1, 8'h03, 8'h07, 8'h80, 8'h7F, 8'h8F, 8'h07}; mem1[70] = {8'h00, 8'h7F, 8'hFE, 8'h03, 8'h00, 8'h1E, 8'hFC, 8'h01}; mem1[71] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; //9 mem1[72] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'hFE, 8'h01, 8'h00}; mem1[73] = {8'h00, 8'hFF, 8'h03, 8'h00, 8'h80, 8'h87, 8'h07, 8'h00}; mem1[74] = {8'hC0, 8'h01, 8'h07, 8'h08, 8'hC0, 8'h01, 8'h06, 8'h0E}; mem1[75] = {8'hC0, 8'h00, 8'h86, 8'h0F, 8'hC0, 8'h00, 8'hE6, 8'h03}; mem1[76] = {8'hC0, 8'h00, 8'hFE, 8'h01, 8'hC0, 8'h01, 8'h7F, 8'h00}; mem1[77] = {8'hC0, 8'h83, 8'h1F, 8'h00, 8'h80, 8'hFF, 8'h07, 8'h00}; mem1[78] = {8'h00, 8'hFF, 8'h03, 8'h00, 8'h00, 8'h7E, 8'h00, 8'h00}; mem1[79] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; //: mem1[80] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; mem1[81] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; mem1[82] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; mem1[83] = {8'h00, 8'h0F, 8'hF0, 8'h00, 8'h00, 8'h0F, 8'hF0, 8'h00}; mem1[84] = {8'h00, 8'h0F, 8'hF0, 8'h00, 8'h00, 8'h0F, 8'hF0, 8'h00}; mem1[85] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; mem1[86] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; mem1[87] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; //space mem1[88] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; mem1[89] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; mem1[90] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; mem1[91] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; mem1[92] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; mem1[93] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; mem1[94] = {8'h00, 8'h00, 8'h30, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; mem1[95] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00}; end
4.uart模块
//tx_done发送完成信号 assign tx_done = bps_en_tx2 & bps_en_tx1 & (~bps_en_tx0) & (~bps_en_tx); //tx_data_length always @ ( posedge clk_in or negedge rst_n_in ) if ( ~rst_n_in ) tx_data_length <= 2'd0; else if ( flag ) tx_data_length <= 2'd1; else if ( tx_done ) tx_data_length <= tx_data_length - 1'b1; //tx_data reg [7:0] tx_data; always @ ( posedge clk_in or negedge rst_n_in ) if ( ~rst_n_in ) tx_data <= 8'd0; else if ( flag ) tx_data <= tamp_data[11:4]; else if ( tx_done ) tx_data <= {4'd0,tamp_data[3:0]}; //tx_en wire tx_en; assign tx_en = ( flag || (tx_done&&tx_data_length)) ? 1'b1:1'b0; //tx_en_r reg tx_en_r; always @ ( posedge clk_in or negedge rst_n_in ) if ( ~rst_n_in ) tx_en_r <= 1'b0; else tx_en_r <= tx_en;
5.蜂鸣器模块
eg [23:0] cnt; always@(posedge clk_in or negedge rst_n_in) if(~rst_n_in) cnt <= 24'd0; else if(cnt == 24'd3999999) cnt <= 24'd0; else cnt <= cnt + 1'b1; reg [9:0] data_length_reg; always@(posedge clk_in or negedge rst_n_in) if(~rst_n_in) data_length_reg <= 10'd0; else if ( rx_done ) data_length_reg <= data_length; else if ( data_length_reg && cnt == 24'd3999999) data_length_reg <= data_length_reg - 1'b1; reg [959:0] data_buffer_reg; always@(posedge clk_in or negedge rst_n_in) if(~rst_n_in) data_buffer_reg <= 960'd0; else if ( rx_done ) data_buffer_reg <= data_buffer; else if ( data_length_reg && cnt == 24'd3999999) begin data_buffer_reg <= data_buffer_reg>>8; end
主要问题
项目实施过程中遇到的主要难题及解决过程如下:
1.对FPGA开发语言不熟悉,通过各种资源网站的学习,逐渐掌握开发方法。2.不熟悉蜂鸣器、温度传感器、OLED等硬件的控制方法。通过查阅数据手册了解其工作原理,并参考提供的相关例程进行开发。3.项目前期没有考虑资源问题,在最后阶段出现资源不足的问题。对项目逻辑进行优化,减少了资源的占用。未来计划
1.通过调整优化程序,继续减少对资源的占用。
2.用节省的资源扩充更多的功能。
3.具体方案构想:在OLED屏幕上显示音量,通过按键实现音量调节,并用拨码开关实现功能切换。
软硬件
附件下载
FPGATEST.zip
团队介绍
北京理工大学/信息与电子学院
团队成员
李喻博
北理工毕业人
评论
0 / 100
查看更多
猜你喜欢
寒假在家一起练(2021)项目四基于小脚丫FPGA的综合技能训练板制作一个能够定时、测温、报警、控制的系统
硬禾学堂的假期练习项目,历时近两周,基于STEP-MXO2小脚丫核心模块和Lattice Diamond软件,使用verilog语言完成
辞廿啊
1568
寒假在家一起练 项目四基于小脚丫MAX10M02FPGA综合训练板,实现了可定时时钟、温度计、整点报警、播放音频等功能。
zxf
1402
2021寒假在家一起练项目四一个基于小脚丫fpga的综合模块,有电子时钟,报警,串口通信,温度显示等功能。第一次接触fpga,切身感受到fpga与单片机的不同,也体会到了不同的编程方式和单片机所没有强大功能。总的来说很感谢这次机会,学到很多东西,受益匪浅。
郭永鹏
1271