20220904.学习记录

这篇博客详细介绍了ZYNQ中的AXI接口,包括AXI的三种类型、优点和工作方式,强调了AXI4-Lite在简单控制寄存器读写中的应用。此外,还深入讲解了FIFO的概念,同步和异步FIFO的区别,并给出了FIFO写入和读取模块的Verilog代码示例,展示了如何在FPGA设计中实现FIFO功能。
摘要由CSDN通过智能技术生成

20220904.学习记录

ZYNQ学习笔记

AXI接口简介

摘自UG1037和IHI0022D

AXI介绍:

AXI(高级可扩展接口),是ARM AMBA的一部分;

AMBA:高级微控制器总线架构;是1996年首次引入的一组微控制器总线;

开放的片内互联的总线标准,能在多主机设计中实现多个控制器和外围设备之间的连接和管理。

AXI三种类型:

AXI(AXI-FULL):用于高性能的存储器映射需求;

(存储器映射:主机在对从机进行读写操作时,指定一个目标地址,这个地址对应系统存储空间的地址,表示对该空间进行读写操作)

AXI4-Lite:简化版的AXI4接口,用于低吞吐率存储器映射的通信

AXI4-Stream(ST):拥有高速的流数据通信

AXI的优点

生产力

灵活性:AXI4(支持突发256)和AXI-Lite(1个数据)都属于存储器映射,AXI4-ST不属于存储器映射,它的突发长度不受限制

可获得性

AXI的工作方式

AXI4和AXI4-Lite包含5个独立的通道

读地址通道

读数据通道

写地址通道

写数据通道

写响应通道

AXI4:由于读写地址通道是分离的,所以支持双向同时传输;突发长度最大256

AXI-Lite:和AXI4比较类似,但是不支持突发传输

AXI4-Stream:只有一个单一数据通道,和AXI4的写数据通道比较类似,突发长度不受限制

AXI InterConnect和AXI SmartConnect

这两个IP核都用于连接单/多个存储器映射的AXI Master和单/多个存储器映射的AXI Slave

AXI的通道定义

每一个独立的通道都包含一组信息信号、VALIAD信号和READY信号,

用于提供双向的握手机制

信息的源端使用VALID信号表示当前通道地址、数据和控制信息什么时候有效

目的端使用READY信号表示什么时候可以接受信息

读数据通道和写数据通道都包含一个 LAST信号,用于表示传输的最后一个数据

读数据通道和写数据通道都包含各自的地址通道,地址通道携带了请求所需的地址和信息

读数据通道由从机发送给主机,包含了读数据和读响应的信息,读响应的信号用于表示读传输是否操作完成

写数据通道由主机发送给从机,包含了写数据,然后通过WSTRB信号表示当前数据的哪个字节有效

写响应通道由从机发送给主机,包含了写响应信号,用于表示当前写操作是否完成

握手机制

所有的五个通道都是通过相同的VALID/READY握手处理来控制地址、数据和控制信息,双向握手的机制意味着主机和从机之间传输数据时,都可以控制传输的速率,只有当VALID和READY同时为高电平时,传输才会发生

AXI4-Lite

适用于当不需要AXI4完整功能的时候,一些简单的控制寄存器的读写

EECS151学习笔记

数字集成电路设计 复习笔记

参考自数字CMOS集成电路设计基础- 华东师范大学

1.2.2 数字设计的功能性和稳定性
  • 噪声容限
  • 再生性
  • 扇入扇出
  • 传播延时
  • 上升时间和下降时间
  • 功耗和能耗:瞬时/峰值/平均功耗
2.1.1 二极管静态和动态特性
2.1.2 MOS晶体管阈值电压和电流方程

FIFO IP核介绍

摘自正点原子教程,视频链接正点原子手把手教你学ZYNQ之FPGA开发篇-基于启明星V2【第一期】

FIFO的英文全称是First In First Out,即先进先出。FPGA使用的FIFO一般指的是对数据的存储具有先进先出特性的一个缓存器,常被用于数据的缓存,或者高速异步数据的交互也即所谓的跨时钟域信号传递。它与FPGA内部的RAM和ROM的区别是没有外部读写地址线,采取顺序写入数据,顺序读出数据的方式,使用起来简单方便,由此带来的缺点就是不能像RAM和ROM那样可以由地址线决定读取或写入某个指定的地址。

同步FIFO:指读时钟和写时钟为同一个时钟,在时钟沿来临时同时发生读写操作。

异步FIFO:指读写时钟不一致,读写时钟是相互独立的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cROk0Aim-1662345794155)(D:\typora_md\每日学习记录\20220830.学习记录.assets\image-20220903173734989.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4N2HFRLW-1662345794157)(D:\typora_md\每日学习记录\20220830.学习记录.assets\image-20220903173814309.png)]

fifo_wr:

`timescale 1ns / 1ps

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 [1:0]   state;
reg [3:0]   dly_cnt;
wire        syn;

assign syn = ~almost_empty_syn&almost_empty_d0;      //上升沿抓取

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_syn    <=  almost_empty_d0;    //上升沿抓取  
        end     
end

always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        fifo_wr_en      <= 1'b0;
        fifo_wr_data    <= 8'b0;
        state           <= 2'b0;
        dly_cnt         <= 4'b0;
    end  
    else begin
        case(state)
        2'd0: begin
            if(syn) begin
                state <= 2'b1;
            end 
            else
                state <= state;
        end 
        2'd1: begin
            if(dly_cnt == 4'd10)begin
                dly_cnt     <= 4'd0;
                state       <= 2'd2;
                fifo_wr_en  <= 1'b1;
            end 
            else
                dly_cnt     <= dly_cnt + 1'b1;
        end
        2'd2: begin
             if(almost_full) begin
                fifo_wr_en      <=  1'b0;
                fifo_wr_data    <=  8'b0;
                state           <=  2'b0;
             end
             else begin
                fifo_wr_en      <=  1'b1;
                fifo_wr_data    <=  fifo_wr_data + 1'd1;
            end
         end
         default: state     <= 2'b0;
         endcase
	end       
end

endmodule

fifo_rd

`timescale 1ns / 1ps


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 [1:0]   state;
reg [3:0]   dly_cnt;
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'b0;
        dly_cnt         <= 4'b0;
    end  
    else begin
        case(state)
        2'd0: begin
            if(syn) begin
                state <= 2'b1;
            end 
            else
                state <= state;
        end 
        2'd1: begin
            if(dly_cnt == 4'd10)begin
                dly_cnt     <= 4'd0;
                state       <= 2'd2;
            end 
            else
                dly_cnt     <= dly_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

ip_fifo

`timescale 1ns / 1ps


module ip_fifo(

input sys_clk,
input sys_rst_n

    );

wire        almost_empty    ;
wire        almost_full     ;
wire        fifo_wr_en      ;
wire [7:0]  fifo_wr_data    ;
wire        fifo_rd_en      ;
wire [7:0]  dout;
wire        full;
wire        empty;
wire [7:0]  rd_data_count;
wire [7:0]  wr_data_count;

 
 fifo_wr fifo_wr_u(
.clk          (sys_clk),          
.rst_n        (sys_rst_n),              
.almost_empty (almost_empty), 
.almost_full  (almost_full ),        
.fifo_wr_en   (fifo_wr_en  ),   
.fifo_wr_data (fifo_wr_data) 
   
   );

fifo_rd fifo_rd_u(
.clk            (sys_clk),       
.rst_n         (sys_rst_n),      
.almost_empty   (almost_empty),
.almost_full   (almost_full),      
.fifo_rd_en    (fifo_rd_en)

);


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
);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值