【Quartus FPGA】EMIF DDR3 IP 仿真记录

news2024/11/24 8:00:09

EMIF (External Memory Interface) 是 Quartus 平台提供的 IP,用于实现高速存储器件接口与控制器。通过 Intel Quartus Prime 软件,可以很方便地实现 EMIF IP 电路。本文记录了使用 EMIF 实现 DDR3 控制器的仿真过程,软件平台为 Quartus Prime Pro 21.3,器件型号为 10CX220YF780E6G.

目录

1 EMIF IP 介绍

2 EMIF DDR3 IP 配置

3 EMIF DDR3 IP 仿真


1 EMIF IP 介绍

 

       Intel EMIF IP 是 Quartus 平台提供的 IP,用于实现高速存储器件接口与存储控制器电路。借助 EMIF 电路,FPGA 可以与外部存储器件进行数据交换。 

        EMIF IP 实现物理层接口与存储控制器,这两部分的功能说明如下:

  • 物理层接口(Physical Layer Interface),用于建立数据通路,以及管理 FPGA 和存储器件的传输时序;
  • 存储控制器(Memory Controller),实现内存命令与协议层规范。

        EMIF IP 的总体设计流程如下图:

        EMIF IP 设计过程中涉及许多参数与配置步骤,IP 配置完成之后,可以生成参考工程,用于功能仿真,以检查参数配置是否有误。

2 EMIF DDR3 IP 配置

        新建工程,器件型号选择 10CX220YF780E6G。

 

        在 IP Catalog 中输入 memory,然后双击选择 External Memory Interfaces Intel Cyclone 10 FPGA IP。

        Memory Protocol 选 DDR3,时钟频率和 PLL 参考时钟频率根据需要配置,这里时钟频率填 933M,PLL 参考时钟频率为 116.625MHz.

 (PS:右下角 Presets 中有预设的选项,双击可以直接应用)

        容量为 1Gb 的 DDR3,行地址为 13bit,DQ width 根据实际器件类型填写。

        中间时序参数可以先跳过,最后有个仿真选项,选择 Skip Calibration,跳过校准阶段。

        IP 配置完成之后,点击 Generate Example Design,生成参考工程。

3 EMIF DDR3 IP 仿真

        在前面生成的参考工程中,仿真相关文件在 sim/ed_sim/mentor 和 sim/ed_sim/sim 路径下。修改 sim/ed_sim/sim 路径下的 ed_sim.v 文件,替换掉 ed_sim_tg 模块例化代码,就可以仿真自己编写的控制逻辑。

        仿照 ed_sim_tg 模块接口,编写 ed_sim_tg_0 模块,代码如下:

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity ed_sim_tg_0 is
   generic(
      AMM_WRITE_PATTERN   : std_logic_vector := X"0102030405060708090A0B0C0D0E0F10";
      AMM_WRITE_INC       : std_logic_vector := X"01010101010101010101010101010101"
   );
   port(
      emif_usr_reset_n    : in std_logic;
      emif_usr_clk        : in std_logic; -- 233MHz
      local_cal_success   : in std_logic;
      amm_ready_0         : in std_logic;
      amm_read_0          : out std_logic;
      amm_write_0         : out std_logic;
      amm_address_0       : out std_logic_vector(28 downto 0);
      amm_readdata_0      : in std_logic_vector(127 downto 0);
      amm_writedata_0     : out std_logic_vector(127 downto 0);
      amm_burstcount_0    : out std_logic_vector(6 downto 0);
      amm_byteenable_0    : out std_logic_vector(15 downto 0);
      amm_readdatavalid_0 : in std_logic
   );
