微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > ARM技术讨论 > + 终端自动化测试项目(结项)

+ 终端自动化测试项目(结项)

时间:10-02 整理:3721RD 点击:

项目说明:利用ISD9160开发板的语音识别功能通过UART接口控制北斗通信/导航终端功能切换,实现终端设备的测试自动化。

原理:终端模块采用的是FPGA+DSP的结构,并且FPGA做为主控CPU与UART接口相连。恰好ISD9160开发板的第三个语音识别VR工程在识别正确后会通过UART接口输出特定数据。因此只需在FPGA中加入串口数据判别开关,若语音正确,串口接收数据无误,即可实现测试功能的切换。

在此我们分两步进行:A. ISD9160开发板VR工程调试;B. FPGA模块串口数据判读并产生切换指令。

     A.     ISD9160开发板VR工程测试

     1)  参照简易操作手册,在Keil MDK中打开VR工程


下载程序后,板子的OLED不再显示信息。

2) 打开ICP Programming Tool,选择ISD9100系列。


            连接开发板,按照手册选择载入文件。


         跟手册上不一样的是APROM的数据有差别,先忽略,继续,烧写成功,OK。


         3) 将开发板的串口与外接UART串口通过杜邦线连起来,再接到电脑上。


       4) 对准MIC喊“我要开灯”,亮了两个灯,上面一个,下面一个。


         喊“我要关灯”,亮了三个灯,上面一个,下面两个。


        串口助手分别收到的数据为“0B”和“0C”。


5) 与指令说明中“我要开灯”与“我要关灯”的UART数据11(0B)和12(0C)一致,并且十六进制0B为01011,十六进制0C为01100,分别加一后变量nID为01100和01101,与实测的开发板亮灯相一致。


经实测,只有“我要开灯、我要关灯、降低音量”指令识别率能达到50%以上,其他的就稍微差点意思了,难道是我普通话太差吗…?


至此,ISD9160开发板的VR工程测试正常,串口可以正常收到数据。

B.     FPGA模块串口数据判读并产生切换指令

FPGA开发板使用十几年前上学时候买的第一块开发板,采用Altera Cyclone EP2C8Q208C8芯片,外挂些LED、数码管、串口等等外设,将ISD9160开发板和FPGA板通过UART COMM口连接起来,硬件便搭建起来。

判断模块的编写也很简单,我们随意加载一个UART接收模块,将波特率设置为115200bps,同ISD9160串口速率相同。最后只需加一个判读切换功能,为了便于区分,我们将开发板上的6个LED显示灯做为切换指示,若听到“我要开灯”指令,即接收到0x0B数据,前三个LED指示灯亮;若听到“我要关灯”指令,即接收到0x0C数据,后三个LED指示灯亮,若听到其他指令,则全亮。

