← 2024 · MPS芯源 · 数字FPGA设计(成都) 笔试
推荐答案
测试一下
题目
当数字系统中存在多个通道时,不同通道的 valid 信号到达时间可能不同。请用 Verilog 语言实现,等待所有通道 valid 信号到齐后,再并对齐输出的模块(20分)。
参考答案与知识点
参考答案
本模块需要实现多通道 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 信号边沿检测与锁存