Xilinx FPGA:vivado实现乒乓缓存

一、项目要求

1、用两个伪双端口的RAM实现缓存

2、先写buffer1,再写buffer2 ,在读buffer1的同时写buffer2,在读buffer2的同时写buffer1。

3、写端口50M时钟,写入16个8bit  的数据,读出时钟25M,读出8个16bit 的数据。

二、信号转换图:

三、状态转换图:

四、程序设计:

先配置IP:

`timescale 1ns / 1ps
module ping_pang_1(input           sys_clk              ,input           rst_n               ,output  wire [15 : 0] doutb1 ,output  wire [15 : 0] doutb2 );
wire        clk_50M     ;
wire        clk_25M     ;
wire        locked      ;
wire        en          ;
assign      en = locked & rst_n;clk_wiz_0 instance_name(// Clock out ports.clk_50M(clk_50M),     // output clk_out1.clk_25M(clk_25M),     // output clk_out2// Status and control signals.resetn(rst_n), // input resetn.locked(locked),       // output locked// Clock in ports.sys_clk(sys_clk));      // input clk_in1
ram1
reg             wea1    ;
reg   [3 : 0] addra1  ;
reg   [7 : 0]  dina1   ;
reg             enb1    ;
reg   [2 : 0] addrb1  ;ping_pang ram1 (.clka(clk_50M),    // input wire clka.ena(1),      // input wire ena.wea(wea1),      // input wire [0 : 0] wea.addra(addra1),  // input wire [3 : 0] addra.dina(dina1),    // input wire [7 : 0] dina.clkb(clk_25M),    // input wire clkb.enb(enb1),      // input wire enb.addrb(addrb1),  // input wire [2 : 0] addrb.doutb(doutb1)  // output wire [15 : 0] doutb
);
ram2
reg             wea2    ;
reg   [3 : 0] addra2  ;
reg   [7 : 0]  dina2   ;
reg             enb2    ;
reg   [2 : 0] addrb2  ;ping_pang ram2 (.clka(clk_50M),    // input wire clka.ena(1),      // input wire ena.wea(wea2),      // input wire [0 : 0] wea.addra(addra2),  // input wire [3 : 0] addra.dina(dina2),    // input wire [7 : 0] dina.clkb(clk_25M),    // input wire clkb.enb(enb2),      // input wire enb.addrb(addrb2),  // input wire [2 : 0] addrb.doutb(doutb2)  // output wire [15 : 0] doutb
);
/状态机
localparam      IDLE  = 3'd0;
localparam      W1    = 3'd1;
localparam      W2_R1 = 3'd2;
localparam      W1_R2 = 3'd3;
reg     [2:0]   cur_state,next_state;
always@(posedge clk_50M)if(!rst_n)cur_state <= IDLE;else if(en)cur_state <= next_state;elsecur_state <= IDLE;
always@(*)case(cur_state)IDLE  :beginnext_state = W1;      end   W1    :beginif(addra1 == 14 && wea1)next_state = W2_R1;elsenext_state = cur_state;endW2_R1 :beginif(addra2 == 14 && wea2)next_state = W1_R2;elsenext_state = cur_state;endW1_R2 :beginif(addra1 == 14 && wea1)next_state = W2_R1;elsenext_state = cur_state;enddefault:;endcase
/写状态机
always@(posedge clk_50M)if(!rst_n)beginwea1 <= 0;   addra1 <= 0;dina1 <= 0;wea2 <= 0;   addra2 <= 0;dina2 <= 0;  endelsecase(cur_state)IDLE :beginend    W1   :beginif(addra1 == 15)wea1 <= 0;elsewea1 <= 1;   if(wea1 == 1)dina1 <= dina1 + 8'h27 ;elsedina1 <= 0;if(wea1 == 1 && addra1 == 15)addra1 <= 0;else if(wea1 == 1) addra1 <= addra1 + 1;elseaddra1 <= addra1;         endW2_R1:beginaddra1 <= 0;wea1 <= 0;  /ram1的写使能关闭if(addra2 == 15)wea2 <= 0;elsewea2 <= 1;   if(wea2 == 1)dina2 <= dina2 + 8'h19 ;elsedina2 <= 0;if(wea2 == 1 && addra2 == 15)addra2 <= 0;else if(wea2 == 1) addra2 <= addra2 + 1;elseaddra2 <= 0;         endW1_R2:beginwea2 <= 0;addra2 <= 0;  if(addra1 == 15)wea1 <= 0;elsewea1 <= 1;   if(wea1 == 1)dina1 <= dina1 + 8'h27 ;elsedina1 <= 0;if(wea1 == 1 && addra1 == 15)addra1 <= 0;else if(wea1 == 1) addra1 <= addra1 + 1;elseaddra1 <= 0;    enddefault:;endcase
读状态机
always@(negedge clk_25M)if(!rst_n)beginenb1 <= 0;    addrb1 <= 0;enb2 <= 0;    addrb2 <= 0; endelsecase(cur_state)IDLE  :beginend   W1    :beginendW2_R1 :beginenb2 <= 0; addrb2 <= 0;if(addrb1 == 7 && enb1)enb1 <= 0;elseenb1 <= 1;if(enb1 == 1 && addrb1 == 7)addrb1 <= 0;else if(enb1)addrb1 <= addrb1 + 1;elseaddrb1 <= 0;    endW1_R2 :beginaddrb1 <= 0; enb1 <= 0;if(addrb2 == 7)enb2 <= 0;elseenb2 <= 1;if(enb2 == 1 && addrb2 == 7)addrb2 <= 0;else if(enb2)addrb2 <= addrb2 + 1;elseaddrb2 <= 0;    enddefault:;endcaseendmodule    

五、仿真设计

`timescale 1ns / 1ps
module test_ping_pang( );reg             sys_clk    ;reg             rst_n      ;wire[15:0]      doutb1     ;wire[15:0]      doutb2     ;initialbeginsys_clk = 0 ;rst_n   = 0 ;#10rst_n   = 1 ;end    always #1 sys_clk = ~sys_clk ;   ping_pang_1 ping_pang_1_1(.   sys_clk ( sys_clk )   ,.   rst_n   ( rst_n   )   , .  doutb1   (doutb1   )   ,.  doutb2   (doutb2   )    );endmodule