end entity;
architecture behav of ed_sim_tg_0 is
-- internal signal declarations
type state is (
   st_emif_init,
   st_amm_idle,
   st_amm_write,
   st_amm_read
);
signal pstate                  : state := st_emif_init;
signal buf_amm_read_0          : std_logic;
signal buf_amm_write_0         : std_logic;
signal cnt_amm_write_0         : std_logic_vector(7 downto 0);
signal buf_amm_address_0       : std_logic_vector(28 downto 0);
signal buf_amm_writedata_0     : std_logic_vector(127 downto 0);
signal buf_amm_burstcount_0    : std_logic_vector(6 downto 0);
signal buf_amm_byteenable_0    : std_logic_vector(15 downto 0);
signal cnt_amm_readdatavalid_0 : std_logic_vector(7 downto 0);
------------------------------------------------------
begin
------------------------------------------------------
amm_write_0      <= buf_amm_write_0;
amm_read_0       <= buf_amm_read_0;
amm_address_0    <= buf_amm_address_0;
amm_writedata_0  <= buf_amm_writedata_0;
amm_burstcount_0 <= buf_amm_burstcount_0;
amm_byteenable_0 <= buf_amm_byteenable_0;

process(emif_usr_reset_n,emif_usr_clk) 
begin
   if emif_usr_reset_n = '0' then
      pstate <= st_emif_init;
      buf_amm_write_0 <= '0';
      cnt_amm_write_0 <= (others => '0');
      buf_amm_read_0 <= '0';
      buf_amm_address_0 <= (others => '0');
      buf_amm_writedata_0 <= (others => '0');
      buf_amm_burstcount_0 <= (others => '0');
      buf_amm_byteenable_0 <= (others => '0');
      cnt_amm_readdatavalid_0 <= (others => '0');
   elsif rising_edge(emif_usr_clk) then
      case(pstate) is
         when st_emif_init => 
            if local_cal_success = '1' then
               pstate <= st_amm_idle;
            else
               pstate <= st_emif_init;
            end if;

         when st_amm_idle => 
            pstate <= st_amm_write;
            buf_amm_writedata_0 <= AMM_WRITE_PATTERN;
            buf_amm_address_0 <= buf_amm_address_0 + 1;

         when st_amm_write => 
            if cnt_amm_write_0 = 63 then
               cnt_amm_write_0 <= (others => '0');
               buf_amm_write_0 <= '0';
               buf_amm_byteenable_0 <= (others => '0');
               pstate <= st_amm_read;
               buf_amm_read_0 <= '1';
            else
               if buf_amm_write_0 = '1' and amm_ready_0 = '1' then
                  cnt_amm_write_0 <= cnt_amm_write_0 + 1;
                  buf_amm_writedata_0 <= buf_amm_writedata_0 + AMM_WRITE_INC;
               end if;
               buf_amm_write_0 <= '1';
               buf_amm_burstcount_0 <= conv_std_logic_vector(64,7);
               buf_amm_byteenable_0 <= (others => '1');
               pstate <= st_amm_write;
            end if;

         when st_amm_read => 
            if buf_amm_read_0 = '1' and amm_ready_0 = '1' then
               buf_amm_read_0 <= '0';
            end if;

            if cnt_amm_readdatavalid_0 = 64 then
               cnt_amm_readdatavalid_0 <= (others => '0');
               pstate <= st_amm_idle;
            else
               if amm_readdatavalid_0 = '1' then
                  cnt_amm_readdatavalid_0 <= cnt_amm_readdatavalid_0 + 1;
               end if;
               pstate <= st_amm_read;
            end if;

         when others => NULL;

      end case;
   end if;
end process;
end architecture;

        打开 Modelsim 读取 msim_setup.tcl 文件,编译 EMIF IP 文件与用户设计文件,并启动仿真。 

等待 emif_c10_0_status_local_cal_success 拉高,就可以进行 DDR3 数据读写操作了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/725390.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试体系方案

