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学习笔记
数字集成电路设计 复习笔记
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:指读写时钟不一致,读写时钟是相互独立的
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
);