FPGA基础设计(八):串口收发之RAM存储

这篇具有很好参考价值的文章主要介绍了FPGA基础设计(八):串口收发之RAM存储。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

实现上位机通过串口发送数据到FPGA,FPGA接收到数据后将其存储在RAM的一段连续空间中,然后通过按键触发读出RAM数据,再通过串口发送到上位机。

整体设计

fpga毕业设计 ram,# FPGA基础设计,fpga开发

模块划分

1、串口接收模块;
2、按键消抖模块
3、创建RAM IP核模块
4、RAM IP核控制模块;
5、串口发送模块。
前面已经设计好了串口发送模块,串口接收模块和按键消抖模块,还剩RAM IP的创建和控制RAM模块的设计。

控制RAM读写的逻辑

fpga毕业设计 ram,# FPGA基础设计,fpga开发

1、简易双端口RAM,有两组地址:写地址wraddress、读地址rdaddress
2、只设置了写使能wren,没有设置读使能;
3、设置单时钟模式clock来控制所有寄存器,而且没有设置时钟使能 ;
4、data:要写入RAM的数据、q:RAM读出的数据。

1、控制写RAM

当需要写入数据时,把wren信号拉高的同时,给出写地址rdaddress和写数据data[7:0],数据就会按照指定的地址写入对应的存储单元;

   具体而言,FPGA接收到数据后将其存储在双口RAM的一段连续空间中,需要设计wren写使能的同时给一个wraddress写地址自加的控制;
   实现:在串口接收模块中,每接收一帧数据后会有一个时钟脉冲的标志信号Rx_Done表示数据接收完成,则Rx_Done作为写地址自加条件,同时作为写使能信号;写第一个字节时,直接写在地址0,然后出现Rx_Done信号,写地址wraddress加1,这样接收到的字节存储在一段连续空间中。

       always@(posedge Clk or negedge Rst_n)
         if(!Rst_n)
           wraddress <= 8'b0;
		 else if(Rx_Done)
           wraddress <= wraddress + 1'b1;
	     else 
           wraddress <= wraddress;			

2、控制读RAM

当需要读出数据时,这里没有设置读使能信号,直接给出当前读地址rdaddress,输出端口q[7:0]就会根据当前指定的地址输出对应存储单元的数据。

fpga毕业设计 ram,# FPGA基础设计,fpga开发

如何将数据连续发送出去
q始终连接串口发送模块的数据输入;
开始时读地址为0,输出端q为地址0对应的存储单元中的数据,第一次按键按下,Send_en使能将q端数据发送出去,然后触发Tx_Done,读地址加1,同时又作为Send_en的使能条件,将q对应的第二个字节发送出去,这样连续地读出RAM中数据。
串口使能发送Send_en的触发
第一次按键按下,Send_en使能将q端数据发送出去;
后续Send_en使能是上一帧数据发送完成标注Tx_Done和按键状态Send_flag共同触发。
为什么读RAM时候可以连续的读?
连续的读也就说明Send_en信号持续有效。上面也说了Send_en使能是由当前按键状态和上一帧数据发送完成标志信号Tx_Done共同触发,当第一次按下按键Send_flag就持续有效,所以当第一帧发送完成出现Tx_Done,然后触发Send_en使能,接着就继续发送下一帧,发送完成又会出现Tx_Done,则连续的读。
为什么将Send_en的触发信号(Send_flag & !Tx_Done) 寄存两拍
在对RAM IP进行仿真时,读出的数据总是延时对应的存储地址两拍。

RAM IP核

M9K存储器模块

fpga毕业设计 ram,# FPGA基础设计,fpga开发

通过对M9K存储器模块进行配置,可实现各种存储器功能:RAM、移位寄存器、ROM、FIFO。
下面是M9K存储器模块支持的模式

  1. 单端口RAM
    只有一组地址线,这组地址线控制着写数据端口和读数据端口;
    支持从单一地址上的异时读写操作;
  2. 简单双端口RAM
    有两组地址线,分别控制着写数据端口和读数据端口;
    支持不同位置的同时读写操作;
  3. 真正双端口RAM
    与简单双端口RAM相比,两个数据端口都可用做读/写;
    真双端口模式支持两个端口操作的任意组合:在两个不同时钟频率上的两个读操作、两个写操作、一个读操作和一个写操作。

简单双端口RAM端口框图

fpga毕业设计 ram,# FPGA基础设计,fpga开发

