07、安路SparkRoad国产FPGA测评【学习篇】串口回环实验
[复制链接]
本帖最后由 1nnocent 于 2022-7-30 09:10 编辑
该例程实现串口回环实验,FPGA 实时监测 uart_rx 信号是否有数据, 若接收到 PC 端发送的数据, 则把接收到的数据通过 uart_tx 返回给 PC 端。先下载程序试下效果,发现PC端发送数据时,没有现象,检查了原理图和管脚约束文件发现是管脚约束时例程使用的不是USB对应的引脚,通过原理图可知TX_RX对应的引脚分别为F16_E16。
修改引脚后功能正常。
先看下一步串口通讯的数据格式:首先是起始位,空闲时为高电平,起始位时拉低电平,之后是数据位,校验位和停止位,停止位时拉高电平。
例程顶层模块的输入接口为25MHz时钟,外部复位(对应中间的按键)、输入引脚(rx_引脚)、输出引脚(tx_引脚)。
波特率设置模块(波特率为9600,时钟周期40ns_):其中bps_start是uart_tx引脚捕获的起始位信号,clk_bps位波特率采样中点。
- module speed_setting
-
- parameter BPS_SET = 96,
- parameter CLK_PERIORD = 40
- )
- (
- input clk,
- input rst_n,
- input bps_start,
- output clk_bps
- );
-
- `define BPS_PARA (10_000_000/CLK_PERIORD/BPS_SET)
- `define BPS_PARA_2 (`BPS_PARA/2)
-
- reg [12:0] cnt;
- reg clk_bps_r;
-
- always@(posedge clk or negedge rst_n)
- begin
- if(!rst_n)
- cnt <= 13'd0;
- else if((cnt == `BPS_PARA) || !bps_start) // 捕获起始信号后开始波特率计数
- cnt <= 13'd0;
- else
- cnt <= cnt + 1'b1; // 否则计数器自加
- end
-
- always@(posedge clk or negedge rst_n)
- begin
- if(!rst_n)
- clk_bps_r <= 1'b0;
- else if(cnt == `BPS_PARA_2)
- clk_bps_r <= 1'b1; // 波特率采样中点标志
- else
- clk_bps_r <= 1'b0;
- end
-
- assign clk_bps = clk_bps_r;
-
- endmodule
-
-
rx_接收模块:该模块捕获下降沿时使用的四个寄存器uart_rx0、uart_rx1、uart_rx2、uart_rx3,捕获的下降沿用于产生波特率模块。该模块主要功能是接收数据,把rx_引脚上的数据进行串转并的功能。
发送模块,该模块的功能主要是将接收的数据进行并转串,并发送给PC端。发送模块与接受模块不同的地方是需要发送起始位和停止位。
历程运行效果:
|