vivado IP核:ILA、时钟、RAM、FIFO

这篇具有很好参考价值的文章主要介绍了vivado IP核:ILA、时钟、RAM、FIFO。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ILA

vivado工具集成了逻辑分析仪,ILA IP核用于替换外部的逻辑分析仪,添加探针来监控内部信号波形变化。

1)IP Catalog

vivado IP核:ILA、时钟、RAM、FIFO

2)搜索栏可搜索IP核,如创建FIFO、RAM等。

vivado IP核:ILA、时钟、RAM、FIFO

3)搜索并选择。

vivado IP核:ILA、时钟、RAM、FIFO

4)设置ILA各项参数。 

 

vivado IP核:ILA、时钟、RAM、FIFO

5) 设置好IP核参数后点ok。

6)打开ila_0.evo。

vivado IP核:ILA、时钟、RAM、FIFO

7) 复制ila例化模板。

vivado IP核:ILA、时钟、RAM、FIFO

8)在设计文件中将IP核例化并连接,再生成比特流。

9)将比特流下载到板子中,点运行即可查看探针捕捉到的波形。

vivado IP核:ILA、时钟、RAM、FIFO

vivado IP核:ILA、时钟、RAM、FIFO

时钟

时钟IP核

RAM

Xilinx A7系列FPGA有140片block RAM每片内存为36k(bit),共4.9M。

双端口RAM可以写可以读(分别有读写时钟),但是要规定读写优先级。

单端口:只有一个端口,读写数据不能同时进行,共用数据通道。

伪双端口:拥有两个数据通道,一个用来写一个用来读。(常见)

真双端口:拥有两个数据通道,两个都可用来写/读。

创建RAM IP核

vivado IP核:ILA、时钟、RAM、FIFO

vivado IP核:ILA、时钟、RAM、FIFO

vivado IP核:ILA、时钟、RAM、FIFO

创建RAM IP核的主设计代码ip_ram.v(例化了ram_rw 模块和ram IP 核blk_mem_gen_0):

blk_mem_gen_0来自IP核的.veo文件,直接例化即可。代码结构图如下:

vivado IP核:ILA、时钟、RAM、FIFO

