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;
    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之间没有空隙,在时序上是衔接着的

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

William Yang:从区块链先锋到艺术平台创始人

在区块链技术和加密货币市场飞速发展的今天&#xff0c;William Yang无疑是这一领域的佼佼者。他不仅在学术和媒体领域取得了显著成就&#xff0c;更在创业之路上不断探索&#xff0c;成为了业内知名的KOL&#xff08;关键意见领袖&#xff09;。今天&#xff0c;我们有幸采访到…

视频监控汇聚和融合平台的特点、功能、接入方式、应用场景

目录 一、产品概述 二、主要特点 1、多协议支持 2、高度集成与兼容性 3、高性能与可扩展性 4、智能化分析 5、安全可靠 三、功能概述 1. 视频接入与汇聚 2. 视频存储与回放 3. 实时监控与预警 4. 信息共享与联动 5. 远程管理与控制 四、接入方式 1、直接接入 2…

使用CubeIDE调试项目现stm32 no source available for “main() at 0x800337c:

使用CubeIDE调试项目现stm32 no source available for "main() at 0x800337c&#xff1a; 问题描述 使用CubeIDE编译工程代码和下载都没有任何问题&#xff0c;点击Debug调试工程时&#xff0c;出现stm32 no source available for "main() at 0x800337c 原因分析&a…

[leetcode hot 150]第四百五十二题,用最少数量的箭引爆气球

题目&#xff1a; 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。…

快速入门FreeRTOS心得(正点原子学习版)

对于FreeROTS&#xff0c;我第一反应想到的就是通信里的TDM&#xff08;时分多址&#xff09;。不同任务给予分配不同的时间间隔&#xff0c;也就是任务之间在每个timeslot都在来回切换。 这里有重要的一点&#xff0c;就是中断要短小&#xff0c;优先级是自高到底进行打断。 …

204.贪心算法:分发饼干(力扣)

以下来源于代码随想录 class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {// 对孩子的胃口进行排序sort(g.begin(), g.end());// 对饼干的尺寸进行排序sort(s.begin(), s.end());int index s.size() - 1; // 从最大的饼…

大数据招商的应用场景及实施路径有哪些?

当下&#xff0c;我国已经进入数字经济与实体经济融合发展的新阶段&#xff0c;数字技术和数字化转型落地日臻成熟&#xff0c;数据要素价值释放深入到了我国各个领域的发展&#xff0c;招商引资也不例外&#xff0c;在传统招商模式效果日渐甚微的大环境下&#xff0c;大数据招…

面试题 4:阐述以下方法 @classmethod, @staticmethod, @property?

欢迎莅临我的博客 &#x1f49d;&#x1f49d;&#x1f49d;&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

数据大小端问题

文章目录 大小端前言函数引用(接下来使用此函数对高低位进行切换)先看截取的对于大小端的定义大小端数据的直观理解[重点] 对uchar数组进行取操作定义一个uint8_t的数组观察起内部内存尝试使用uint32_t 每次区 1、2、3、4byte数据 提升经过上面的介绍一定对大小端有了一定的了解…

2.3 主程序和外部IO交互 (文件映射方式)----IO Server实现

2.3 主程序和外部IO交互 &#xff08;文件映射方式&#xff09;----IO Server C实现 效果显示 1 内存共享概念 基本原理&#xff1a;以页面为单位&#xff0c;将一个普通文件映射到内存中&#xff0c;达到共享内存和节约内存的目的&#xff0c;通常在需要对文件进行频繁读写时…

基于OpenMV识别数字及程序说明

OpenMV简介 OpenMV是一个开源、低成本且功能强大的机器视觉模块。它基于STM32F427CPU&#xff0c;集成了OV7725摄像头芯片&#xff0c;能在小巧的硬件模块上&#xff0c;用C语言高效地实现核心机器视觉算法&#xff0c;并提供了Python编程接口&#xff0c;使得图像处理的复杂度…

【教程】lighttpd配置端口反向代理

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 1、修改配置文件&#xff1a; sudo vim /etc/lighttpd/lighttpd.conf2、先添加mod_proxy&#xff1a; 3、然后添加端口映射&#xff1a; 4、保存&…

2024年07年01日 Redis数据类型以及使用场景

String Hash List Set Sorted Set String&#xff0c;用的最多&#xff0c;对象序列化成json然后存储 1.对象缓存&#xff0c;单值缓存 2.分布式锁 Hash&#xff0c;不怎么用到 1.可缓存经常需要修改值的对象&#xff0c;可单独对对象某个属性进行修改 HMSET user {userI…

Transformation(转换)开发-switch/case组件

一、switch/case组件-条件判断 体育老师要做一件非常重要的事情&#xff1a;判断学生是男孩还是女孩、或者是蜘蛛&#xff0c;然后让他们各自到指定的队伍中 体育老师做的事情&#xff0c;我们同样也会在Kettle中会经常用来。在Kettle中&#xff0c;switch/case组件可以来做类似…

河南特岗教师报名流程及免冠照片电子版制作要求

2024年河南特岗教师招聘季又来啦&#xff01;想要成为孩子们心中的超级英雄吗&#xff1f;想要在教育的田野上播种希望吗&#xff1f;那就不要错过这次机会&#xff0c;今年全省共招聘特岗教师3495名&#xff08;具体岗位设置参见《河南省2024年特岗教师招聘岗位设置》&#xf…

盒子模型(笔记)

盒子模型 盒子模型的属性 padding属性 内边距&#xff1a;盒子的边框到内容的距离 /*每个方向内边距*/padding-top: 20px;padding-left:20px;padding-bottom:20px;padding-right: 20px; /*每个方向内边距的第二种方法*/ /* 顺序依次是上左右下*/padding: 10px 20px 30px 4…

02:vim的使用和权限管控

vim的使用 1、vim基础使用1.1、vim pathname 2、vim高级用法2.1、查找2.2、设置显示行号2.3、快速切换行2.4、 行删除2.5、行复制粘贴 3、权限管理3.1、普通用户和特权用户3.2、文件权限表示 vim是Linux中的一种编辑器&#xff0c;类似于window中的记事本&#xff0c;可以对创建…

TP8/6 更改后台入口地址admin改为myadmin 隐藏真实后台网址

原来www.xxx.com/admin 改后www.xxx.com/myadmin config/app.php // 应用映射&#xff08;自动多应用模式有效&#xff09;app_map > [admintest>admin],

【前端VUE】VUE3第一节—vite创建vue3工程

什么是VUE Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&#xff0…

卷积层里的填充和步幅

一、定义 1、对于卷积&#xff0c;我们另一个超参数是核的大小&#xff0c;通常使用的卷积核是33或者55&#xff0c;很少用偶数核 2、填充是为了让输出不变或者变大&#xff0c;是为了在输入不太大&#xff0c;又能使模型足够深的情况下使用 3、填充&#xff1a;在输入周围添…