← 2024 · MPS芯源 · 数字FPGA设计(成都) 笔试

推荐答案 测试一下

当数字系统中存在多个通道时,不同通道的 valid 信号到达时间可能不同。请用 Verilog 语言实现,等待所有通道 valid 信号到齐后,再并对齐输出的模块(20分)。

编程题 中等 2024秋招笔试真题Online Assessment芯源MPS

参考答案

本模块需要实现多通道 valid 信号对齐输出。核心思路是:为每个通道使用一个寄存器 valid_reg 记录该通道是否已有效,同时使用数据寄存器 data_reg 暂存每个通道的数据。当检测到某个通道 valid 为高时,将对应数据锁存到 data_reg,并将 valid_reg 置1。当所有通道的 valid_reg 均为1时,表示所有通道数据已到齐,此时产生一个对齐后的 valid_out 信号,并将所有 data_reg 的数据并行输出。同时,需要将 valid_reg 清零(或使用状态机复位),等待下一轮。注意:需要处理 valid 信号可能同时到达或先后到达的情况,以及多通道 valid 持续高电平的情况(应避免重复锁存)。以下是参考代码: `timescale 1ns/1ps module channel_align #( parameter NUM_CHANNELS = 4, parameter DATA_WIDTH = 8 )( input wire clk, input wire rst_n, input wire [NUM_CHANNELS*DATA_WIDTH-1:0] data_in, // 多通道数据拼接 input wire [NUM_CHANNELS-1:0] valid_in, // 各通道 valid output reg [NUM_CHANNELS*DATA_WIDTH-1:0] data_out, // 对齐后输出数据 output reg valid_out // 对齐后输出 valid ); reg [NUM_CHANNELS-1:0] valid_reg; // 记录各通道是否已就绪 reg [NUM_CHANNELS*DATA_WIDTH-1:0] data_reg; // 暂存各通道数据 wire all_ready = &valid_reg; // 所有通道就绪 integer i; always @(posedge clk or negedge rst_n) begin if (!rst_n) begin valid_reg <= 0; data_reg <= 0; data_out <= 0; valid_out <= 0; end else begin // 当所有通道未就绪时,持续锁存新的有效数据 if (!all_ready) begin for (i = 0; i < NUM_CHANNELS; i = i + 1) begin if (valid_in[i] && !valid_reg[i]) begin valid_reg[i] <= 1'b1; data_reg[i*DATA_WIDTH +: DATA_WIDTH] <= data_in[i*DATA_WIDTH +: DATA_WIDTH]; end end valid_out <= 1'b0; end else begin // 所有通道就绪,输出对齐数据 data_out <= data_reg; valid_out <= 1'b1; // 下一周期清零,准备接收新数据(可根据需要改为仅当 valid_out 被接收后清零) valid_reg <= 0; end end end endmodule 关键考点:1)多通道 valid 信号的等待与同步逻辑;2)数据暂存与对齐输出;3)状态机或使能信号控制;4)处理 valid 信号可能重叠或不同时到达的情况;5)避免重复锁存同一通道数据。易错点:未清除 valid_reg 导致后续无法接收新数据;未考虑数据锁存时机导致数据丢失;未处理 valid 持续高电平时的边沿检测。

涉及知识点

  • 多通道同步与握手逻辑
  • Verilog 寄存器与组合逻辑实现
  • 数据对齐输出电路设计
  • 状态机或使能信号控制
  • valid 信号边沿检测与锁存
← 上一题
登录后反馈错题
下一题 →