FPGA IP核 串口实验 signaltap


前言

之前有写过verilog对FPGA串口和sdram的操作,但是我整合代码的能力还是差点,于是想到如果能用IP核直接玩应该会方便很多吧,所以本文就专门对基于quartus 的串口IP核进行了探索。
使用到的平台:

  1. quartusII 18.0标准版
  2. 黑金AX301开发板,芯片为EP4CE6F17C8N
  3. quartusII 内嵌的signaltap
  4. USB转232设备,看不太清型号,应该是CH340G

一、IP核

IP核可以认为是一个别人写好的模块,我们根据参数直接配置进行。这样的话就类似于STM32CUBEMX对外设进行配置之后就可以调用API直接使用了。

1. 新建工程

新建工程这种操作应该不用再说了,新建都还没操作过的应该也不会看这个。

2. IP核建立和调用

在Tools–>IP Catalog或者Tools–>Platform Designer都能实现相关功能。网上有文章说二者的区别是IP Catalog主要用于NIOS,如果仍然使用verilog进行所有操作还是使用Platform Designer比较好。本文使用的是Platform Designer。Platform Designer中左边有一个IP Catalog窗口,找不到的话在View–>IP Catalog能找到,在上面有一个搜索窗口,搜索232,有两个结果,选择RS232 UART选项然后添加。
在这里插入图片描述
添加后会弹出下面的窗口,其中Interface Setting中有Streaming和Memory Mapped两种模式,后者主要用于NIOS,所以选择前者。波特率115200,其他的参数可以视情况而定。
在这里插入图片描述
在platform designer窗口最下面有一个Generate HDL…按键,如果就这样直接生成的话会报错,提示时钟未知。可以解释为:在时钟未知的情况下,内部波特率计数器无法进行设置。
因此,还需要一个时钟,同样地,在IP Catalog中搜索Clock Source,选择clock source,如下图所示.在这里插入图片描述
双击之后弹出下图所示的窗口,由于使用的开发板上面的晶振为50MHz,设置时钟频率为50MHz,然后下面的checkBOX中勾选频率已经知晓,相当于告诉串口模块我使用的时钟频率,这样的话才能产生正确的内部波特率计数器。
在这里插入图片描述在finish之后出现下图所示的两个模块,图中是已经连上线的两个模块,图中时钟源的输出与串口模块的时钟输入模块相连;时钟模块的输出复位与串口的输入复位相连接;串口的输入和输出直接相连。在这里插入图片描述
连接完成之后点击右下角的Generate HDL…生成硬件描述文件,无报错说明生成正确。

3. 工程文件的配置

IP核的调用需要将生成的相关文件添加到工程中,在上面我Platform Designer中的文件名为rs232.qsys,生成的文件应该也带有rs232字样,在工程下面的目录出现了rs232名称的文件夹,在该文件夹下有simulation和synthesis两个文件夹,分别为仿真和综合文件,将simulation文件夹中的.sip文件添加到工程,然后将synthesis中的.qip文件添加到工程,最后将rs232文件夹中有rs232_inst.v,这个是生成的一个调用模板,添加到工程,然后在这之上进行修改就行了。
在这里插入图片描述

二、串口IP核

1

下图是新建串口模块时给出的模块的管脚图,可以看到除了常用的几个信号之外,中间还有to(from)_uart_error、to(from)_uart_valid和to(from)_uart_ready几个信号,根据经验可以判断是指示数据有效一类的信号。没有找到相关文档,就CSDN了一下。
在这里插入图片描述
有老哥说过可以按照下图中红框内的时序来控制。在这里插入图片描述
好,我们就看看这个时序。在valid为高时data能进行传输,然后在valid为低时,数据和错误指示为don’t care,认为valid为类似输出使能的用法。而ready的电平对数据的影响没有看出来。
于是乎,我想的是既然这样我先做一个串口发送的程序看看中间变量。先将to_uart_valid一直拉高,to_uart_data赋值0xaa,一直发,看看能有什么效果。于是在signaltap中看了一下波形,啥变化都没有……调了老半天,没找到结果……一气之下将IP核调用时的串口输出和输入相连,这总会有东西吧,正确的结果应该是我用串口助手发送一个什么东西就能接收到什么东西。

2.

rs232_inst.v文件改写如下

module tr(
    input wire clk,//50MHz时钟
    input	rst_n,//e15
    input wire rxd,
    output wire txd
);
	rs232 u0 (
		.clk_clk                        (clk), //                        clk.clk
		.reset_reset_n                  (rst_n), //                      reset.reset_n
		.rs232_0_external_interface_RXD (rxd), // rs232_0_external_interface.RXD
		.rs232_0_external_interface_TXD (txd)  //                           .TXD
	);
endmodule

在signal tap中添加中间变量,主要是看几个ready和valid变量与信号之间的关系。
在这里插入图片描述感觉看不出来什么东西,从上图只能知道在一个byte接收或者完成之后valid会在一个时钟周期内产生一个高电平,然后变为低电平。把串口收发相连的线断开,发现使用signaltap也不能探测到valid和ready等模块的电平变化,甚至连bit_counter也检测不到动作电平。
就拿上面的signaltap捕获到的信号的时序也很乱,不知道是不是我触发设置的问题,而且前后rxd与接收到的数据在时序上差了挺多时间的,看IP核内部应该是有使用到FIFO的。

总结

本文使用IP核实现了串口转发的功能,实验发现,较大量数据的传输也会导致误码,这个和自己写的串口效果一样。估计加上校验位就好多了。对于内部valid和ready信号的变化情况的研究也没能实现,希望有知道的老哥能赐教一下。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值