目录 前言&#xff1a; 1. 引言 1.1 目标 1.2 背景 1.3 术语和定义 2. 测试体系完善 2.1 项目启动 2.2 测试计划 2.3 需求分析 2.4 测试设计 2.5 测试执行 2.6 测试记录 2.7 缺陷跟踪 2.8 测试结束 2.9 测试总结 3. 测试管理规划 3.1 测试人员 3.2 测试环境 …

骑行,怎么样高效而省力的摇车?

大家好&#xff0c;今天我们来聊一聊自行车运动中的摇车技巧。我们知道&#xff0c;摇车是自行车运动中一种非常高效的发力方式&#xff0c;那么如何做到高效而省力的摇车呢&#xff1f; 首先&#xff0c;我们要了解摇车的原理。摇车&#xff0c;其实就是通过腿部蹬踏的方式&am…

(02)Cartographer源码无死角解析-(78) ROS数据发布→2D点云数据、tf、机器人tracking frame轨迹发布

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文…

【MTK】ES7210、ES7243E Driver调试

文章目录 1.概要2.整体架构流程3. ES7210、ES7243E Driver4. 调试过程中的问题点小结1.概要 由于项目需要实现 4 路MIC 以及 2 路Speaker回采输入android系统,硬件是一个ES7210用来采集4路MIC,一个ES7243E用来采集2路Speaker回采,组成类似6路麦克风输入系统。系统SoC无法支持…

“前端刘德华”Pink老师送签名图书啦

就算成功的概率为1%又如何呢&#xff0c;如太阳系般波澜壮阔&#xff0c;也只有0.14%产生了生命&#xff0c;平凡的我们绝大多数也终将如整个太阳系的99.86%一般化作死寂。 但这不重要朋友&#xff0c;今天是黑马疯狂星期四&#xff0c;Pink老师开讲了&#xff01;&#xff01…

跑马灯实验(stm32)

目录 LED的功能代码led.cled.h硬件相关说明 main.c代码的一些介绍BSRR和BRR 实验结果 说明&#xff1a;以下内容参考正点原子的相关资料 LED的功能代码 led.c void LED_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_A…

单月涨粉30w,小红书涨粉秘诀是什么?

6月&#xff0c;小红书平台又涌现出哪些优质博主&#xff1f;品牌在投放种草方面有何亮眼表现&#xff1f; 为洞察小红书平台的内容创作趋势及品牌营销策略&#xff0c;新红推出6月月度榜单&#xff0c;从创作者、品牌、品类多方面入手&#xff0c;解析月榜数据&#xff0c;为从…

耗时半月,终于把牛客网上的软件测试面试八股文整理成PDF合集!

大家好&#xff0c;最近收到不少小伙伴的留言&#xff0c;反映现在的面试难度越来越高&#xff0c;要背的八股文越来越多了&#xff0c;考察的知识点也越来越细致&#xff0c;明摆着就是想让我们“徒手造航母”嘛&#xff01;对程序员们来说确实是一大挑战。 因此&#xff0c;…

Win10快捷方式添加到开始菜单或磁贴

打开Windows文件夹&#xff0c;进入该目录(用户名替换为当前用户)&#xff1a;C:\Users\[你的用户名]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs 将应用的快捷方式复制到此目录下&#xff0c;即可展示在开始菜单中可以右键在将快捷方式固定到磁贴

【UnityDOTS 小知识】在DOTS中实例化Prefab的方法

在DOTS中实例化Prefab的方法 前言 实例化Prefab的方法常规方法&#xff1a; 1.利用Baker的方式&#xff0c;以及getEntity方法&#xff0c;将prefab转化为一个对应的Entity原型&#xff0c;再利用EntityManager或ECB的Instantiate方法实例化这个Entity原型得到对应Prefab的实…

LSTD: A Low-Shot Transfer Detector for Object Detection论文阅读笔记

LSTD: A Low-Shot Transfer Detector for Object Detection论文阅读笔记 提出low-shot Transfer detector&#xff0c;来解决标注样本数据不足的情况。利用source domain知识&#xff0c;来构建高效的target-domain检测器&#xff0c;仅需要很少的训练样本。 提出了一个高效的…

