(原创声明:该文是作者的原创,面向对象是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_256x8的ROM的IP核,如下所示,选择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文件,即可实现全自动化的仿真。
最后将dout的Radix设置成Decimal,Format设置成Analog,当然也可以在run.do文件里面设置,如下所示dout如果是正弦波,就说明功能设计正确。
文章来源:https://www.toymoban.com/news/detail-770872.html
有了正弦波,后续就可以进行DDS,混频,滤波等功能的开发。文章来源地址https://www.toymoban.com/news/detail-770872.html
到了这里,关于孩子都能学会的FPGA:第十二课——利用内存产生正弦波的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!