← 2022 · 兆易创新 笔试

推荐答案 测试一下

信号a是一个变化频率为1 Mhz的无限序列。使用Verilog实现,检查并计数序列中1110110的个数。

编程题 中等 笔试真题

参考答案

设计一个Verilog模块检测并计数无限序列中“1110110”出现的次数。采用7位移位寄存器法:每个时钟上升沿将输入a移入移位寄存器,然后比较移位寄存器的值是否等于7'b1110110,若相等则计数器加1。该方法天然支持重叠检测,因为每个时钟周期都会比较最新7位,不会遗漏任何可能的匹配。 代码示例: ```verilog module seq_counter ( input wire clk, input wire rst_n, input wire a, output reg [31:0] cnt ); reg [6:0] shift_reg; always @(posedge clk or negedge rst_n) begin if (!rst_n) begin shift_reg <= 7'b0; cnt <= 32'b0; end else begin shift_reg <= {shift_reg[5:0], a}; if (shift_reg == 7'b1110110) cnt <= cnt + 1'b1; end end endmodule ``` 注意:信号a频率1MHz,因此时钟clk应至少与a同步(如1MHz或更高)以保证正确采样。计数器位宽应足够大,避免溢出。也可采用状态机实现,但移位寄存器更简洁。易错点:①移位寄存器初始化需清零;②比较条件应使用组合逻辑或时序逻辑中的非阻塞赋值先后顺序;③无限序列意味着计数器不会复位(除非系统复位),因此需要考虑位宽;④重叠序列问题已由移位寄存器自动处理。

涉及知识点

  • Verilog
  • 时钟
  • verilog
  • 状态机
  • 组合逻辑
登录后反馈错题
下一题 →