第一课:Figma 软件安装与汉化

Figma软件基本介绍 Figma 是一款可在线协作的UI设计软件&#xff0c;最大的亮点在于它基于 WEB 平台研发&#xff0c;能支撑全平台操作系统的运行&#xff0c;适合各种场景下的使用。Figma软件特色功能&#xff1a; 在线编辑&#xff0c;适配全平台&#xff1a;使用软件 Figma…

Python 利用opencv实现识别最大面积验证码

此篇文章解决的是某象的最大验证码,这个最大面积验证码,就是识别图中划线区域中最大面积的验证码,我一开始打算用深度学习去做,但是结合了网上的资料以及自己的想法来看,还是用opencv处理又快又较为准确,而且还不用准备深度学习的一些环境 我准备了大概几十张验证码,经过…

Linux运维-修改密码报错提示:authentication token manipulation error

背景 今天在Linux Centos7环境的使用中,突然遇到了这个问题,为了以后再次遇到后可以快速的解决问题&#xff0c;特此记录。 首先是无法进入系统,然后通过单用户进入系统后修改密码,然后遇到该问题。 单用户进入系统 在如下位置添加init/bin/bash 后按Ctrl X 重启系统 进入b…

联想凌拓数据管理平台—— MagnaScale 分布式存储软件

MagnaScale 分布式存储软件 MagnaScale 数据管理平台是联想凌拓自研 ThinkSystem DXN 非结构化存储的核心软件&#xff0c;具有高性能、高可用性、横向扩展的特点。 MagnaScale 解决方案 是 DXN 非结构化存储的核心软件&#xff0c;能够真正实现软硬件解耦&#xff0c;为客户提…

在 VS Code 的 User Snippets 中使用美元符号 $ 失败的问题

在 VS Code 的 User Snippets 中使用美元符号 $ 失败的问题 在日常工作里经常会用到一些常用的代码片段, 比如创建一个 .vue 文件的初始结构, 所以我会选择在 VS Code 的 User Snippet 中创建一个代码片段, 如下 {"Print to console": {"scope": "v…

异常处理在开源SpringBoot/SpringCloud微服务框架的最佳实践

目录导读 异常处理在开源SpringBoot/SpringCloud微服务框架的最佳实践1. Java为什么要有异常2 Java异常分类3. JDK异常处理4. 模块化异常处理5. 服务化异常处理5.1 web服务化异常处理5.1.1 web参数校验服务化异常最佳实践5.1.1.1 web参数校验服务化异常分析5.1.1.2 web参数校验…

七、html表格

1、表格 表格 组织内容&#xff1a;推荐 布局&#xff1a;不推荐&#xff0c;嵌套非常复杂&#xff0c;影响SEO&#xff0c;采用列表代替布局 2、表格的结构 标题 头部 列标题 主体 行、列、单元格 脚部 在JavaScript默认提供主体 3、表格的使用 4、列与行合并&#xff1…

Kubernetes(k8s)实战:使用k8s+jenkins实现CICD

文章目录 一、什么是CICD二、准备k8s环境三、jenkins环境准备&#xff08;选择一台服务器&#xff09;1、安装java&#xff08;最新版jenkins只支持jdk11以上&#xff09;&#xff08;1&#xff09;找到jdk资源上传到指定机器&#xff08;2&#xff09;配置环境变量 2、安装mav…

stm32 freertos多任务状态迁移,中断临界段,任务延时

freertos的作用 处理器运行模式 arm中SP&#xff0c;LR&#xff0c;PC寄存器以及其它所有寄存器以及处理器运行模式介绍 一、xTaskCreate&#xff08;&#xff09; 1、prvInitialiseNewTask&#xff08;&#xff09; 2、prvAddNewTaskToReadyList&#xff08;&#xff09; (1…