FPGA之RAM详解,伪双口RAM的使用

      伪双口RAM从灵活度上来说,刚好介于单口RAM和真双口RAM之间,但是不得不说它是RAM中应用最广的配置类型,其难能可贵地兼顾了真双口RAM的读写灵活性,也兼顾了单口RAM的设计稳定性。因为伪双口RAM只有一个端口可以向地址中写入数据,而另外一个端口只可以从地址中读出数据,所以这既避免了真双口RAM的大概率性读写冲突的窘境,也完善了单口RAM无法同时读写地址的缺陷。

      在这个练习中去用伪双口RAM IP来实现异步时钟FIFO的功能,用RAM来实现FIFO,这也是RAM在工程项目当中非常重要的一个应用,看到这里有些同学可能会问明明已经有现成的FIFO IP核了,为何还需要多此一举再用RAM模拟FIFO的功能呢,通过前面的博客学习实践,其实大家也已经逐渐掌握了FIFO和RAM之间的异同点以及适用背景,这里用RAM来实现FIFO的功能在工程应用中可以弥补了FIFO不能重复读出数据、和不能覆盖数据的缺陷,可以理解成升级版的FIFO。

       这里来设计一个经典的模块通过伪双口RAM来实现异步时钟FIFO功能,本模块包含读写位宽均为8位,读写深度是32的伪双口RAM,然后类似上一小节的FIFO练习,上游模块最多可以写入30个数据,每次输入写进本模块的数据信号ram_din和其指示信号ram_din同时到来,然后下游模块输入rdy信号时,本模块即向下游模块输出读出数据信号ram_ dout和其指示信号ram_dout_vld,同时为了方便观察,也把ram_wea写使能信号例化出来,如图2到4分别为伪双口RAM IP核的内存类型配置和端口AB的配置,本练习的信号列表如表1所示。

       在这个练习中,我们wr_cnt和rd_cnt用以计数写入RAM数量和读出RAM数量,如图1伪双口RAM IP练习中各个信号的波形图,因为本模块相对设计比较复杂些,所以笔者在这里也用TimeGen把整个模块的各个信号量的波形图绘制出来,具体细节请大家参考图5伪双口RAM IP练习的代码设计,因为写入ram数据需要同一时钟下,在给出具体ram_wr_addr的同时ram_wea 为高且ram_wr_din被写入正确的数据,而读出ram数据,需要在给定ram_rd_addr后的一个时钟周期,ram_rd_dout才可以读出其正确的数据,在这里ram_dout_vld用了时序逻辑,来人为弥补ram_rd_dout较ram_rd_addr误差的一个时钟周期。如图6是本模块的输入信号激励设计,大家代入Modelsim后可以观察到如图7的仿真结果,可以观察到在ram_din_vld被拉高的周期内,上游模块输入了ram_din写入数据,而再下游模块输入rdy的信号时,本模块立刻拉高ram_dout_vld信号,并输出对应的ram_dout读出数据,仿真结果完全符合设计预期。

        这篇博客也是最后一篇FPGA基础实践,后期FPGA博客更新将主要围绕上篇博客列举的20个经典实战例程展开。

信号列表

信号名

I/O

位宽

clk_in

I

1

rst_n

I

1

rdy

I

1

ram_din

I

8

ram_din_vld

I

1

clk_out

I

1

ram_dout

O

8

ram_dout_vld

O

1

ram_wr_addr

O

5

ram_rd_addr

O

5

ram_wea

O

1

表1 伪双口RAM IP练习设计中的信号列表

图1 伪双口RAM IP练习中各个信号的波形图

图2 伪双口RAM IP核的内存类型配置

图3  伪双口RAM IP核的端口A配置

图4 伪双口RAM IP核的端口B配置

图5 伪双口RAM IP练习的代码设计

图6 伪双口RAM IP核练习的输入信号激励设计

图7 伪双口RAM IP核练习的仿真结果

  • 5
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
双口RAM是一种具有两个独立读写地址空间的RAM IP核,它在FPGA程序设计中提供了最大的设计空间和灵活性。然而,由于其灵活性和自由度较高,实际上在工程项目中使用频率相对较低。这是因为在设计程序过程中,用户很难处理两个独立读写端口之间不可避免的读写冲突。一些FPGA工程师可能会使用复杂的读写状态机来规避读写冲突,但大多数人更倾向于简单的设计方式。在大多数情况下,简单就是最好的,既能保证设计效果,又兼顾代码的易读性和实用性。因此,选择使用IP核是比较可靠和成熟的方法。在IP核的定制中,可以选择是否寄存原语输出和IP输出。选择寄存会导致输出延迟一拍,选择同时寄存原语和IP输出会延迟两拍。在设计中,选择了IP核寄存,并且由于输出固有的一拍延迟,所以总共延迟两拍。RAM是随机存取存储器的缩写,是与CPU直接交换数据的内部存储器。在Quartus II中,生成RAM IP核时有两种可选:单口RAM双口RAM双口RAM又分为简单双口RAM和真双口RAM。简单双口RAM有一个读端口和一个写端口,写端口只能写不能读,读端口只能读不能写。真双口RAM有两个读/写端口,可以同时进行读写操作。 #### 引用[.reference_title] - *1* [FPGARAM详解,真双口RAM使用](https://blog.csdn.net/wandou0511/article/details/123262321)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [FPGA设计心得(1)真双口RAM使用及其仿真问题记录](https://blog.csdn.net/Reborn_Lee/article/details/106000966)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【小月电子】ALTERA FPGA开发板系统学习教程-LESSON14 IPCORE之双口RAM详细教程](https://blog.csdn.net/Moon_3181961725/article/details/126693294)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值