串口模块的编写如下所示。

  1. <font size="4">module serial(clk,rst_n,rs232_rx,led);
  2. input clk; // 50MHz主时钟
  3. input rst_n;  //低电平复位信号
  4. input rs232_rx;   // RS232接收数据信号
  5. output reg [5:0] led;

  6. reg bps_start_r; //接收到数据后,波特率时钟启动信号置位
  7. reg [7:0] rx_data; //接收数据寄存器,保存直至下一个数据来到
  8. reg rx_int;    //接收数据中断信号,接收到数据期间始终为高电平

  9. //----------------------------------------------------------------
  10. parameter bps_para = 433;
  11. parameter bps_para_2 = 216;
  12. reg clk_bps;    // clk_bps的高电平为接收或者发送数据位的中间采样点
  13. reg[12:0] cnt;           //分频计数

  14. always @ (posedge clk or negedge rst_n)
  15.     if(!rst_n) cnt <= 13'd0;
  16.     else if(cnt<bps_para && bps_start_r) cnt <= cnt+1'b1;  //波特率时钟计数启动
  17.     else cnt <= 13'd0;

  18. always @ (posedge clk or negedge rst_n)
  19.     if(!rst_n) clk_bps <= 1'b0;
  20.     else if(cnt==bps_para_2 && bps_start_r) clk_bps <= 1'b1;    // clk_bps_r高电平为接收或者发送数据位的中间采样点
  21.     else clk_bps <= 1'b0;

  22. //----------------------------------------------------------------
  23. reg rs232_rx0,rs232_rx1,rs232_rx2; //接收数据寄存器,滤波用
  24. wire neg_rs232_rx;   //表示数据线接收到下降沿

  25. always @ (posedge clk or negedge rst_n) begin
  26.     if(!rst_n) begin
  27.            rs232_rx0 <= 1'b1;
  28.            rs232_rx1 <= 1'b1;
  29.            rs232_rx2 <= 1'b1;
  30.        end
  31.     else begin
  32.            rs232_rx0 <= rs232_rx;
  33.            rs232_rx1 <= rs232_rx0;
  34.            rs232_rx2 <= rs232_rx1;
  35.        end
  36. end

  37. assign neg_rs232_rx = rs232_rx2 & ~rs232_rx1; //接收到下降沿后neg_rs232_rx置高一个时钟周期

  38. //----------------------------------------------------------------
  39. reg[3:0]   num;   //移位次数

  40. always @ (posedge clk or negedge rst_n) begin
  41.     if(!rst_n) begin
  42.            bps_start_r <= 1'bz;
  43.            rx_int <= 1'b0;
  44.        end
  45.     else if(neg_rs232_rx) begin
  46.            bps_start_r <= 1'b1; //启动接收数据
  47.            rx_int <= 1'b1;   //接收数据中断信号使能
  48.            end
  49.     else if(num==4'd12) begin
  50.            bps_start_r <= 1'bz; //数据接收完毕
  51.            rx_int <= 1'b0;      //接收数据中断信号关闭
  52.        end
  53. end

  54. //----------------------------------------------------------------
  55. reg[7:0] rx_data_r;  //接收数据寄存器,保存直至下一个数据来到
  56. //----------------------------------------------------------------

  57. reg[7:0]   rx_temp_data; //但前接收数据寄存器
  58. reg rx_data_shift;   //数据移位标志

  59. always @ (posedge clk or negedge rst_n) begin
  60.     if(!rst_n) begin
  61.            rx_data_shift <= 1'b0;
  62.            rx_temp_data <= 8'd0;
  63.            num <= 4'd0;
  64.            rx_data_r <= 8'd0;
  65.        end
  66.     else if(rx_int) begin    //接收数据处理
  67.        if(clk_bps) begin //读取并保存数据,接收数据为一个起始位,8bit数据,一个结束位      
  68.               rx_data_shift <= 1'b1;
  69.               num <= num+1'b1;
  70.               if(num<=4'd8) rx_temp_data[7] <= rs232_rx;    //锁存9bit(1bit起始位,8bit数据)
  71.            end
  72.        else if(rx_data_shift) begin    //数据移位处理   
  73.               rx_data_shift <= 1'b0;
  74.               if(num<=4'd8) rx_temp_data <= rx_temp_data >> 1'b1;  //移位8次,第1bit起始位移除,剩下8bit正好时接收数据
  75.               else if(num==4'd12) begin
  76.                      num <= 4'd0;  //接收到STOP位后结束,num清零
  77.                      rx_data_r <= rx_temp_data;  //把数据锁存到数据寄存器rx_data中
  78.                   end
  79.            end
  80.        end
  81. end

  82. always @(posedge clk or negedge rst_n)
  83.         rx_data <= rx_data_r;
  84.         
  85. always @(posedge clk or negedge rst_n)
  86.         if(!rst_n)
  87.                 led <= 6'b111111;
  88.         else if(rx_data==8'h0B)
  89.                 led <= 6'b111000;
  90.         else if(rx_data==8'h0C)
  91.                 led <= 6'b000111;
  92.         else
  93.                 led <= 6'b000000;

  94. endmodule
  95.         
  96. </font>

复制代码

    先利用串口助手调试,可以看到0x0B与0x0C都可以被模块正常接收。



    串口模块工作正常,此时将ISD9160与FPGA开发板连接起来,


  分别呼叫“我要开灯”、“我要关灯”、“降低音量”,可以看到LED灯按照我们编写的程序在切换,至此,切换功能完全实现,将此模块移植进北斗通导一体终端后即可实现测试自动化。




分享的非常全面  学习了解一下

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top