基于FPGA的SDRAM控制器设计(一)「建议收藏」

基于FPGA的SDRAM控制器设计(一)「建议收藏」基于FPGA的SDRAM控制器设计(一)1.SDRAM控制器整体框架2.UART_RX模块3.UART_TX模块4.RX与TX模块的整合5.需要注意的问题1.SDRAM控制器整体框架图1.1整体框架PC端通过串口模块UART_RX发送读写命令以及数据到Cmd_encode模块,由后者分离出数据存入wfifo模块,剩下的读写命令传送到Sdram_top模块对SDRAM进行写操作或者从SDRAM读数据到rfifo模块并通过UART_TX模块将数据送出到PC端。2.UART_RX模块主体代码(见

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

1. SDRAM控制器整体框架

在这里插入图片描述


图1.1整体框架

PC端通过串口模块UART_RX发送读写命令以及数据到Cmd_encode模块,由后者分离出数据存入wfifo模块,剩下的读写命令传送到Sdram_top模块对SDRAM进行写操作或者从SDRAM读数据到rfifo模块并通过UART_TX模块将数据送出到PC端。

2.UART_RX模块

主体代码(见本文最后)由六个时序逻辑块组成,对波特计数器、接收信号线标志位、比特计数器、接收数据、以及Po标志位进行操作,使其能够遵从固定的时序逻辑(图1.2),完成串口的接收功能。
在这里插入图片描述


图1.2 UART接收模块时序图

测试代码主要由两个task组成,从txt文件中读取待传输数据,然后按位、按每位560个时钟周期的时序发送。仿真结果如下图1.3所示。
在这里插入图片描述


图1.3 UART接收模块仿真结果

观察到rx_data信号端口已输出预先设定好的数据(h55 h12 h34 haa)。

3.UART_TX模块

主体代码主要由六个时序模块组成,分别对数据发送寄存器、数据发送标志位、波特计数器、比特标志位、串口发送端进行设置,使其能够遵从图1.4所示的时序逻辑,完成串口的发送功能。
在这里插入图片描述


图1.4 UART发送模块时序图

测试代码将固定的数据(如:h55)送入UART_TX模块的Tx_data端并在tx_trig端给到一个小脉冲用以激活发送模块,仿真结果如图1.5所示。
在这里插入图片描述


图1.5 UART发送模块仿真结果

可以观察到rs232_tx端口已输出给定数据(h55)。

4. RX与TX模块的整合

整合两个模块使PC端与FPGA能够通过串口进行通信,如图1.6所示将po_flag与tx_trig,rx_data与tx_data相连,外部只留出时钟信号线、复位信号线以及数据的输入输出信号线。
在这里插入图片描述


图1.6 RX/TX TOP模块

5.需要注意的问题

1、采样时间点的选择:应在rs232_tx信号线每一位的最中间进行采样,这样能得到最稳定的信号
2、时钟周期的计算:串口每发送一位数据所占用的FPGA的时钟周期计算公式为:
一 位 数 据 占 用 时 钟 周 期 = 系 统 时 钟 串 口 波 特 率 一位数据占用时钟周期 = \frac{系统时钟}{串口波特率} =
例如:波特率为9600的串口每发送一位数据占用50M Hz FPGA时钟周期数为
50 × 1 0 6 9600 ≈ 5280 \frac{50 \times10^6}{9600}\approx5280 960050×1065280

3、编写UART_RX与UART_TX的目的在于让PC与FPGA能够通过统一的通信标准——串口通信进行数据的交流,在对两个模块进行整合后由于没有FPGA板子进行测试,所以又编写了一个测试文件进行模拟。模拟结果如图1.7。
在这里插入图片描述


图1.7 RX/TX TOP模块仿真结果

可以看到,在RS232模块的数据接收端rs232_rx(PC数据发送端)收到的数据与一定延迟后数据发送端rs232_tx(FPGA数据接收端)发送的数据保持一致。

6.代码

我的Github

7.参考资料

【开源骚客】基于FPGA的SDRAM控制器设计

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160099.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 多线程之join方法

    多线程之join方法一.前言:    在很多情况下,我们都是通过主线程创建并启动子线程的,如果子线程中需要耗费大量的时间计算的话,主线程往往会比子线程先结束,这个时候就会导致有时候主线程想获取子线程计算之后的结果,但是却获取不到。这个时候,我们就可以通过join方法来解决这个问题。二.join方法的作用:join方法的作用是使所属的线程对象x正常执行run()方法中的任务,而使当前线程z进行无限期的…

    2022年5月4日
    31
  • 链表的基本操作_简单链表

    链表的基本操作_简单链表链表的基本操作这里写目录标题链表的基本操作一:单链表的基础知识二:单链表的建立头插法尾插法三:单链表的遍历四:单链表结点数目判断五:单链表的插入链表头插入任意结点插入链表尾部插入六:单链表的删除七:单链表的查询一:单链表的基础知识为什么需要链表?我们在使用数组存放数据是非常方便,但是由于数组的长度是固定的,所以当存储不同的元素数量时,就很容易出现问题。如果向数组中添加的数量大于数组大小时候,信息无法完全被保存。所以我们需要另一种存储方式来存储数据,其中存储的元素的个数不受限制。这种存储方式就是链

    2025年6月20日
    2
  • eXtremeDB HA synchronization procedure

    eXtremeDB HA synchronization procedureeXtremeDBHAsynchronizationprocedure

    2022年8月31日
    2
  • java motherfree video_Java Config 下的Spring Test方式

    java motherfree video_Java Config 下的Spring Test方式用了三种方式:1.纯手动取bean:packagecom.wang.test;importcom.marsmother.commission.core.config.MapperConfig;importcom.marsmother.commission.core.config.PropertyConfig;importcom.marsmother.commission.core.conf…

    2022年7月7日
    23
  • Java练习:用Java语言编写九九乘法表[通俗易懂]

    Java练习:用Java语言编写九九乘法表[通俗易懂]//java程序编写九九乘法表:下三角publicclassTest1{ publicstaticvoidmain(String[]args){ for(inti=1;i<=9;i++){ for(intj=1;j<=i;j++){ System.out.print(j+"*"+i+"="+(i*j)+""); } System.o…

    2022年7月15日
    15
  • Creating Server TCP listening socket *:6379: bind: No error

    Creating Server TCP listening socket *:6379: bind: No error在Windows下启动redis报错:CreatingServerTCPlisteningsocket*:6379:bind:Noerror如图所示:解决方案:直接在命令行中输入:redis-cli.exe如下图所示:然后再输入:shutdown意思就是关闭的意思,如下图所示;然后再输入:exit意思就是退出的意思,如下图所示;然后重新输入启动命令:red…

    2022年6月7日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号