推荐答案
测试一下
题目
信号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
- 状态机
- 组合逻辑