推荐答案
测试一下
题目
Two modules share one single port ram,please design an Arbiter with following requirements (按要求编写代码):
a)Module A has high priority;
b)Basic ram signal: clk, rst_n, wren, addr [7:0], wdata [7:0], rdata [7:0];
c)Ram read access latency is 2 Tclk;
参考答案与知识点
参考答案
设计一个固定优先级仲裁器,模块A优先级高于模块B。仲裁器状态机控制RAM操作。
核心思路:每个时钟周期采样A和B的请求(req_a, req_b),当至少有一个请求时,仲裁器生成RAM使能信号和地址、数据等。由于读延迟2个时钟,需要设计一个流水线来暂存读请求的模块标识,并在数据返回时转发给对应模块。
Verilog代码示例:
module arbiter (
input clk, rst_n,
input req_a, wr_a, // A的请求和读写标志,高电平有效
input [7:0] addr_a, wdata_a,
output reg [7:0] rdata_a,
output reg valid_a,
input req_b, wr_b,
input [7:0] addr_b, wdata_b,
output reg [7:0] rdata_b,
output reg valid_b,
// RAM接口
output reg ram_wren,
output reg [7:0] ram_addr, ram_wdata,
input [7:0] ram_rdata
);
wire grant_a = req_a; // A优先级高
wire grant_b = req_b & ~req_a; // 只有A无请求时才允许B
wire ram_we = (grant_a && wr_a) || (grant_b && wr_b);
wire [7:0] ram_addr_mux = grant_a ? addr_a : addr_b;
wire [7:0] ram_wdata_mux = grant_a ? wdata_a : wdata_b;
// 读请求流水线(记录发起读的模块,延迟2拍)
reg [1:0] read_source_d1, read_source_d2;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
read_source_d1 <= 2'b00;
read_source_d2 <= 2'b00;
end else begin
read_source_d1 <= (grant_a && !wr_a) ? 2'b01 : ((grant_b && !wr_b) ? 2'b10 : 2'b00);
read_source_d2 <= read_source_d1;
end
end
// 输出rdata和valid,延迟2拍
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
valid_a <= 1'b0;
valid_b <= 1'b0;
rdata_a <= 8'd0;
rdata_b <= 8'd0;
end else begin
valid_a <= (read_source_d2 == 2'b01);
valid_b <= (read_source_d2 == 2'b10);
rdata_a <= (read_source_d2 == 2'b01) ? ram_rdata : rdata_a;
rdata_b <= (read_source_d2 == 2'b10) ? ram_rdata : rdata_b;
end
end
// RAM控制信号寄存器(避免组合逻辑毛刺,实际可加一级寄存器)
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
ram_wren <= 1'b0;
ram_addr <= 8'd0;
ram_wdata <= 8'd0;
end else begin
ram_wren <= ram_we;
ram_addr <= ram_addr_mux;
ram_wdata <= ram_wdata_mux;
end
end
endmodule
解释:
- 仲裁逻辑直接组合输出grant_a和grant_b,实现固定优先级。
- 将RAM控制信号寄存,确保时序稳定。
- 读请求需延迟2个时钟得到数据,因此用两级移位寄存器记录读请求来源,在数据返回时分别赋值给A或B的rdata,并产生valid脉冲。
- 写操作无延迟,直接传递。
- 注意:若A和B同时请求且A为写、B为读,则先完成A的写;A读时B无机会。
涉及知识点
- 固定优先级仲裁器设计
- 单端口RAM读写时序理解
- 读延迟流水线匹配与数据返回
- Verilog状态机或寄存器输出控制
- 多模块共享资源互斥访问