立题简介:
内容:FPGA编写Verilog实现UART串口通信实验;
来源:实际得出;
作用:FPGA编写Verilog实现UART串口通信实验;
仿真环境:Quartus II 11.0;
日期:2019-04-03;
=====================分割线========================
立题详解:
本次介绍“使用编写Verilog实现串口通信实验”,使用“FPGA芯片”为“EP4CE6E22C8”,价格约“15.00RMB/PCS”,“LEs数目”约为“6272”;
本次介绍为“译码器电路”,代码实测可用,简介如下:
i)、“开发环境”:环境为“Quartus II 11.0”;
ii)、FPGA芯片:芯片为“EP4CE6E22C8”,价格约“15.00RMB/PCS”,“LEs数目”约为“6272”;
iii)、“电路描述”:使用电路描述为“UART串口通信”;
1、串口通信意义
当前而言,“UART串口通信”已极为普遍,适用于现在的各个方面,其有效使用范围为“10m以内”且“速度不高”,但其使用方便、可扩展性,已成为大众所接受的标准通信协议之一;
实际,在对“多机通信”或“上位机控制”时候,必定会涉及到“控制通信问题”,主要有2种方式:“串行通信”、“并行通信”;
i)、“串行通信”:简要介绍为:数据为“逐位传输”、传输速度慢、所需IO口少、便于扩展;
ii)、“并行通信”:简要介绍为:数据为“总线传输”、传输速度快、所需IO口多;
此处,“UART串口通信”属于“低速、串行通信”的一种,其实际使用只需2根通信线,即“TX”、“RX”,附加一根“GND线”即可实现有效通信;
PS:特别注意:“板级间”必须“共地”,即“GND必须连在一起”,否则无“公共基准电位”,其仍旧无法通信;
2、串口通信实现
本次,使用“Verilog语言”对“EP4CE6E22C8”进行代码编程,使其实现“UART串口通信”;但由于“通信协议代码较多”;
参考网友的例程后,采用设计思路为:“模块化编程”、“实例化模块”进行代码架构管理;
首先,添加“驱动代码”:工程架构图如下所示:
其中,文件夹“BSP_USART”下存放为“UART所需BSP文件”,如下图所示:
此3个驱动文件,包含了“UART通信”所需的基本设置;
主要为4部分设置:“波特率”、“数据位”、“校验位”、“停止位”设置,“流控”多设置为“NONE”;
本次设置为“9600波特率”、“8bit数据位”、“1bit停止位”、“无奇偶检验位”;“流控”设置为“NONE”;
内部设置图如下所示:
然后,编写“例化代码”:代码如下所示:
module bsp_uart_Verilog(clk,rst_n,rs232_rx,rs232_tx);
input clk; // 50MHz主时钟
input rst_n; //低电平复位信号
input rs232_rx; // RS232接收数据信号
output rs232_tx; // RS232发送数据信号
wire bps_start1,bps_start2; //接收到数据后,波特率时钟启动信号置位
wire clk_bps1,clk_bps2; //
clk_bps_r高电平为接收数据位的中间采样点,同时也作为发送数据的数据改变点
wire[7:0] rx_data; //接收数据寄存器,保存直至下一个数据来到
wire rx_int; //接收数据中断信号,接收到数据期间始终为高电平
///////////////////////////////////////////
speed_select speed_rx(
.clk(clk), //波特率选择模块
.rst_n(rst_n),
.bps_start(bps_start1),
.clk_bps(clk_bps1)
);
my_uart_rx my_uart_rx(
.clk(clk), //接收数据模块
.rst_n(rst_n),
.rs232_rx(rs232_rx),
.rx_data(rx_data),
.rx_int(rx_int),
.clk_bps(clk_bps1),
.bps_start(bps_start1)
);
///////////////////////////////////////////
speed_select speed_tx(
.clk(clk), //波特率选择模块
.rst_n(rst_n),
.bps_start(bps_start2),
.clk_bps(clk_bps2)
);
my_uart_tx my_uart_tx(
.clk(clk), //发送数据模块
.rst_n(rst_n),
.rx_data(rx_data),
.rx_int(rx_int),
.rs232_tx(rs232_tx),
.clk_bps(clk_bps2),
.bps_start(bps_start2)
);
endmodule
注意其中的“例化写法”:
然后,编译工程并分配GPIO:
工程的RTL级如下所示:
引脚分配如下所示:
3、实际操作
本次代码实现的是“串口接收数据”并同时将“接到到数据发送到PC端”,实操结果如下所示:
如上所示:通过“串口调试助手”发送“数据A5”到“FPGA”,“FPGA”接收到数据后将“数据A5”返还至“PC端”,达到实验效果;