五、仿真结果

六、记录一些小问题:

(2)

(3)

所以修改思路就是尽量让enb1和enb2之间没有空隙,在时序上是衔接着的

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

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

相关文章

[图解]企业应用架构模式2024新译本讲解20-数据映射器2

1 00:00:01,860 --> 00:00:06,180 那么这个数据映射器因为它有这样的特点 2 00:00:07,310 --> 00:00:12,630 你想想&#xff0c;它负责同步这两边 3 00:00:13,010 --> 00:00:14,930 对象、数据库是独立的 4 00:00:15,990 --> 00:00:18,690 然后 5 00:00:18,700…

掌握MySQL基础命令:数据表结构修改详细操作

MySQL数据表&#xff08;Table&#xff09;是MySQL数据库中存储数据的基本结构单元。简单来说&#xff0c;数据表可以被看作是一个二维的、由行&#xff08;Row&#xff09;和列&#xff08;Column&#xff09;组成的表格&#xff0c;其中每一行代表了一个记录&#xff08;Reco…

Docker(二):Docker image Docker Container

本文将介绍 Docker 映像和容器以及 docker 文件之间的差异与联系&#xff0c;本文还将解释如何以及何时使用它们。 什么是 Dockerfile&#xff1f; 它是一个简单的文本文件&#xff0c;包含命令或过程的集合。我们运行的这些命令和准则作用于配置为创建新的 Docker 镜像的基本…

《长江信息通信》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《长江信息通信》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第一批认定学术期刊。 问&#xff1a;《长江信息通信》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;湖北省通信管理局 主办单位&#xff…

Vue实现金钱输入框组件自动带千位逗号

新建PriceInput.vue <template><div id"bord"><el-inputv-model"inputValue"v-bind"$attrs":maxlength"maxlength"input"handleInput"focus"handleFocus"blur"handleBlur"change"h…

ABAQUS山东济南青岛正版代理商亿达四方:构筑仿真技术新高地

在历史悠久而又充满活力的齐鲁大地上&#xff0c;济南与青岛作为山东省的两大核心城市&#xff0c;正引领着区域经济的蓬勃发展与科技创新。亿达四方&#xff0c;作为ABAQUS在山东济南与青岛的官方正版代理商&#xff0c;正以先进的仿真技术为基石&#xff0c;助力两地企业加速…

【GD32F303红枫派使用手册】第二十九节 USB-IAP升级实验

29.1 实验内容 通过本实验主要学习以下内容&#xff1a; USB IAP升级操作 29.2 实验原理 USB IAP升级本例程中使用的是Custom HID中的IAP设备类&#xff0c;其设备类协议的实现与HID的类似&#xff0c;主要包括GET_REPORT/GET_IDLE/GET_PROTOCOL/SET_REPORT/SET_IDLE/SET_P…

【Qt知识】qrc机制

