寒假在家一起练项目四
小脚丫集成电路开发板,寒假在家一起练项目四,可实现四种要求的功能,定时,蜂鸣,测温,同显等
标签
FPGA
网络与通信
fenjidejianqiao
更新2021-02-28
975
 

项目需求:

  1. 实现一个可定时时钟的功能,用小脚丫FPGA核心模块的4个按键设置当前的时间,OLED显示数字钟的当前时间,精确到分钟即可,到整点的时候比如8:00,蜂鸣器报警,播放音频信号,最长可持续30秒;
  2. 实现温度计的功能,小脚丫通过板上的温度传感器实时测量环境温度,并同时间一起显示在OLED的屏幕上;
  3. 定时时钟整点报警的同时,将温度信息通过UART传递到电脑上,电脑上能够显示当前板子上的温度信息(任何显示形式都可以),要与OLED显示的温度值一致;
  4. PC收到报警的温度信号以后,将一段音频文件(自己制作,持续10秒钟左右)通过UART发送给小脚丫FPGA,蜂鸣器播放收到的这段音频文件,OLED屏幕上显示的时间信息和温度信息都停住不再更新;
  5. 音频文件播放完毕,OLED开始更新时间信息和当前的温度信息

    项目模块划分

    1. 时钟分频模块
    2. 蜂鸣器模块
    3. 二进制转BCD码模块
    4. 温度信息采集及显示模块
    5.  Uart收发模块
    6. 顶层模块
    7. 上位机模块FhNLAkSi-AARrori126Q0DqF1vAz

       

      时钟模块

            时间模块用于产生时间数据发送到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
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号