+ 终端自动化测试项目(结项)
项目说明:利用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指示灯亮,若听到其他指令,则全亮。
串口模块的编写如下所示。
- <font size="4">module serial(clk,rst_n,rs232_rx,led);
- input clk; // 50MHz主时钟
- input rst_n; //低电平复位信号
- input rs232_rx; // RS232接收数据信号
- output reg [5:0] led;
- reg bps_start_r; //接收到数据后,波特率时钟启动信号置位
- reg [7:0] rx_data; //接收数据寄存器,保存直至下一个数据来到
- reg rx_int; //接收数据中断信号,接收到数据期间始终为高电平
- //----------------------------------------------------------------
- parameter bps_para = 433;
- parameter bps_para_2 = 216;
- reg clk_bps; // clk_bps的高电平为接收或者发送数据位的中间采样点
- reg[12:0] cnt; //分频计数
- always @ (posedge clk or negedge rst_n)
- if(!rst_n) cnt <= 13'd0;
- else if(cnt<bps_para && bps_start_r) cnt <= cnt+1'b1; //波特率时钟计数启动
- else cnt <= 13'd0;
-
- always @ (posedge clk or negedge rst_n)
- if(!rst_n) clk_bps <= 1'b0;
- else if(cnt==bps_para_2 && bps_start_r) clk_bps <= 1'b1; // clk_bps_r高电平为接收或者发送数据位的中间采样点
- else clk_bps <= 1'b0;
-
- //----------------------------------------------------------------
- reg rs232_rx0,rs232_rx1,rs232_rx2; //接收数据寄存器,滤波用
- wire neg_rs232_rx; //表示数据线接收到下降沿
-
- always @ (posedge clk or negedge rst_n) begin
- if(!rst_n) begin
- rs232_rx0 <= 1'b1;
- rs232_rx1 <= 1'b1;
- rs232_rx2 <= 1'b1;
- end
- else begin
- rs232_rx0 <= rs232_rx;
- rs232_rx1 <= rs232_rx0;
- rs232_rx2 <= rs232_rx1;
- end
- end
-
- assign neg_rs232_rx = rs232_rx2 & ~rs232_rx1; //接收到下降沿后neg_rs232_rx置高一个时钟周期
-
- //----------------------------------------------------------------
- reg[3:0] num; //移位次数
-
- always @ (posedge clk or negedge rst_n) begin
- if(!rst_n) begin
- bps_start_r <= 1'bz;
- rx_int <= 1'b0;
- end
- else if(neg_rs232_rx) begin
- bps_start_r <= 1'b1; //启动接收数据
- rx_int <= 1'b1; //接收数据中断信号使能
- end
- else if(num==4'd12) begin
- bps_start_r <= 1'bz; //数据接收完毕
- rx_int <= 1'b0; //接收数据中断信号关闭
- end
- end
-
- //----------------------------------------------------------------
- reg[7:0] rx_data_r; //接收数据寄存器,保存直至下一个数据来到
- //----------------------------------------------------------------
-
- reg[7:0] rx_temp_data; //但前接收数据寄存器
- reg rx_data_shift; //数据移位标志
-
- always @ (posedge clk or negedge rst_n) begin
- if(!rst_n) begin
- rx_data_shift <= 1'b0;
- rx_temp_data <= 8'd0;
- num <= 4'd0;
- rx_data_r <= 8'd0;
- end
- else if(rx_int) begin //接收数据处理
- if(clk_bps) begin //读取并保存数据,接收数据为一个起始位,8bit数据,一个结束位
- rx_data_shift <= 1'b1;
- num <= num+1'b1;
- if(num<=4'd8) rx_temp_data[7] <= rs232_rx; //锁存9bit(1bit起始位,8bit数据)
- end
- else if(rx_data_shift) begin //数据移位处理
- rx_data_shift <= 1'b0;
- if(num<=4'd8) rx_temp_data <= rx_temp_data >> 1'b1; //移位8次,第1bit起始位移除,剩下8bit正好时接收数据
- else if(num==4'd12) begin
- num <= 4'd0; //接收到STOP位后结束,num清零
- rx_data_r <= rx_temp_data; //把数据锁存到数据寄存器rx_data中
- end
- end
- end
- end
-
- always @(posedge clk or negedge rst_n)
- rx_data <= rx_data_r;
-
- always @(posedge clk or negedge rst_n)
- if(!rst_n)
- led <= 6'b111111;
- else if(rx_data==8'h0B)
- led <= 6'b111000;
- else if(rx_data==8'h0C)
- led <= 6'b000111;
- else
- led <= 6'b000000;
- endmodule
-
- </font>
先利用串口助手调试,可以看到0x0B与0x0C都可以被模块正常接收。
串口模块工作正常,此时将ISD9160与FPGA开发板连接起来,
分别呼叫“我要开灯”、“我要关灯”、“降低音量”,可以看到LED灯按照我们编写的程序在切换,至此,切换功能完全实现,将此模块移植进北斗通导一体终端后即可实现测试自动化。
分享的非常全面 学习了解一下