在Qt中&#xff0c;qrc机制是一种资源管理系统&#xff0c;它允许你将应用程序所需的静态资源&#xff0c;如图像、样式表、字体和音频文件&#xff0c;嵌入到可执行文件中而不是作为外部文件存在。这样做的好处是资源管理更加安全&#xff0c;因为它们不会丢失或被意外修改&am…

git基本使用(一):git的基本概念

Git 是一种分布式版本控制系统&#xff0c;最初由 Linus Torvalds 于 2005 年为 Linux 内核开发。它主要用于跟踪文件的更改&#xff0c;特别是在软件开发过程中&#xff0c;可以帮助团队成员协同工作。它在实际项目开发中&#xff0c;应用非常广泛&#xff0c;我们这一节来掌握…

qt 滚动区域简单实验

1.概要 有些时候&#xff0c;想用一个有限的区域显示更多的内容&#xff0c;且内容不固定用滚动区域控件是一个不错的选择&#xff0c;我今天就用一个图片简单的实验一下。 2.代码&#xff08;关键代码&#xff09; #include "widget.h" #include "ui_widget…

flutter开发实战-Webview及dispose关闭背景音

flutter开发实战-Webview及dispose关闭背景音 当在使用webview的时候&#xff0c;dispose需要关闭网页的背景音或者音效。 一、webview的使用 在工程的pubspec.yaml中引入插件 webview_flutter: ^4.4.2webview_cookie_manager: ^2.0.6Webview的使用代码如下 初始化WebView…

uni-app上传失败超出文件限制解决方法-分包处理-预加载

分包背景 当你的上传出现一下错误&#xff1a; Error: 系统错误&#xff0c;错误码&#xff1a;80051,source size 2089KB exceed max limit 2MB [20240703 10:53:06][wxbf93dfb6cb3eb8af] [1.06.2405010][win32-x64] 说明你主包太大需要处理了&#xff0c;一下两种方法可以…

Day03-Jenkins与集成案例

Day03-Jenkins与集成案例 6. CD持续交付&#xff0c;持续部署实现方案7. 案例04: basketball案例,搭建开发测试专用的任务7.1 任务要求7.2 步骤7.3 详细步骤1&#xff09;安装插件2&#xff09;创建任务 7.4 gitlab配置钩子1) 解除钩子局域网访问限制2) gitlab配置钩子 7.5 与部…

网络基础:OSPF 协议

OSPF&#xff08;Open Shortest Path First&#xff09;是一种广泛使用的链路状态路由协议&#xff0c;用于IP网络中的内部网关协议&#xff08;IGP&#xff09;。OSPF通过在网络中的所有路由器之间交换路由信息&#xff0c;选择从源到目的地的最优路径。OSPF工作在OSI模型的第…

Nginx系列(二)---Mac上的快速使用

一、安装 前置软件&#xff1a;Homebrew 安装方法&#xff1a;终端输入/bin/bash -c "$(curl -fsSL <https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install.sh>)"更新&#xff1a; brew update 设置中科大镜像源&#xff1a;git -C "$(brew --r…

昇思25天学习打卡营第10天 | 自然语言处理:RNN实现情感分类

1. RNN实现情感分类 1.2 概述 情感分类是自然语言处理中的经典任务&#xff0c;是典型的分类问题。本节使用MindSpore实现一个基于RNN网络的情感分类模型&#xff0c;实现如下的效果&#xff1a; 输入: This film is terrible 正确标签: Negative(负面) 预测标签: Negative输…

初识Spark

一、简介 官网&#xff1a;Apache Spark™ - Unified Engine for large-scale data analytics Apache的顶级项目&#xff0c;用于大规模数据处理的统一分析引擎。 支持语言&#xff1a;Java、Scala、Python和R (源码为Scala) 高级工具&#xff1a; 1、SparkSQL用于SQL和结构…

Linux中cat命令的英文含义

我之前一直在想cat不是猫的意思吗&#xff0c;但是cat命令在Linux中并不是指"猫"这个动物&#xff0c;而是来源于它的功能&#xff1a;concatenate&#xff08;连接&#xff09;和typeset&#xff08;打印&#xff09;。这个命令的名称是这两个功能的首字母缩写。尽管…

DevExpress WPF中文教程:Grid - 如何显示摘要(设计时)?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

Mac/Linux安装JMeter压测工具

Mac安装JMeter压测工具 介绍 Apache JMeter™应用程序是开源软件&#xff0c;是一个100%纯的Java应用程序&#xff0c;旨在加载测试功能行为和衡量性能。它最初是为测试Web应用程序而设计的&#xff0c;但后来扩展到其他测试功能。 我能用它做什么&#xff1f; Apache JMet…