推荐答案
测试一下
题目
设计一个电路,使用时序逻辑对一个单bit信号进行毛刺滤除操作。高电平或者低电平宽度小于4个时钟周期的为毛刺。用Verilog或者VHDL写出代码。
参考答案与知识点
参考答案
设计思路:毛刺滤除的核心是检测信号持续稳定时间是否达到阈值(此处为4个时钟周期)。采用边沿检测+计数器或移位寄存器实现。以下给出两种常用方法,均使用时序逻辑。
方法一:移位寄存器法。用4个触发器构成移位寄存器,每个时钟沿采样输入信号。当移位寄存器中所有位相同时,说明输入连续4个周期未变化,此时输出该稳定值;否则输出保持不变。注意:该方法对毛刺滤除彻底,但输出会延迟4个时钟周期。
Verilog代码:
module glitch_filter (
input clk,
input rst_n,
input signal_in,
output reg signal_out
);
reg [3:0] shift_reg;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
shift_reg <= 4'b0;
signal_out <= 1'b0;
end else begin
shift_reg <= {shift_reg[2:0], signal_in};
if (&shift_reg == 1'b1) // 全1
signal_out <= 1'b1;
else if (|shift_reg == 1'b0) // 全0
signal_out <= 1'b0;
// else 保持不变
end
end
endmodule
方法二:计数器法。检测输入相对于当前输出的变化。当输入与输出不同时,启动计数器累加;若中途输入跳回原值则计数器清零。当计数器计满3(即连续3个周期不变)时,将输出更新为输入值。注意:需连续3个周期不变,因为第4个周期到来时输入已稳定4个周期。计数器从0计到3需要持续3个周期不变后再过一个周期更新。更简单:计数器从0开始,每个时钟沿若输入等于上一次采样值则计数+1,否则清零;当计数≥3时更新输出。实际计数到3即表示已连续4个周期相同(因为计数从0开始,到3时已持续4个周期)。
Verilog代码:
module glitch_filter (
input clk,
input rst_n,
input signal_in,
output reg signal_out
);
reg [1:0] cnt; // 计数到3需要2bit
reg signal_d;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt <= 2'b0;
signal_d <= 1'b0;
signal_out <= 1'b0;
end else begin
signal_d <= signal_in;
if (signal_d != signal_in) begin
cnt <= 2'b0;
end else begin
if (cnt == 2'b11) begin
// 已连续4周期相同,更新输出(也可保持cnt不变)
signal_out <= signal_in;
cnt <= 2'b11;
end else begin
cnt <= cnt + 1'b1;
end
end
end
end
endmodule
注意事项:1. 输入信号应与时钟同步,若为异步需先两级同步。2. 阈值4个周期指稳定持续时间≥4周期才视为有效,毛刺宽度<4周期被滤除。3. 输出更新时机:当检测到连续4个相同值后立即在当前时钟沿输出新值。4. 计数器法功耗较低,但需注意计数溢出。移位寄存器法直观但寄存器较多。
涉及知识点
- 毛刺滤除电路设计
- 同步与异步信号处理
- 计数器与移位寄存器应用
- 时序逻辑的阈值判断
- Verilog基本语法与模块编写