`timescale 1ns / 1ps
module ip_ram(
input sys_clk,
input sys_rst_n
);
    wire ram_en;
    wire rw;
    wire [4:0] ram_addr;
    wire [7:0] ram_wr_data;
    wire [7:0] douta;
    ram_rw ram_rw_u(    
        .clk(sys_clk),       
        .rst_n(sys_rst_n),     
        .ram_en(ram_en),    
        .rw(rw),        
        .ram_addr(ram_addr),  
        .ram_wr_data(ram_wr_data)
    );
    blk_mem_gen_0 your_instance_name (
        .clka(sys_clk),	// input wire clka
        .ena(ram_en),		// input wire ena
        .wea(rw),		// input wire [0 : 0] wea
        .addra(ram_addr),	// input wire [4 : 0] addra
        .dina(ram_wr_data),	// input wire [7 : 0] dina
        .douta(douta)  	// output wire [7 : 0] douta
    );
endmodule

ram_rw.v作为读写模块驱动IP核,负责产生对ram IP核读/写所需的所有数据总线、地址总线以及控制信号,同时从ram IP读出的数据也被送进ram_rw 模块。

`timescale 1ns / 1ps
module ram_rw(
    input               clk,
    input               rst_n,
    output  reg         ram_en,
    output  reg         rw,
    output  reg[4:0]    ram_addr,
    output  reg[7:0]    ram_wr_data
    );
    reg [5:0] rw_cnt;   //define a counter,write in [0:31],read in [32:63].
    
    always @ (posedge clk or negedge rst_n) begin
        if(~rst_n) begin
            ram_en <= 1'b0;
        end
        else begin
            ram_en <= 1'b1;
        end
    end
    always @ (posedge clk or negedge rst_n) begin
        if(~rst_n)
            rw_cnt <= 6'd0;
        else if(rw == 6'd63)
            rw_cnt <= 6'd0;
        else
            rw_cnt <= rw_cnt +6'd1;
    end
    always @ (posedge clk or negedge rst_n) begin
        if(~rst_n)
            ram_wr_data <= 8'd0;
        else if((rw_cnt <= 6'd31) && ram_en)// rw_cnt:0-31写操作。
            ram_wr_data <= ram_wr_data + 8'd1;
        else
            ram_wr_data <= ram_wr_data;
    end
//读写选择信号
always @(posedge clk or negedge rst_n) begin
        if(~rst_n)
            rw <= 1'b1;
        else if(rw_cnt <= 6'd31)//rw_cnt:0-31写操作
            rw <= 1'b1;
        else
            rw <= 1'b0;
    end
    always @(posedge clk or negedge rst_n) begin
        if(~rst_n)
            ram_addr <= 5'd0;
        else
            ram_addr <= rw_cnt[4:0];
    end
endmodule

FIFO

搭建FIFO一般用Block Ram或Dram,Bram允许读写位宽不同。FIFO与FPGA内部RAM相比无外部读写地址线,采取顺序写入/读出数据方式。不能像RAM那样可由地址线决定读/写某个指定的地址。

1)创建工程后打开.v设计文件,并通过IP Catalog搜索FIFO,选择FIFO Generator。

vivado IP核:ILA、时钟、RAM、FIFO

2)要选择构成FIFO的适当RAM类型。 

vivado IP核:ILA、时钟、RAM、FIFO

 FIFO写操作

`timescale 1ns / 1ps
//write->read->empty->write......
module fifo_wr(
    input       clk,
    input       rst_n,
    input       almost_empty,
    input       almost_full,
    
    output reg  fifo_wr_en,
    output reg  [7:0] fifo_wr_data
    );
    reg almost_empty_d0;
    reg almost_empty_syn;
    reg [3:0] dly_cnt;
    reg [1:0] state;
    wire syn;
assign syn = ~almost_empty_syn & almost_empty_d0;
// almost_empty拉高后的下一个周期syn拉高。
    always @ (posedge clk or negedge rst_n) begin
        if(~rst_n) begin
            almost_empty_d0 <= 1'b0;
            almost_empty_syn <= 1'b0;
        end
        else begin
            almost_empty_d0 <= almost_empty;
// almost_empty延迟一个上升沿赋值给almost_empty_d0
            almost_empty_syn <= almost_empty_d0;            
// almost_empty_d0延迟一个上升沿赋值给almost_empty_syn
        end
end
    always @ (posedge clk or negedge rst_n) begin
        if(~rst_n) begin
            fifo_wr_en <= 1'b0;
            fifo_wr_data <= 8'd0;
            state <= 2'd0;
            dly_cnt <= 4'b0;
//FIFO IP核不能立即就写入,所以要有一个延时,一般10拍就够。
        end
        else begin
//构造一个状态机,state有3个状态。
            case(state)
//状态0:如果syn拉高,说明FIFO即将空了,该写了,于是跳到状态1;syn不拉高,则FIFO还未空,则不写。
                2'd0:begin
                    if(syn) state <= 2'd1;
                    else state <= state;
                end
//状态1:dly_cnt计满10个数后开始写。dly_cnt<10时一直+1;dly_cnt到10后,dly_cnt清零,跳到状态2,写使能fifo_wr_en拉高。
                2'd1:begin
                    if(dly_cnt == 4'd10) begin
                        dly_cnt <= 4'b0;
                        state <= 2'd2;
                        fifo_wr_en <= 1'b1;
                    end
                    else begin
                        dly_cnt <= dly_cnt +1'b1;
                    end
                end
//状态2:真正开始写了,FIFO一直写。如果写满almost_full拉高:写使能fifo_wr_en拉低,写数据fifo_wr_data归零,转向状态0。如果没写满:写使能继续拉高,写数据+1。(这里写数据根据项目自己确定写入的内容,可以是采集数据)
                2'd2:begin
                    if(almost_full) begin
                        fifo_wr_en <= 1'b0;
                        fifo_wr_data <= 8'd0;
                        state <= 2'd0;
                    end
                    else begin
                        fifo_wr_en <= 1'b1;
                        fifo_wr_data <= fifo_wr_data + 1'b1;
                    end
                end
                default:state <= 2'd0;
            endcase
        end
    end
endmodule

FIFO读操作

`timescale 1ns / 1ps
//write->read->empty->write......
module fifo_rd(
    input       clk,
    input       rst_n,
    input       almost_empty,
    input       almost_full,
    
    output reg  fifo_rd_en
    );
    reg almost_full_d0;
    reg almost_full_syn;
    reg [3:0] dly_cnt;
    reg [1:0] state;
    wire syn;
    assign syn = ~almost_full_syn & almost_full_d0;
    always @ (posedge clk or negedge rst_n) begin
        if(~rst_n) begin
            almost_full_d0 <= 1'b0;
            almost_full_syn <= 1'b0;
        end
        else begin
            almost_full_d0 <= almost_full;
            almost_full_syn <= almost_full_d0;        
        end
    end
    always @ (posedge clk or negedge rst_n) begin
        if(~rst_n) begin
            fifo_rd_en <= 1'b0;
            state <= 2'd0;
            dly_cnt <= 4'b0;
        end
        else begin
            case(state)
                2'd0:begin
                    if(syn) state <= 2'd1;
                    else state <= state;
                end
                2'd1:begin
                    if(dly_cnt == 4'd10) begin
                        dly_cnt <= 4'b0;
                        state <= 2'd2;
                    end
                    else begin
                        dly_cnt <= dly_cnt +1'b1;
                    end
                end
                2'd2:begin
                    if(almost_empty) begin
                        fifo_rd_en <= 1'b0;
                        state <= 2'd0;
                    end
                    else begin
                        fifo_rd_en <= 1'b1;
                    end
                end
                default:state <= 2'd0;
            endcase
        end
    end
endmodule

完成管脚约束(IO Planning直接操作)

vivado IP核:ILA、时钟、RAM、FIFO

由于FIFO的读写操作无法通过板子看出来,所以添加ila探针:

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(empty), // input wire [0:0]  probe2 
	.probe3(almost_empty), // 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(full), // input wire [0:0]  probe8 
	.probe9(almost_full) // input wire [0:0]  probe9
);

vivado IP核:ILA、时钟、RAM、FIFO文章来源地址https://www.toymoban.com/news/detail-419876.html

到了这里,关于vivado IP核:ILA、时钟、RAM、FIFO的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PowerToys Windows 工具集

    项目 2023/04/19 18 个参与者 反馈 Microsoft PowerToys 是一组实用工具,可帮助高级用户调整和简化其 Windows 体验,从而提高工作效率。 安装 PowerToys x64 :支持 ARM64 :支持 当前可用的实用工具包括: Always on Top 通过 Always on Top,可使用快捷键方式 (⊞ Win+Ctrl+T) 将窗口固定在其他窗口

    2024年02月06日
    浏览(71)
  • 个人可能会用到的工具集

    Odin 完整的本地化系统工具 - I2 Localization 游戏互动叙事工具 - articy:draft 3 功能强大的对话系统 - Dialogue System 游戏音频解决方案 - Master Audio 2022 高品质寻路系统 - A* Pathfinding Project Pro 场景优化工具 - Mesh Baker 游戏输入控制器 - Rewired 优质触控控制插件 - Lean Touch+ 防破解!代码混

    2024年02月15日
    浏览(53)
  • 国内可用免费AI工具集

    1、Kimi Chat         由月之暗面科技有限公司(Moonshot AI)开发的人工智能助手。擅长中英文对话,能够提供安全、有帮助且准确的回答。它的能力包括阅读和理解用户上传的文件,访问互联网内容,以及结合搜索结果来回答问题。比如上传一份英文资料,可让它翻译为中

    2024年03月14日
    浏览(61)
  • layui框架学习(45: 工具集模块)

      layui的工具集模块util支持固定条、倒计时等组件,同时提供辅助函数处理时间数据、字符转义、批量事件处理等操作。   util模块中的fixbar函数支持设置固定条(2.7版本的帮助文档中叫固定块),是指固定在页面一侧的工具条元素,不随页面滚动条滚动,默认在页面右

    2024年02月07日
    浏览(58)
  • VS工具集及C++规范

    一、VS工具集列表: Visual Studio 2008:v90 Visual Studio 2010:v100 Visual Studio 2012:v110 Visual Studio 2013:v120 Visual Studio 2015:v140 (v140_xp) Visual Studio 2017:v141 Visual Studio 2019:v142 Visual Studio 2022:v143 二、VS支持的C++规范: C++17:     vs2017基本支持,vs2015部分支持。 C++14:     vs2017就可以

    2024年02月07日
    浏览(53)
  • 安卓逆向_0 --- 逆向、安全、工具集

    ​吾爱 工具集 官网:https://www.52pojie.cn/ 工具集:https://down.52pojie.cn  :https://www.52pojie.cn/thread-811805-1-1.html 看雪 工具集 官网:https://bbs.kanxue.com/ 工具集:https://tools.pediy.com 看雪 知识库 看雪 知识库:https://www.kanxue.com/chm.htm?id=14693 安卓 逆向环境 r0env 安装设置 r0env :https://m

    2024年02月09日
    浏览(72)
  • Visual Studio工具集相关(MSBuild)

    V100(VS2010)之前版本在MSBuild platsforms目录 V100(VS2010)之后的版本在VC中,经测试V140(VS2015)也在platforms中 -Visual Studio 2019: V142 -Visual Studio 2017: V141 -Visual Studio 2015: V140 -Visual Studio 2013: V120 -Visual Studio 2012: V110 -Visual Studio 2010: V100 -Visual Studio 2008: V90 -Visual Studio 2005: V80 -Visual Studio 2003: V71

    2024年02月08日
    浏览(64)
  • 【自然语言处理】3.1NLTK工具集

    NLTK为自然语言处理集 多语料库(Corpora) 词典资源(Lexicon),如WordNet 基本自然语言处理工具集 标记解析(Tokenization) 词干提取(Stemming) 词性标注(POS Tagging) 句法分析(Syntactic Parsing) 安装(command+R), pip install nltk 下载 nltk.download() 方法 停用词 因为语义不重要(如冠词)

    2024年02月11日
    浏览(56)
  • 云安全系列4:解析云安全工具集

    随着组织越来越多地将数据和应用转移到云端,云安全在确保工作负载安全方面变得至关重要。Gartener 就表示:“云优先战略现在已十分普遍,甚至在不愿承担风险的企业机构中也是如此。但由于缺乏确保安全云计算部署所必需的技能和工具,因此执行仍然受到阻碍。” 在了

    2024年02月02日
    浏览(45)
  • 数据仓库性能测试方法论与工具集

    目录 目录 数据仓库 v.s. 传统数据库 数据仓库性能测试案例 性能指标 测试方案 测试场景 测试数据集 测试用例 性能指标 测试脚本工具 基准环境准备 硬件环境 软件环境 测试操作步骤 Cloudwave 执行步骤 导入数据集 TestCase 1. 执行 13 条标准 SQL 测试语句 TestCase 2. 执行多表联合

    2024年02月12日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包