OpenCores 串口IP核使用记录

IP核来源:https://opencores.org/projects/uart2bus
仅使用了这个IP核当中的串口收发模块。

Github项目地址
https://github.com/SaltyFishX/UARTCore

波特率计算公式解释:
计算公式:
baud_freq=16*baud_rate/gcd(global_clock_freq,16 * baud_rate)

baud_limit = (global_clock_freq / gcd(global_clock_freq, 16*baud_rate)) - baud_freq

注意:
baud_limit为计数器计数上限,系统时钟计数满则产生一个分频的脉冲信号。
baud_freq为计数器计数步长值。
gcd:求最大公约数
转自博客:https://blog.csdn.net/qq_43042339/article/details/103798512

串口发送输出:
1个起始位,8个数据位,没有校验位,1个结束位。

问题:
波特率与计算的相差一个数量级,具体如图所示。
在这里插入图片描述
在这里插入图片描述
一个位的时间间隔为8680ps,但波特率11520的时间间隔应为8680ns,目前该问题尚未解决。

2020.08.15更新:
问题解决了,太晚了注意不集中,timescale设置错了,设成了1ps/1ps,导致50M时钟错误,应该设成1ns/1ns,改过以后仿真结果和昨天的图差不多,但是时间间隔从ps变成了ns。

部署到黑金AX301(芯片为EP4CE6F17)上也能够成功使用,对原来的工程进行了一定的改变与削减(
因为用不到那么多功能),不断通过串口发送05和0F,最终结果如图:
在这里插入图片描述
之后准备对串口接收进行测试与部分改变,然后将改过的IP核放到Github里,便于以后移植。

2020.08.16更新

串口接收测试:
在这里插入图片描述
在这里插入图片描述
接收测试成功,明天进行硬件上的测试。

2020.08.17更新

串口接收和发送测试

测试成功,废话不多说直接上图
在这里插入图片描述
所存问题:
目前虽然实现了串口的发送和接收,但是只能接收单个字节,比如我发567串口就只能返回5,后面再进行改进。

2020.08.18更新
问题解决了,在uart2bus的文件里没睡醒加了一个1ms的延时。。导致tx_begin信号给的不及时,调试ok了以后Modelsim的仿真和硬件上测试结果如图:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
最近一个项目需要做I2C的slave,在opencores.org上面找到了一个I2C的代码,不过是master的。 下载来看看,发现里面有一个I2C slave的行为级代码。 于是自己根据这个代码改写了一个I2C slave RTL的代码,并修改了原来那个设计的testbench,将rtl的Slave替换了原来的behavior的Slave,在modelsim里面作了前仿,完全通过。还有一个myram.v文件,是一个register file,和slave相连,存储数据用的。 用synplify做综合,使用x3s400-4的器件,占用LUT<100,速度接近200MHz。性能比较优化。 代码做了详尽的注释,语言采用verilog,并且写了仿真的脚本。解压了直接运行simbehav.bat就可以了。如果modelsim安装的时候注册了环境变量(path),脚本调用modelsim,输入run -all即可看到仿真结果。 虽然不是很复杂,不过对于广大需要做I2C的RTL slave的工程师来说,还是很有参考价值的。 1、 设计流程 将I2C slave的行为模型改为rtl模型。 进行等效仿真,直到波形一致,通过timing check,数据正确。 再进行rtl优化设计 2、 注意要点 a) 时钟的设计 b) 对于restart condition的时序是否正确 c) 3、 进度 a) 11-12:initial状态的bitcnt不对,需要认真比对/设计 b) 11-13:initial基本解决(sda_in的问题)。Sda三态冲突,原因不明。比对原设计 c) 11-14:sda三态冲突解决,原因为sda在初始化时没有将sda_oen赋值(由sm赋值,但是sm没有做async reset)。同时注意verilog的大小写敏感。 d) 11-15:仿真出现错误:read出来的数据非期望值。写入逻辑完全正确。Read时由于sda_oe在sm中有一个cycle_pulse的延迟,导致了mem_do[7]串行移出时错位。在更改了sm的代码风格后再研究解决方法。 e) 11-16:仿真完全匹配波形。计划:优化结构,提高稳定性sm改为每个时钟打一下。 关于I2C的SDA三态转换: Master在发送完第8个bit后随后将sda释放(posedge后大概1/4 scl周期),此时slave需要在第九个bit对应的scl的posedge拉低sda。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值