FIFO IP Core

news2024/11/26 0:31:20

FIFO IP Core

  • 先进先出的缓存器
  • 常常被用于数据的缓存,或者高速异步数据交互(跨时钟信号传递)
  • 和RAM和ROM的区别是没有地址线,无法指定地址

img

  • 写时钟(Write Clock Domain),读时钟
  • 写复位(wr_rst),读复位,整体复位
  • 写使能(wr_en),读使能
  • 写满标志(full),读空标志(empty)
  • almost_full:快要满了,almost_empty:快要空了
  • Prog_full:可编程写满,prog_empty:可编程读空(根据自己设置的数据个数拉高或拉低)
  • wr_ack:写反馈(对写使能的应答) valid:读出的数据是一个稳定有效的值
  • overflow:写溢出 underflow:读空(下溢出)
  • wr_data_count: Fifo中储存的写数据的数量 rd_data_count:储存的读数据的数量
  • prog_full_thresh_assert: 动态修改prog_full的值
  • prog_full_thresh_negate:门限值失效

FIFO IP Core的设置

实验结构:

img

创建工程和设计文件ip_fifo,添加FIFO IP Core

img

选择异步时钟的BRAM(这样后面的读写数据量才能设置,同步时钟的默认相等)

img

设置读写宽度和深度,取消复位引脚

img

勾选Almost Full Flag & Almost Empty Flag

img

勾选读写数据量的计数

img

如何抓取上升沿/下降沿?

信号en: _________|————

reg d0 = en 当前时刻的值

reg d1 = d0 前一时刻的值

当d1 = 0, d0 = 1时 说明是上升沿 == ~d1&d0 为真

当d1 = 1, d0 = 0时 说明是下降沿 == ~d0&d1 为真

写模块 fifo_wr

img

输入信号:时钟,复位,将空,将满

输出信号:写使能,写数据

module fifo_wr(
    input clk,
    input rst,
    
    input almost_empty,
    input almost_full,
    
    output reg fifo_wr_en,
    output reg[7:0] fifo_wr_data
    );
    
    
endmodule

抓取almost_empty信号上升沿

reg almost_empty_cur;
reg almost_empty_pre;
wire syn;
// assign 过程赋值,右边的值发送变化会重新赋值
assign syn = ~almost_empty_pre & almost_empty_cur;
always @(posedge clk or posedge rst) begin
    if(rst) begin
        almost_empty_cur <= 1'b0;
        almost_empty_pre <= 1'b0;
    end
    else begin
        almost_empty_cur <= almost_empty;
        almost_empty_pre <= almost_empty_cur;
    end
end

不能对数据立刻赋值,fpga内部不一样准备好了,需要延迟等待一段时间,这样的需求可以用状态机完成

状态机

6.3 Verilog 状态机 | 菜鸟教程 (runoob.com)

这里有三个状态,延迟等待10个周期

所以定义:

reg [1:0] state;
reg [3:0] delay_cnt;

状态转换:

img