管脚说明
data:RAM写数据端口
wraddress:RAM写地址端口
wren:写使能信号,高电平有效
bytenena:字节使能控制,该功能屏蔽了输入数据,这样仅写入数据中指定字节,未被写入的字节保留之前写入的值【创建IP这个功能可选】
wr_addressstall、rd_addressstall:地址使能控制,为高电平时,有效地址时钟会保持之前的地址【创建IP时可选】;
wrclock、rdclock:输入与输出时钟,输入时钟控制存储器模块的所有输入寄存器,包括data、wraddress、wren、rden寄存器;输出时钟控制数据q寄存器;
wrclocken、rdclocken:使能输入输出时钟;
rdaddress:RAM读地址端口;
rden:读使能信号,高电平有效;
q:RAM读数据端口;
aclr:异步复位信号,对RAM中数据进行清零操作,高电平有效。

这里创建的RAM非常简易,实现基本的读写操作即可

fpga毕业设计 ram,# FPGA基础设计,fpga开发

1、简易双端口RAM,有两组地址:写地址wraddress、读地址rdaddress
2、只设置了写使能wren,没有设置读使能;
3、设置单时钟模式clock来控制所有寄存器,而且没有设置时钟使能 ;
4、data:要写入RAM的数据、q:RAM读出的数据。

创建RAM IP核

1、选择双端口RAM的IP
fpga毕业设计 ram,# FPGA基础设计,fpga开发
2、设置双端口RAM一个为读端口和一个为写端口【简单双端口RAM】
设置储存器大小的方式为按照字数确定
fpga毕业设计 ram,# FPGA基础设计,fpga开发
3、设置存储器容量;端口位宽为8【存储串口接收的一个字节数据】;
fpga毕业设计 ram,# FPGA基础设计,fpga开发
4、选择单时钟模式,即通过单时钟clock和一个时钟使能信号控制存储块所有的寄存器;
不创建读使能信号
fpga毕业设计 ram,# FPGA基础设计,fpga开发
5、对输出端口进行寄存;不创建时钟使能信号;不创建异步复位信号【是对RAM中的数据清零操作,本次实验不需要清零】
fpga毕业设计 ram,# FPGA基础设计,fpga开发
6、该页面指定在对RAM进行写操作时,读数据输出选择。
具体而言,写操作期间,RAM输出行为是可以配置的。如果在写操作期间激活了rden信号,则RAM输出端会显示相应地址上正在写入的数据【选择New Data】,或者原有的旧数据【Old memory contents appear】;如果在rden信号未激活的情况下执行写操作,那么RAM输出端将保留它们在最近的rden信号有效期间所保留的值。
本文没有使用rden信号,而且先把数据全部写入到RAM中,然后再一个字节一个字节的读出来,所以不考虑同时读写操作,就像选择了I do not care一样。那么如何读出对应地址上的存储单元中的数据呢?【具体看控制RAM读写模块设计】
fpga毕业设计 ram,# FPGA基础设计,fpga开发
7、创建RAM IP核,可以进行初始化也可以不进行;而创建ROM IP核必须进行初始化。
fpga毕业设计 ram,# FPGA基础设计,fpga开发
至此简易双端口RAM IP核已创建完毕,可以进行简单的测试.

IP核测试

输出q延时读地址两拍,所以在设计的时候要进行同步处理。
fpga毕业设计 ram,# FPGA基础设计,fpga开发

延时两拍的原因:
设计中使用锁存器的原因,会导致延时一拍;
创建IP核的时候,q被寄存了一拍,如下图,如果不勾选则只延时一拍。
fpga毕业设计 ram,# FPGA基础设计,fpga开发
fpga毕业设计 ram,# FPGA基础设计,fpga开发文章来源地址https://www.toymoban.com/news/detail-773117.html

