加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

FPGA编写Verilog实现UART串口通信实验

(2019-04-02 15:41:27)
标签:

it

杂谈

立题简介:

内容: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端”,达到实验效果;

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有