← 大疆FPGA逻辑岗B卷(19.08.06)

推荐答案 测试一下

设计一个电路,使用时序逻辑对一个单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基本语法与模块编写
← 上一题
登录后反馈错题
下一题 →