// 状态机
reg [1:0] state; 
// 延迟数
reg [3:0] delay_cnt;
always @(posedge clk or posedge rst) begin
    if(rst) begin
        fifo_wr_en <= 1'b0;
        fifo_wr_data <= 8'd0;
        state <= 2'b0;
        delay_cnt <= 4'b0;
    end
    else begin
        case(state)
            2'd0:begin
                if(syn) state <= 2'b1;
                else state <= 2'b0;
            end
            2'd1: begin
                if(delay_cnt == 4'd10) begin
                    fifo_wr_en <= 1'b1;
                    delay_cnt <= 4'd0;
                    state <= 2'd2;
                end
                else delay_cnt <= delay_cnt + 1'b1;
            end
            2'd2: begin
                if(almost_full) begin
                    fifo_wr_en <= 1'b0;
                    fifo_wr_data <= 8'd0;
                    state <= 2'b0;
                end
                else begin
                    fifo_wr_data <= fifo_wr_data + 1'd1;
                end
            end
            default:
                state <= 2'b0;
          endcase
    end
end

读模块fifo_rd

将写模块中的写使能变为读使能

写满判断变为读空判断

去掉写数据

module fifo_rd(
    input           clk,
    input           rst,
    
    input           almost_empty,
    input           almost_full,
    input [7:0]     fifo_rd_data,
    
    output reg      fifo_rd_en    
    );
    
    reg almost_full_cur;
    reg almost_full_pre;
    wire syn;
    // assign 过程赋值,右边的值发送变化会重新赋值
    assign syn = ~almost_full_pre & almost_full_cur;
    always @(posedge clk or posedge rst) begin
        if(rst) begin
            almost_full_cur <= 1'b0;
            almost_full_pre <= 1'b0;
        end
        else begin
            almost_full_cur <= almost_full;
            almost_full_pre <= almost_full_cur;
        end
    end
    
    // 状态机
    reg [1:0] state; 
    // 延迟数
    reg [3:0] delay_cnt;
    always @(posedge clk or posedge rst) begin
        if(rst) begin
            fifo_rd_en <= 1'b0;
            state <= 2'b0;
            delay_cnt <= 4'b0;
        end
        else begin
            case(state)
                2'd0:begin
                    if(syn) state <= 2'b1;
                    else state <= 2'b0;
                end
                2'd1: begin
                    if(delay_cnt == 4'd10) begin
                        delay_cnt <= 4'd0;
                        state <= 2'd2;
                    end
                    else delay_cnt <= delay_cnt + 1'b1;
                end
                2'd2: begin
                    if(almost_empty) begin
                        fifo_rd_en <= 1'b0;
                        state <= 2'b0;
                    end
                    else fifo_rd_en <= 1'b1;
                end
                default:
                    state <= 2'b0;
              endcase
        end
    end
endmodule

例化顶层模块 fifo_ip

module ip_fifo(
    input sys_clk,
    input sys_rst
    );
    
    wire almost_empty;
    wire almost_full;
    wire fifo_wr_en;  
    wire[7:0] fifo_wr_data;
    
    fifo_wr fifo_wr_u(
        .clk            (sys_clk),        
        .rst            (sys_rst),
        .almost_empty   (almost_empty),
        .almost_full    (almost_full),
        .fifo_wr_en     (fifo_wr_en), 
        .fifo_wr_data   (fifo_wr_data)
    );
    
    wire fifo_rd_en;
    
    fifo_rd fifo_rd_u(
        .clk            (sys_clk),        
        .rst            (sys_rst),
        .almost_empty   (almost_empty),
        .almost_full    (almost_full),
        .fifo_rd_en     (fifo_rd_en)
    );
    
    wire [7:0] dout;
    wire full;
    wire empty;
    wire [7:0] rd_data_count;
    wire [7:0] wr_data_count;
    fifo_generator_0 fifo_generator_0_u(
      .wr_clk(sys_clk),                // input wire wr_clk
      .rd_clk(sys_clk),                // input wire rd_clk
      .din(fifo_wr_data),                      // input wire [7 : 0] din
      .wr_en(fifo_wr_en),                  // input wire wr_en
      .rd_en(fifo_rd_en),                  // input wire rd_en
      .dout(dout),                    // output wire [7 : 0] dout
      .full(full),                    // output wire full
      .almost_full(almost_full),      // output wire almost_full
      .empty(empty),                  // output wire empty
      .almost_empty(almost_empty),    // output wire almost_empty
      .rd_data_count(rd_data_count),  // output wire [7 : 0] rd_data_count
      .wr_data_count(wr_data_count)  // output wire [7 : 0] wr_data_count
    ); 
endmodule

约束

set_property -dict { PACKAGE_PIN L16   IOSTANDARD LVCMOS33 } [get_ports { sys_clk }]; #IO_L11P_T1_SRCC_35 Sch=sysclk

set_property -dict { PACKAGE_PIN R18   IOSTANDARD LVCMOS33 } [get_ports { sys_rst}];

综合

img

ILA

10个探针,设置位宽:

img

例化ILA添加到顶层模块ip_fifo

ila_0 your_instance_name (
    .clk(sys_clk), // input wire clk
    .probe0(fifo_wr_en), // input wire [0:0]  probe0  
    .probe1(fifo_rd_en), // input wire [0:0]  probe1 
    .probe2(full), // input wire [0:0]  probe2 
    .probe3(almost_full), // input wire [0:0]  probe3 
    .probe4(fifo_wr_data), // input wire [7:0]  probe4 
    .probe5(dout), // input wire [7:0]  probe5 
    .probe6(rd_data_count), // input wire [7:0]  probe6 
    .probe7(wr_data_count), // input wire [7:0]  probe7 
    .probe8(empty), // input wire [0:0]  probe8 
    .probe9(almost_empty) // input wire [0:0]  probe9
);

下载验证

生成bitstream,连接开发板,观看ila波形

img

img

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

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

相关文章

JAVA开发(史上最完整追本溯源JAVA历史、发展和学习)

(第二次世界大战1931-1945) 世界上最先进的技术往往是由于战争催生&#xff0c;在第二次世界大战中除了飞机&#xff0c;坦克和大炮的武器较量外&#xff0c;在隐秘战线的情报工作其实更为重要&#xff0c;在军队将领来往的电报中&#xff0c;为了防止军事情报的泄漏&#xff…

k8s编程operator实战之云编码平台——⑤项目完成、部署

文章目录1、效果展示2、保存用户状态和访问用户服务实现方案2.1 如何保存用户的状态2.1.1 解决保留安装的插件问题2.2 如何访问到用户在工作空间中启动的http服务2.2.1 code-server如何帮我们实现了用户程序的代理3、Operator功能实现3.1 使用KubeBuilder创建项目3.1.1 完善kin…

牛逼了!这是什么神仙面试宝典?半月看完25大专题,居然斩获阿里P7offer

这是什么神仙面试宝典&#xff1f;半月看完25大专题&#xff0c;居然斩获阿里P7offer&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;容我小小的嘚瑟一下下啦~~这份神仙面试宝典总共有25大专题&#xff1a;专题一&#xff1a;JavaOOP面…

QT基础入门目录

&#x1f4a2;&#x1f4a2;&#x1f4a2;&#x1f4a2;&#x1f4a2;&#x1f4a2;&#x1f4a2;&#x1f4a2;&#x1f4a2;&#x1f4a2;&#x1f4a2;&#x1f4a2;&#x1f4a2;&#x1f4a2;&#x1f4a2;&#x1f4a2;目录总览&#x1f4a2;&#x1f4a2;&#x1f4a2;&…

CSGO服务器插件配置教程SourceModMetaMod插件深度解析

CSGO服务器插件配置教程SourceMod&MetaMod插件深度解析 我是艾西&#xff0c;再上一篇中我详细的说了csgo社区/私人服务器的搭建过程以及需要注意的一些事项&#xff0c;那么很多小伙伴对于插件可能还是会有些疑惑&#xff0c;主流的现在就是SourceMod&MetaMod插件&…

基于Ant DesignPro Vue实现通过SpringBoot后台加载自定义菜单- 前后端分离

基于Ant DesignPro Vue实现通过SpringBoot后台加载自定义菜单- 前后端分离 本文想基于Ant DesignPro Vue构建的前端SpringBoot实现的后端接口服务&#xff0c;实现前后端分离开发和独立运行&#xff0c;业务场景是登录认证&#xff0c;认证成功后返回该用户相应权限范围内可见的…

C语言杂记(指针篇)

指针篇 指针就是地址&#xff0c;地址就是指针 指针变量就是存放地址的变量 *号只有定义的时候表示定义指针变量&#xff0c;其他表示从地址里面取内容 通过指针的方法使main函数中的data1和data2发生数据交换。 #include <stdio.h> void chang_data(int *data1,int *da…

Flutter知识点(二)处理Json

flutter不支持反射&#xff0c;所以本来很简单的事情&#xff0c;一下子变复杂了。当然官方也提供了一些工具来方便开发者。 由于Dart的map和array的数据结构和json一样&#xff0c;所以在flutter中&#xff0c;变成了json string与Map&#xff0c;array之间的砖换。 &#x…

MYSQL数据库学习

数据库的基本概念 什么是数据库&#xff1f; 数据库&#xff08;database&#xff09;是用来组织 存储和管理数据的仓库。 当今世界是一个充满着数据的互联网世界&#xff0c;充斥着大量的数据。数据的来源有很多&#xff0c;比如出行记录 消费记录 浏览的网页 发送的信息等等…

《C++ Primer》 第十一章 关联容器

《C Primer》 第十一章 关联容器 11.1 使用关联容器 使用map: //统计每个单词在输入中出现的次数 map<string, size_t> word_count;//string到size_t的空map string word; while(cin>>word)word_count[word];//提取word的计数器并将其加1 for(const auto &w:…

Linux系统之部署Gitblit服务器

Linux系统之部署Gitblit服务器一、Gitblit介绍1.Gitblit简介2..Gitblit官网二、检查本地系统环境1.检查系统版本2.检查系统内核版本3.检查JDK版本三、下载Gitblit1.创建下载目录2.下载Gitblit软件包2.解压Gitblit软件包四、Gitblit的配置工作1.修改配置文件2.修改service-cento…

【小程序】如何实现一个可折叠的列表

作者刚接触小程序开发不久&#xff0c;打算用 CSDN 把学习过程中遇到的一些问题记录下来&#xff0c;都是一些浅显易懂的内容&#xff0c;希望对你也有所帮助。 如文章标题所示&#xff0c;作者要实现一个可折叠的列表&#xff0c;先来看一下页面效果&#xff1a; 这种展示方式…

ChatGPT API 低价上线,开发者可以人手一个了?

千呼万唤&#xff0c;ChatGPT API来了&#xff01; 不仅首发&#xff0c;价格居然还有惊喜&#xff0c;0.002美元/每1000 token&#xff0c;并将价格降低90%&#xff0c;直接打了1折。OpenAI官方还表示&#xff0c;gpt-3.5-turbo目前的版本代号是gpt-3.5-turbo-0301&#xff0…

【面试系列】equals和==的区别

问题&#xff1a;两个对象值相同(x.equals(y) true)&#xff0c;但是可能存在hashCode不同吗? 的定义 比较的是两个对象的内存地址&#xff0c;相等则意味着内存地址一样。 对象的equals方法 Object#equals public boolean equals(Object obj) {return (this obj);}Stri…

数据结构——基本概念

数据数据&#xff1a;是描述客观事物的符号&#xff0c;是计算机中可以操作的对象&#xff0c;是能被计算机识别&#xff0c;并输入给计算机处理的符号的集合。数据元素&#xff1a;是组成数据的&#xff0c;有一定意义的基本单位&#xff0c;在计算机中通常作为整体处理&#…

基于上下文分析的 Python 实时 API 推荐

原文来自微信公众号“编程语言Lab”&#xff1a;基于上下文分析的 Python 实时 API 推荐 搜索关注 “编程语言Lab”公众号&#xff08;HW-PLLab&#xff09;获取更多技术内容&#xff01; 欢迎加入 编程语言社区 SIG-程序分析 参与交流讨论&#xff08;加入方式&#xff1a;添加…

ICLR 2023 | LightGCL: 简单且高效的图对比学习推荐系统

论文题目&#xff1a;LightGCL: Simple Yet Effective Graph Contrastive Learning for Recommendation收录会议&#xff1a;ICLR 2023论文链接&#xff1a;https://arxiv.org/abs/2302.08191代码链接&#xff1a;https://github.com/HKUDS/LightGCL港大数据智能实验室 &#x…

billu_box靶场通关

billu靶场通关 靶机ip&#xff1a;192.168.112.134 信息收集 端口开放 80 目录扫描 images目录存在目录遍历 test.php(任意文件下载) add.php(文件上传) index.php(主页) head.php show.php c.php这个工具的字典不全&#xff0c;换py脚本重新扫多出了以下目录 phpmy in …

目标检测YOLOv5数据集怎么找?

完整的配置-标注-训练-识别在我这篇博客小白YOLOv5全流程-训练实现数字识别_yolov5数字识别_牛大了2022的博客-CSDN博客 模型部分剖析可以看我每周深度学习笔记部分。关于训练的数据集怎么搞很多人问过我&#xff0c;我在这篇文章给大家一点我的经验和建议。 数据集是什么 简…

Leetcode每日一题 1487. 保证文件名唯一

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…