本帖最后由 UT发布 于 2025-4-10 16:19 编辑
软件版本:TD_5.6.4_Release_97693 操作系统:WIN11 64bit 硬件平台:适用安路(Anlogic)FPGA 1概述前面两课,我们完成了我们发送程序的测试,成功给PC主机发送了“HELLO FPGA”的信息,主机显示接收成功。但是我们串口接收的程序仅仅是通过我们模拟仿真,虽然仿真结果达到了期望,但是不能直接上板测试难免差强人意。所以我们不妨将我们串口UART接收程序以及发送程序连接起来,做到能将PC端通过USB发送过来的数据接收,然后将接收到的数据再通过发送程序返回给我们的PC机。 在完成本实验前,请确保已经完成前面的实验,包括已经掌握以下能力:
2:实现主程序中调用串口发送控制器发送字符“HELLO FPGA” 1.1 UART收发环路简介一般RS232只使用到TXD和RXD两个信号,两个设备之间的TXD和RXD必须交叉连接,例如对于PC的 TX 要和FPGA的RX连接,同样PC的RX要和FPGA的TX连接才可以正常通信。 1.2硬件电路分析参照 “UART串口发送驱动设计”硬件电路分析部分 2 UART收发环路程序设计在完成以下实验前,请确保已经完成了“UART串口发送实验”和“UART串口接收实验” 2.1系统框图
上位机通过串口发送数据到FPGA开发板的UART数据接收模块,将串口接收端口(I_uart_rx)的串行数据解析回并行数据输出,再将并行数据作为输入给数据发送模块,UART数据发送模块将并行数据转成串行数据发送回上位机。通过串口发送端口(O_uart_tx)把数据发回到串口芯片,之后数据在串口调试助手上打印,实现环路测试。需要注意的是,数据并不是一直有效的,所以将UART数据接收模块的数据有效信号(O_uart_rvalid)接入到UART数据发送模块的发送数据请求信号(I_uart_wreq),当接收的信号有效时,触发UART数据发送模块,就可以发送接收的有效数据。对于发送驱动模块中的O_uart_wbusy信号,不需要使用,因为这里uart发送模块是被动发送。
2.2驱动源码顶层模块只需要调用uart的收发模块驱动接口。并且设置uart_rdata和uart_wdata互联,uart_wreq和uart_rvalid互联。
- module uart_top
- (
- input I_sysclk,//系统时钟输入
- input I_uart_rx,//uart rx接收信号
- output O_uart_tx //uart tx发送信号
- );
-
- localparam SYSCLKHZ = 25_000_000; //系统输入时钟
-
- reg [11:0] rstn_cnt = 0;//上电后延迟复位
- wire uart_rstn;//内部复位信号
- wire uart_wreq,uart_rvalid;
- wire [7:0]uart_wdata,uart_rdata;
-
- assign uart_wreq = uart_rvalid;//用uart rx接收数据有效的uart_rvalid信号,控制uart发送模块的发送请求
- assign uart_wdata = uart_rdata; //接收的数据给发送模块发送
- assign uart_rstn = rstn_cnt[11];//延迟复位设计,用计数器的高bit控制复位
-
- //同步计数器实现复位
- always @(posedge I_sysclk)begin
- if(rstn_cnt[11] == 1'b0)
- rstn_cnt <= rstn_cnt + 1'b1;
- else
- rstn_cnt <= rstn_cnt;
- end
-
- //例化uart 发送模块
- uiuart_tx#
- (
- .BAUD_DIV(SYSCLKHZ/115200-1)
- )
- uart_tx_u
- (
- .I_clk(I_sysclk),//系统时钟输入
- .I_uart_rstn(uart_rstn), //系统复位
- .I_uart_wreq(uart_wreq), //uart发送驱动的写请求信号,高电平有效
- .I_uart_wdata(uart_wdata), //uart发送驱动的写数据
- .O_uart_wbusy(),//uart 发送驱动的忙标志
- .O_uart_tx(O_uart_tx)//uart 串行数据发送
- );
-
- //例化uart 接收
- uiuart_rx#
- (
- .BAUD_DIV(SYSCLKHZ/115200-1)
- )
- uiuart_rx_u
- (
- .I_clk(I_sysclk), //系统时钟输入
- .I_uart_rx_rstn(uart_rstn),//系统复位
- .I_uart_rx(I_uart_rx), //uart 串行数据接收
- .O_uart_rdata(uart_rdata), //uart 接收数据
- .O_uart_rvalid(uart_rvalid)//uart 接收数据有效,O_uart_rvalid =1'b1 O_uart_rvalid输出的数据有效
- );
-
- endmodule
复制代码
3 FPGA工程fpga工程的创建过程不再重复,如有不清楚的请看前面实验,具体的FPGA型号以对应的开发板上芯片为准 米联客的代码管理规范,在对应的FPGA工程路径下创建uisrc路径,并且创建以下文件夹 04_pin:放fpga的pin脚约束文件或者时序约束文件 05_boot:放编译好的bit或者bin文件(一般为空) 4 Modelsim仿真4.1准备工作Modelsim仿真的创建过程不再重复,如有不清楚的请看前面实验
- `timescale 1ns / 1ns
-
-
- module uart_top_tb;
-
- reg I_sysclk;
- reg I_uart_rx;
- wire O_uart_tx;
-
- uart_top u_uart_top
- (
- .I_sysclk (I_sysclk),
- .I_uart_rx (I_uart_rx),
- .O_uart_tx (O_uart_tx)
- );
-
- parameter FREQ = 25000000;
- parameter BAUD = 115200;
- parameter TBAUD = FREQ/BAUD*40;
-
- initial
- begin
- I_sysclk = 0;
- I_uart_rx = 1'b1;
-
- #200000 // Wait for global reset to finish
-
- #TBAUD
- I_uart_rx = 1'b1;
- #TBAUD
- I_uart_rx = 1'b0;//start
- //1001_0101
- #TBAUD
- I_uart_rx = 1'b1;
- #TBAUD
- I_uart_rx = 1'b0;
- #TBAUD
- I_uart_rx = 1'b1;
- #TBAUD
- I_uart_rx = 1'b0;
- #TBAUD
- I_uart_rx = 1'b1;
- #TBAUD
- I_uart_rx = 1'b0;
- #TBAUD
- I_uart_rx = 1'b0;
- #TBAUD
- I_uart_rx = 1'b1;
- #TBAUD
- I_uart_rx = 1'b1;//stop
- #808320
- //00000101
- I_uart_rx = 1'b0;//start
- #TBAUD
- I_uart_rx = 1'b1;
- #TBAUD
- I_uart_rx = 1'b0;
- #TBAUD
- I_uart_rx = 1'b1;
- #TBAUD
- I_uart_rx = 1'b0;
- #TBAUD
- I_uart_rx = 1'b0;
- #TBAUD
- I_uart_rx = 1'b0;
- #TBAUD
- I_uart_rx = 1'b0;
- #TBAUD
- I_uart_rx = 1'b0;
- #TBAUD
- I_uart_rx = 1'b1;//stop
-
- #808320
- //10000100
- I_uart_rx = 1'b0;//start
- #TBAUD
- I_uart_rx = 1'b0;
- #TBAUD
- I_uart_rx = 1'b0;
- #TBAUD
- I_uart_rx = 1'b1;
- #TBAUD
- I_uart_rx = 1'b0;
- #TBAUD
- I_uart_rx = 1'b0;
- #TBAUD
- I_uart_rx = 1'b0;
- #TBAUD
- I_uart_rx = 1'b0;
- #TBAUD
- I_uart_rx = 1'b1;
- #TBAUD
- I_uart_rx = 1'b1;//stop
- end
- always
- begin
- #20 I_sysclk = ~I_sysclk;
- end
-
- endmodule
复制代码
4.2启动modelsim仿真设置运行2ms(如果时间太长需要找下数据位置,时间太短需要继续跑直到波形出来) 5下载演示5.1硬件连接(该教程为通用型教程,教程中仅展示一款示例开发板的连接方式,具体连接方式以所购买的开发板型号以及结合配套代码管脚约束为准。) 请确保下载器和开发板已经正确连接,并且开发板已经上电(注意JTAG端子不支持热插拔,而USB接口支持,所以在不通电的情况下接通好JTAG后,再插入USB到电脑,之后再上电,以免造成JTAG IO损坏) 5.2运行结果
|