基于AHB的四通道DMA控制器设计-dmac_fifo.v

dmac_fifo.v = 办公室里的「单个中转货架」
• 用来临时放快递,防止运输太快、老师来不及收
• 有放货、取货、判满、判空功能
• 是DMA最核心的缓冲模块

// ==============================
// 模块:dmac_fifo
// 功能:同步FIFO缓存
// 场景:【老师办公室里的单个中转货架】
// ==============================
module dmac_fifo(
input clk, // 时钟:工作节拍(每一拍动一下)
input rst, // 复位:清空整个货架
input clear, // 手动清空:把货架上快递全扔掉
input wr, // 写请求:往货架放快递
input rd, // 读请求:从货架拿快递
input [31:0]wdata, // 要放进去的快递(数据)

output reg [31:0]rdata, // 从货架拿出来的快递
output full, // 货架满了(不能再放)
output empty // 货架空了(没快递可拿)
);

parameter n=7; // 货架深度:一共能放8个快递(0~7)

reg [31:0]mem [0:n]; // 货架本体:8个格子,每个放1个快递
reg [9:0]wr_ptr; // 放货指针:指向下一个放快递的位置
reg [9:0]rd_ptr; // 取货指针:指向下一个拿快递的位置
reg full_internal; // 内部满标志
reg empty_internal; // 内部空标志

// ==============================
// 1. 放货指针(写指针)控制
// 功能:每放一个快递,指针指向下一个空位置
// ==============================
always @(posedge clk or negedge rst)
if (!rst)
wr_ptr <= 0; // 复位→放回0号位置
else if (clear)
wr_ptr <= 0; // 清空→放回0号位置
else if (wr) // 有效放货
wr_ptr <= wr_ptr + 1; // 指针+1,指向下一格

// ==============================
// 2. 取货指针(读指针)控制
// 功能:每拿一个快递,指针指向下一个有货位置
// ==============================
always @(posedge clk or negedge rst)
if (!rst)
rd_ptr <= 0;
else if (clear)
rd_ptr <= 0;
else if (rd) // 有效取货
rd_ptr <= rd_ptr + 1; // 指针+1

// ==============================
// 3. 往货架放快递(写内存)
// 功能:wr有效时,把快递放进对应格子
// ==============================
always @(posedge clk)
if (wr)
mem[wr_ptr] <= wdata;

// ==============================
// 4. 从货架拿快递(读内存)
// 功能:rd有效时,把对应格子快递取出来
// ==============================
always @(posedge clk or negedge rst)
if (!rst)
rdata <= 0;
else if (rd)
rdata <= mem[rd_ptr];

// ==============================
// 5. 判断货架是否满了(full)
// 逻辑:放货指针快追上取货指针 → 满
// ==============================
always @(posedge clk or negedge rst)
if (!rst)
full_internal <= 0;
// 放货、不取货 → 快满了
else if (wr && (wr_ptr+1 == rd_ptr) && (~rd) || wr_ptr == n && rd_ptr == 0)
full_internal <= 1;
// 取货、不放货 → 不满
else if (rd && (~wr))
full_internal <= 0;

// 最终满信号
assign full = full_internal || (wr && (wr_ptr+1 == rd_ptr) && (~rd));

// ==============================
// 6. 判断货架是否空了(empty)
// 逻辑:取货指针追上放货指针 → 空
// ==============================
always @(posedge clk or negedge rst)
if (!rst)
empty_internal <= 1; // 复位默认空
// 取货、不放货 → 空
else if (rd && (rd_ptr+1 == wr_ptr) && (~wr))
empty_internal <= 1;
// 放货、不取货 → 不空
else if (wr && (~rd))
empty_internal <= 0;

// 最终空信号
assign empty = empty_internal || (rd && (rd_ptr+1 == wr_ptr) && (~wr));

endmodule

场景化总结:

dmac_fifo 就是老师办公室里的中转货架。无人机把快递从主干道运回来,先放到这个货架上暂存,避免一下子堆到老师桌上。它会自动记录放货、取货位置,判断货架是否满、是否空,保证快递不乱、不丢、不重复拿取,是DMA实现高速搬运的关键缓冲模块。

留言

您的邮箱地址不会被公开。 必填项已用 * 标注