Xilinx FPGA:vivado实现乒乓缓存

news2024/10/7 14:23:01

一、项目要求

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;
    else
        cur_state <= IDLE;
always@(*)
    case(cur_state)
        IDLE  :begin
            next_state = W1;      
        end   
        W1    :begin
            if(addra1 == 14 && wea1)
                next_state = W2_R1;
            else
                next_state = cur_state;
        end
        W2_R1 :begin
            if(addra2 == 14 && wea2)
                next_state = W1_R2;
            else
                next_state = cur_state;
        end
        W1_R2 :begin
            if(addra1 == 14 && wea1)
                next_state = W2_R1;
            else
                next_state = cur_state;
        end
        default:;
    endcase
/写状态机
always@(posedge clk_50M)
    if(!rst_n)begin
          wea1 <= 0;   
        addra1 <= 0;
         dina1 <= 0;
          wea2 <= 0;   
        addra2 <= 0;
         dina2 <= 0;  
    end
    else
        case(cur_state)
            IDLE :begin
                
            end    
            W1   :begin
                if(addra1 == 15)
                    wea1 <= 0;
                else
                    wea1 <= 1;   
                if(wea1 == 1)
                    dina1 <= dina1 + 8'h27 ;
                else
                    dina1 <= 0;
                if(wea1 == 1 && addra1 == 15)
                    addra1 <= 0;
                else if(wea1 == 1) 
                    addra1 <= addra1 + 1;
                else
                    addra1 <= addra1;         
            end
            W2_R1:begin
                addra1 <= 0;
                wea1 <= 0;  /ram1的写使能关闭
                if(addra2 == 15)
                    wea2 <= 0;
                else
                    wea2 <= 1;   
                if(wea2 == 1)
                    dina2 <= dina2 + 8'h19 ;
                else
                    dina2 <= 0;
                if(wea2 == 1 && addra2 == 15)
                    addra2 <= 0;
                else if(wea2 == 1) 
                    addra2 <= addra2 + 1;
                else
                    addra2 <= 0;         
            end
            W1_R2:begin
                wea2 <= 0;
                addra2 <= 0;  
                if(addra1 == 15)
                    wea1 <= 0;
                else
                    wea1 <= 1;   
                if(wea1 == 1)
                    dina1 <= dina1 + 8'h27 ;
                else
                    dina1 <= 0;
                if(wea1 == 1 && addra1 == 15)
                    addra1 <= 0;
                else if(wea1 == 1) 
                    addra1 <= addra1 + 1;
                else
                    addra1 <= 0;    
            end
            default:;
        endcase
读状态机
always@(negedge clk_25M)
    if(!rst_n)begin
            enb1 <= 0;    
          addrb1 <= 0;
          enb2 <= 0;    
        addrb2 <= 0; 
    end
    else
        case(cur_state)
            IDLE  :begin
            
            end   
            W1    :begin
            
            end
            W2_R1 :begin
                enb2 <= 0; 
                addrb2 <= 0;
                if(addrb1 == 7 && enb1)
                    enb1 <= 0;
                else
                    enb1 <= 1;
                if(enb1 == 1 && addrb1 == 7)
                    addrb1 <= 0;
                else if(enb1)
                    addrb1 <= addrb1 + 1;
                else
                    addrb1 <= 0;    
            end
            W1_R2 :begin
                addrb1 <= 0; 
                enb1 <= 0;
                if(addrb2 == 7)
                    enb2 <= 0;
                else
                    enb2 <= 1;
                if(enb2 == 1 && addrb2 == 7)
                    addrb2 <= 0;
                else if(enb2)
                    addrb2 <= addrb2 + 1;
                else
                    addrb2 <= 0;    
            end
            default:;
        endcase
        
endmodule    

五、仿真设计

