← 2022 · MPS芯源 笔试

推荐答案 测试一下

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状态机或寄存器输出控制
  • 多模块共享资源互斥访问
← 上一题
登录后反馈错题
下一题 →