20220904.学习记录

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 / 1psmodule 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)beginif(!rst_n)beginalmost_empty_d0     <=  1'b0;   almost_empty_syn    <=  1'b0;   endelse beginalmost_empty_d0     <=  almost_empty;       //上升沿抓取  almost_empty_syn    <=  almost_empty_d0;    //上升沿抓取  end     
endalways @(posedge clk or negedge rst_n)beginif(!rst_n)beginfifo_wr_en      <= 1'b0;fifo_wr_data    <= 8'b0;state           <= 2'b0;dly_cnt         <= 4'b0;end  else begincase(state)2'd0: beginif(syn) beginstate <= 2'b1;end elsestate <= state;end 2'd1: beginif(dly_cnt == 4'd10)begindly_cnt     <= 4'd0;state       <= 2'd2;fifo_wr_en  <= 1'b1;end elsedly_cnt     <= dly_cnt + 1'b1;end2'd2: beginif(almost_full) beginfifo_wr_en      <=  1'b0;fifo_wr_data    <=  8'b0;state           <=  2'b0;endelse beginfifo_wr_en      <=  1'b1;fifo_wr_data    <=  fifo_wr_data + 1'd1;endenddefault: state     <= 2'b0;endcaseend       
endendmodule

fifo_rd

`timescale 1ns / 1psmodule 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)beginif(!rst_n)beginalmost_full_d0     <=  1'b0;   almost_full_syn    <=  1'b0;   endelse beginalmost_full_d0     <=  almost_full;       //上升沿抓取  almost_full_syn    <=  almost_full_d0;    //上升沿抓取  end     
endalways @(posedge clk or negedge rst_n)beginif(!rst_n)beginfifo_rd_en      <= 1'b0;state           <= 2'b0;dly_cnt         <= 4'b0;end  else begincase(state)2'd0: beginif(syn) beginstate <= 2'b1;end elsestate <= state;end 2'd1: beginif(dly_cnt == 4'd10)begindly_cnt     <= 4'd0;state       <= 2'd2;end elsedly_cnt     <= dly_cnt + 1'b1;end2'd2: beginif(almost_empty) beginfifo_rd_en      <=  1'b0;state           <=  2'b0;endelse fifo_rd_en      <=  1'b1;enddefault: state     <= 2'b0;endcaseend       
end

ip_fifo

`timescale 1ns / 1psmodule 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
);


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部