目录
-
EMIFA(External Memory Interface A)的"异步存储器"(Asynchronous Memory)指的是那些不与系统时钟同步进行读写操作的外部存储设备。这类存储器使用特定的控制信号(如芯片选择、输出使能、写使能等)来管理数据传输,而不是依赖于一个全局时钟信号。这意味着数据传输的时机是由控制信号的变化触发的,而非由时钟边沿决定。
-
以下是一个EMIFA向FPGA(作为异步存储器)写入数据的示例:
DSP和FPGA的连接
_____________________________________ __________________________
| | | |
| | | |
| | | |
| |>=======EMIFA片选信号============>| |
| |>=======其他控制信号=============>| |
| DSP | | FPGA |
| | | |
| |>=========EMA_DATA[15:0]========>| |
| |>=========EMA_ADDR[15:0]========>| |
| | | |
|_____________________________________| |__________________________|
DSP端:传输数据给FPGA
- DSP向FPGA传输数据的过程涉及到EMIF(External Memory Interface)的初始化、通过特定地址写入数据到FPGA。
-
EMIF初始化:
EMIF_init();
这个函数调用用于初始化外部存储器接口(EMIF),确保它可以正确地与外部设备(在此例中为FPGA)通信。这通常包括设置时序参数、配置总线宽度等。
-
定义宏:
c#define CS4_DATA_ADD (*((volatile unsigned short*)(0x64000000)))
定义一个地址,使用
volatile
关键字是为了告诉编译器不要优化对该地址的访问,因为它的值可能会在程序之外被改变(例如由硬件中断引起的变化)。 -
通过EMIF写入数据到FPGA:
c*CS4_DATA_ADD = 0xFFFF; // 16位宽的数据
- 注:代码中可能存在同一个代码块对CS4_DATA_ADD连续多次赋值,这是可行的,因为已经在初始化时配置了数据交互的时序,以确保FPGA能读取到所有的数据。
FPGA端:接收数据
verilog
inout wire [15:0] EMA_D, // 数据总线
inout wire [15:0] EMA_A, // 地址总线
output reg [15:0] OUT_DATA, // 输出数据
always @(posedge clk) begin
if(EMA_A[3:0] == 4'b0001) begin // https://blog.csdn.net/qq_24402247/article/details/125487700 & https://blog.csdn.net/ResumeProject/article/details/145931716
OUT_DATA <= EMA_D[15:0]; // 当地址匹配时,更新OUT_DATA
end
end