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

(原创声明:该文是作者的原创,面向对象是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文件。

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

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

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

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

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

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

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

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

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

  • 28
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值