在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 1117|回复: 3

[原创] 孩子都能学会的FPGA:第十二课——利用内存产生正弦波

[复制链接]
发表于 2023-11-27 17:36:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 chdaj58 于 2023-11-27 17:40 编辑

(原创声明:该文是作者的原创,面向对象是FPGA入门者,后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门作者不光让大家知其然,还要让大家知其所以然!每个工程作者都搭建了全自动化的仿真环境,只需要双击top_tb.bat文件就可以完成整个的仿真(前提是安装了modelsim),降低了初学者的门槛。如需整个工程请留言(WX:Blue23Light),不收任何费用,但是仅供参考,不建议大家获得资料后从事一些商业活动!

上节课说到可以利用异步缓存完成多比特数据的跨时钟域同步,但是很多人对FPGA内部的存储还不太了解。这儿我们先介绍一下。

FPGA内部的缓存其实都是RAM (Random Access Memory)随机访问存储器,但是生成IP核的时候可以选择是RAM或者ROM。

RAM又称随机存取存储器,存储单元的内容可按照需要随机取出或存入,且存取的速度与存储单元的位置无关。这种存储器在断电时,将丢失其存储内容,所以主要用于存储短时间使用的程序。

ROM全称Read Only Memory,顾名思义,它是一种只能读出事先所存的数据的固态半导体存储器。ROM中所存数据稳定,一旦存储数据就再也无法将之改变或者删除,断电后所存数据也不会消失。其结构简单,因而常用于存储各种固化程序和数据。

但是在FPGA内部,ROM其实也是由RAM构造而成的,所以FPGA内部的ROM不是真正的ROM,因为ROM内部的数据不是从硬件上固化的,是初始化的时候才将数据固定住,掉电里面的信息还是会消失的。就是FPGA内部的ROM只是模拟了ROM的功能,并不是实际的ROM。
所以不管是FPGA内部的RAM还是ROM,都不具备掉电数据存储的功能。如果FPGA内部只有RAM而没有Flash,那FPGA的配置程序必须放在片外Flash里面,上电的时候从外部Flash中读取配置的信息对FPGA进行配置。

本工程是实现正弦波的输出,我们可以根据实际的需要产生一组数据来表示一个周期正弦波的值。比如我们可以用128个8bit的数据来表示一个周期的正弦波数据,也可以用256个8bit的数据来表示一个周期正弦波的数据,当然也可以用1024个16bit的数据来表示一个周期的正弦波的数据,这个根据实际的需求,比如精度。

那我们可以先生成一组的正弦波数据,然后把这组数据存储在RAM或者ROM中,然后需要的时候从RAM或者ROM读出这组数据就是输出了正弦波。

本工程采用ROM,用256个8bit的数据来表示一个周期的正弦波,Xilinx的内存初始化要使用coe文件,这个coe文件可以通过matlab或者python来产生。如下所示,产生的是256个8bit的定点数。如果想产生其它的波形,比如三角波,余弦波思路都是一样的,只需要把下面生成数据的地方相应修改即可。运行matlab即可以生成sp_ram_256x8.coe文件。

v2-09167b24bb05d8b8bc4dd9dfa08cbc45_720w.png
vivado软件中,建立一个名为sp_rom_256x8ROMIP核,如下所示,选择Single Port ROM即了,当然选择Single Port RAM也可以,只是使用的时候不用RAM的写功能即可。

v2-5b46719b621cfac900c0b2133fc30492_720w.png

然后设置ROM的位宽核深度,这个可以根据实际需求进行调节。


v2-4ff1a0ad45248f73a7e6c664a9342b7d_720w.png

最后一定要Load Init File,也就是load coe文件。

v2-27be170a841b6232b8c84e45688bc526_720w.png

FPGA设计非常简单,只需要用计数器产生一个累计的地址信号给到ROM,下个时钟周期相应地址内的数据就会被读出来。

v2-e48bcdb64ebdd7791958dad5c8634cbd_720w.png

如果用vivado自带的仿真软件进行仿真或者vivado和modelsim联合仿真都很简单,因为vivado会自动生成相关的文件。但是笔者用的是自动化仿真,就是用双击top_tb.bat文件直接开始仿真,不需要打开vivado软件。这就需要首先完成vivado编译库的编译和modelsim的配置,这个网上有很大教程,笔者后续也会详细介绍。

有了vivado的仿真库,只需要ROM的仿真文件sp_rom_256x8.v和编译的数据文件sp_rom_256x8.mif即可以完成仿真。将run.do 文件修改如下所示。

v2-3e903715721b997e572f0a0d3f5e8f84_720w.png

最后双击sim目录下的top_tb.bat文件,即可实现全自动化的仿真。


v2-732cc0caddf24f3223ee0b18b13e9a8d_720w.png

最后将doutRadix设置成DecimalFormat设置成Analog,当然也可以在run.do文件里面设置,如下所示dout如果是正弦波,就说明功能设计正确。

v2-f01dd414dc85a8620c680788a0e38347_720w.png

有了正弦波,后续就可以进行DDS,混频,滤波等功能的开发。



发表于 2023-11-28 20:50:50 | 显示全部楼层
第10,11课呢?
 楼主| 发表于 2023-11-29 09:24:06 | 显示全部楼层


周末不好上传,刚才上传了,在csdn上是有完整更新的。
发表于 2024-6-25 13:48:20 | 显示全部楼层
感谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-27 04:33 , Processed in 0.019399 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表