`timescale 1ns / 1ps
module test_ping_pang( );

        reg             sys_clk    ;
        reg             rst_n      ;
       wire[15:0]      doutb1     ;
       wire[15:0]      doutb2     ;
        
    initial
           begin
                sys_clk = 0 ;
                rst_n   = 0 ;
                #10
                rst_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.coloradmin.cn/o/1889443.html

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

相关文章

前端进阶全栈计划:Spring扫盲

Spring扫盲 spring 和 springboot的关系? 类比前端&#xff1a;vue.js和nuxt.js的关系 Spring Boot 是基于 Spring 框架的快速开发工具&#xff0c;简化了 Spring 应用的配置和部署。 spring核心特性 1. 依赖注入 依赖注入是Spring框架的核心功能之一。它允许你通过配置将对…

Golang | Leetcode Golang题解之第206题反转链表

题目&#xff1a; 题解&#xff1a; func reverseList(head *ListNode) *ListNode {if head nil || head.Next nil {return head}newHead : reverseList(head.Next)head.Next.Next headhead.Next nilreturn newHead }

什么是Web3D交互展示?有什么优势?

在智能互联网蓬勃发展的时代&#xff0c;传统的图片、文字及视频等展示手段因缺乏互动性&#xff0c;正逐渐在吸引用户注意力和提升宣传效果上显得力不从心。而Web3D交互展示技术的横空出世&#xff0c;则为众多品牌与企业开启了一扇全新的展示之门&#xff0c;让线上产品体验从…

学校卫星电子怎么自动校准时间呢

在学校的教室里&#xff0c;卫星电子钟精准地为师生们提供着时间服务&#xff0c;而其自动校准时间的功能令人称奇。那么&#xff0c;学校卫星电子钟是如何实现自动校准时间的呢&#xff1f; 学校卫星电子钟自动校准时间的原理基于卫星导航系统。常见的如北斗卫星导航系统或 GP…

小程序-<web-view>嵌套H5页面支付功能

背景&#xff1a;小程序未发布前&#xff0c;公司使用vue框架搭建了管理系统&#xff0c;为了减少开发成本&#xff0c;微信提供了web-view来帮助已有系统能在小程序上发布&#xff0c;详见web-view | 微信开放文档。因公司一直未打通嵌套H5小程序的支付功能&#xff0c;导致用…

湖北建筑安全员A证跨省调出审核不通过?可能是这些原因

湖北建筑安全员A证跨省调出审核不通过&#xff1f;可能是这些原因 湖北建筑安全员A证跨省调出审核不通过怎么办&#xff1f; 湖北建筑安全员ABC正常情况下都是可以跨省调出的&#xff0c;现在建筑三类人员安全员ABC在全国工程质量安全监管信息平台都是可以查询的&#xff0c;在…

offer150-16:数值的整数次方

题目描述:实现函数double Power(double base,int exponent),求base 的exponent次方。不得使用库函数&#xff0c;同时不需要考虑大数问题。 分析&#xff0c;题目要求实现库函数pow(),由于不需要考虑大数问题&#xff0c;不必担心溢出&#xff0c;那么就需要对输入的各种情况进…

LeetCode热题100刷题3:3. 无重复字符的最长子串、438. 找到字符串中所有字母异位词、560. 和为 K 的子数组

3. 无重复字符的最长子串 滑动窗口、双指针 class Solution { public:int lengthOfLongestSubstring(string s) {//滑动窗口试一下//英文字母、数字、符号、空格,ascii 一共包含128个字符vector<int> pos(128,-1);int ans 0;for(int i0,j0 ; i<s.size();i) {//s[i]…

【Python网络通信】基于Bypy调用百度网盘api实现自动上传和下载网盘文件

网盘对于大家的生活工作可以说是息息相关&#xff0c;但是如果每天都重复去上传下载文件就会很浪费时间&#xff0c;所以有没有什么办法可以解放双手&#xff1f;那就是网盘接口&#xff0c;本文通过Bypy库实现百度网盘的自动上传和下载文件。 原创作者&#xff1a;RS迷途小书童…

java 面试题 - 索引

上脑图&#xff0c;大家要记住&#xff01;&#xff01; 看不清&#xff0c;上大图&#xff01; 这几总结就够用&#xff01;&#xff01;

SpringBoot苏桦旅游管理系统-计算机毕业设计源码02123

摘要 旅游业在全球范围内不断发展&#xff0c;为了提供高效的旅游管理和服务&#xff0c;开发一个旅游管理系统具有重要意义。本文旨在设计和实现该旅游管理系统&#xff0c;以满足用户和管理员的需求。该系统采用Spring Boot作为后端框架&#xff0c;利用其简化的开发流程和强…

六、【源码】应用上下文

源码地址&#xff1a;https://github.com/spring-projects/spring-framework 仓库地址&#xff1a;https://gitcode.net/qq_42665745/spring/-/tree/06-application-context 应用上下文 实现应用上下文的核心类&#xff1a; 1.ApplicationContext&#xff1a;Spring 应用上…

java设计模式(五)建造者模式(Builder Pattern)

1、模式介绍&#xff1a; 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它允许你创建一个复杂对象的表示&#xff0c;同时隐藏了创建细节。该模式将对象的构建过程和表示分离&#xff0c;使得相同的构建过程可以创建不同的表示。 2、应…

如何选择适合自己的巴比达内网穿透方案

选择适合自己的巴比达内网穿透方案&#xff0c;需要考虑几个关键因素&#xff0c;包括您的具体需求、安全性要求、技术水平以及预算。以下是一些选择巴比达内网穿透方案的建议步骤&#xff1a; 1. 确定需求和用途 首先&#xff0c;需要明确您希望通过内网穿透实现的具体目标和…

项目实战-MySQL极佳优化方案---前缀索引

一、应用背景 由于公司项目数据量较大&#xff0c;开发小程序和APP过程中&#xff0c;SQL查询超过1.5s以上的等待时间&#xff0c;因此需要对SQL或者数据表结构设计进行优化。就不讲SQL语句优化啦&#xff0c;而是记录一下数据表结构设计优化的前缀索引实现。 二、MySQL索引 …

Transformer拆积木

文章目录 ConceptsEmbeddingEncoderDecoderSelf-Attention matric calculationFinal Linear and Softmax LayerLoss function 参考 学一下已经问鼎中原七年之久的Transformer Concepts 开始拆积木&#xff01; Embedding Encoder Decoder Self-Attention matric calculati…

PHP房产小程序微信小程序系统源码

&#x1f3e0;—— 购房租房&#xff0c;一“指”搞定&#x1f3e1; &#x1f50d;【开篇&#xff1a;房产新视界&#xff0c;尽在掌握】 在这个信息爆炸的时代&#xff0c;找房子不再是一场漫长的奔波。有了“房产微信小程序”&#xff0c;无论是购房还是租房&#xff0c;都…

如何从Salesforce顾问转型为解决方案架构师?

在充满活力的Salesforce咨询领域&#xff0c;许多专业人士都希望从顾问转型为解决方案架构师。这种转型不仅需要掌握新技能&#xff0c;还需要从根本上改变思维方式。关键在于摆脱顾问典型的以职能为中心的思维模式&#xff0c;拥抱更广阔、更具战略性的视角。 从“如何”到“…

手把手教你在QQ微信上AI变声器安装和使用(软件下载)

获取方式&#xff1a;点击下载 你相信互联网上还有真的东西么&#xff1f;我反正越来越不相信了&#xff01; 比如&#xff0c;和你在网上眉来眼去语音撩骚的小姐姐&#xff0c;可能就是一个抠脚大汉。 而抠脚大汉&#xff0c;也可以是一个漂亮的小姐姐。 o(*&#xffe3;︶…