当前位置: 首页 > news >正文

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.lryc.cn/news/390764.html

相关文章:

  • 解决 VM 虚拟机网络连接异常导致的 Finalshell 无法连接及 ifconfig 中 ens33 丢失问题
  • 深入Django(三)
  • 观测云赋能「阿里云飞天企业版」,打造全方位监控观测解决方案
  • 51单片机第27步_单片机工作在睡眠模式
  • 互联网应用主流框架整合之SpringCloud微服务治理
  • 超快的 Python 包管理工具「GitHub 热点速览」
  • 网络基础:OSPF 协议
  • 1456.定长子串中元音的最大数目
  • 基于xilinx FPGA的GTX/GTH/GTY位置信息查看方式(如X0Y0在bank几)
  • JAVA小知识30:JAVA多线程篇1,认识多线程与线程安全问题以及解决方案。(万字解析)
  • Python数据分析案例47——笔记本电脑价格影响因素分析
  • 【加密与解密】【09】GPG Client签名流程
  • “2024软博会” 为软件企业提供集展示、交流、合作一站式平台
  • 【Zoom安全解析】深入Zoom的端到端加密机制
  • 7 动态规划
  • .net 快速开发框架开源
  • 《昇思25天学习打卡营第06天|网络构建》
  • 【链表】- 两两交换链表中的节点
  • java设计模式(四)——抽象工厂模式
  • 动物检测yolo格式数据集(水牛 、大象 、犀牛 、斑马四类)
  • 昇思25天学习打卡营第05天 | 数据变换 Transforms
  • Springboot+MySQL 公寓报修管理系统源码
  • jenkins 发布服务到linux服务器
  • Appium+python自动化(三十九)-Appium自动化测试框架综合实践 - 代码实现(超详解)
  • 防止跨站脚本攻击XSS之Antisamy
  • Python爬虫实战案例——王者荣耀皮肤抓取
  • PyTorch计算机视觉实战:目标检测、图像处理与深度学习
  • 4D 生物打印:将时间维度融入,打造个性化动态组织
  • 银行清算业务功能测试解析
  • CVE-2024-6387漏洞预警:尽快升级OpenSSH