到了这里,关于FPGA基础设计(八):串口收发之RAM存储的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA-串口接收图像写入RAM并读出在TFT显示屏上显示

    需要用到的模块有: 1,UART_RX(串口接收模块); 2,串口接受的数据存放到RAM模块; 3,RAM IP核; 4,时钟IP核 (TFT显示屏驱动时钟的产生); 5,TFT显示驱动模块; 具体构建方式及详见(其中的串口接收部分) FPGA-UART串口 https://blog.csdn.net/weixin_46897065/article/details/135586405?spm=

    2024年03月19日
    浏览(37)
  • FPGA原理介绍 (CLB, LUT, 进位链, 存储元素, RAM)

    本文首先对 ASIC 和 FPGA 进行了一个对比,然后介绍了 FPGA 的基本结构,最后解释了 FPGA 实现可编程的基本原理。 这里先给出 ASIC 和 FPGA 的优缺点 ASIC FPGA 优点 性能优越 可靠性高 大批量下单位成本低 开发初期无投入资金壁垒 设计工具使用方便,设计简单快速 产品原型机开发

    2024年02月20日
    浏览(32)
  • [FPGA IP系列] FPGA常用存储资源大全(RAM、ROM、CAM、SRAM、DRAM、FLASH)

    本文主要介绍FPGA中常用的RAM、ROM、CAM、SRAM、DRAM、FLASH等资源。 RAM(Random Access Memory)是FPGA中最基本和常用的内部存储块,根据不同架构可以实现不同容量,最大可达几十Mb。 FPGA中的RAM主要包括: 分布式RAM:存在于逻辑块(LE)中的小容量RAM,通常为几百比特到几千比特。 块RAM:F

    2024年02月12日
    浏览(31)
  • 【FPGA零基础学习之旅#13】串口发送模块设计与验证

    🎉欢迎来到FPGA专栏~串口发送模块 ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏与酒 🍹 ✨ 博客主页: 小夏与酒的博客 🎈该系列 文章专栏: FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ 🥝 发送测试: 🥝 issp调试测试: 数据

    2024年02月09日
    浏览(46)
  • Verilog实现FPGA可编程电路中的RAM存储器

    Verilog实现FPGA可编程电路中的RAM存储器 在FPGA可编程电路的设计中,RAM存储器通常被广泛使用。而手写RAM存储器则可以提供更加灵活、高效的设计方案。本文将介绍如何使用Verilog语言来手写FPGA中的RAM存储器。 首先,我们需要确定RAM存储器的大小和宽度。假设我们需要实现一个

    2024年02月04日
    浏览(40)
  • (34)FPGA IP设计(RAM)

    1.1 本节目录 1.2 IP核介绍 1.3 FPGA介绍 1.4 Verilog介绍 1.5 Vivado_RAM_IP设计 1.6 结束语 IP核有行为(Behavior)级、结构(Structure)级和物理(Physical)级三个层次的分类,对应着三个种类型的IP核,它们是由硬件描述语言设计的软核(Soft IP Core)、完成结构描述的固核(Firm IP Core) 和基于物理描述并

    2024年01月19日
    浏览(30)
  • 【FPGA项目】沙盘演练——基础版报文收发

                                            ​​​​​​​        ​​​​​​​        ​​​​​​​         第1个虚拟项目         点灯开启了我们的FPGA之路,那么我们来继续沙盘演练。         用一个虚拟项目,来入门练习,以

    2024年02月10日
    浏览(32)
  • 基于FPGA的通用异步收发传输器(UART)设计

    基本目的:   (1)了解UART通讯原理,包括数据传输格式、电气特性等; (2)研究Basys3开发板与PC之间通讯电平规格的转换; (3)设计并实现UART的发送(TX)功能或接收(RX)功能。 高级任务(可选):可调。 (4)设计并实现UART的发送(TX)功能和接收(RX)功能,构建回

    2024年02月16日
    浏览(35)
  • FPGA实现AD9708和AD9280波形收发输出HDMI模拟示波器,串口协议帧控制显示,提供工程源码和技术支持

    AD9708 很简单,8 位分辨率,125MSPS 采样率,输入参考电压3~5V,内置 1.2V 参考电压,8bit数字信号输入,差分电流输出;芯片操作不需要软件配置,给个时钟信号就工作,简单得很,根据官方手册,内部结构如下: SLEEP引脚提供芯片休眠功能,当不需要使用该芯片时可拉高SLEEP以

    2024年02月02日
    浏览(41)
  • FPGA-结合协议时序实现UART收发器(五):串口顶层模块UART_TOP、例化PLL、UART_FIFO、uart_drive

    串口顶层模块UART_TOP、例化PLL、UART_FIFO、uart_drive,功能实现。 对照代码,串口发送模块UART_TOP实现功能包括: PLL锁相环,实现稳定系统输入时钟功能 UART_FIFO,数据先进先出,实现数据缓存功能,防止出现数据错乱 w_clk_rst = ~w_system_pll_locked;保证复位电平是先高位再地位 r_use

    2024年02月08日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包