推荐答案
测试一下
题目
信号a是一个变化频率为1 Mhz的无限序列。使用Verilog实现,检查并计数序列中1110110的个数。
参考答案与知识点
参考答案
设计思路:采用移位寄存器或状态机检测序列'1110110'。由于序列长度7位,使用7位移位寄存器,每个时钟沿将新输入的a移入最低位,同时将移位寄存器内容与常数8'b1110110比较(注意高位补齐0或忽略)。比较结果相等时,计数器加1。此方法天然支持序列重叠,因为每次移位后重新比较,不会遗漏重叠序列。
Verilog实现如下:
module seq_detector (
input clk,
input rst_n,
input a,
output reg [15:0] count // 计数器宽度根据需要调整
);
reg [6:0] shift_reg;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
shift_reg <= 7'b0;
count <= 16'b0;
end else begin
shift_reg <= {shift_reg[5:0], a}; // 左移,新数据进低位
if (shift_reg[5:0] == 6'b110110 && a == 1'b0) // 检测到完整序列
count <= count + 1;
end
end
endmodule
注:上述代码在移位后检测,实际应检测{shift_reg[5:0], a} == 7'b1110110,或使用shift_reg更新前比较。正确写法:先赋值shift_reg,再在下一时钟比较,或组合逻辑直接比较。更简洁的方式:
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
shift_reg <= 7'b0;
count <= 0;
end else begin
shift_reg <= {shift_reg[6:0], a};
if ({shift_reg[6:0], a} == 8'b1110110) // 注意位宽:shift_reg 7位拼接a得8位
count <= count + 1;
end
end
关键点:
1. 重叠处理:上述移位寄存器方法自动支持重叠,例如序列11101101110,当检测到第一个1110110后,下一个时钟继续移位,仍可能检测到第二个。
2. 计数器宽度:题目未指定,一般选足够大的宽度如16位或32位。
3. 时钟与数据关系:假设a与clk同频,每个时钟沿采样a。实际中若a变化频率1MHz,clk应至少1MHz。
4. 异步复位:用于初始化。
5. 避免毛刺:若a与clk异步,需先同步化,但题目未提,默认同步。
状态机方法也可实现,但代码略复杂,移位寄存器方法更简洁。易错点:忘记处理重叠导致漏计;计数器位宽不够导致溢出;比较时位宽不匹配。
涉及知识点
- 序列检测器设计
- 移位寄存器实现序列检测
- FSM状态机实现序列检测
- 重叠序列的处理
- 同步复位与异步复位
- 计数器位宽选择