亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> Verilog

Verilog 模式检测器:FPGA 中的高级序列检测

前例探讨了简单序列检测器。这里是另一个检测稍长模式的模式检测器示例。

设计

module det_110101 (
    input clk,
    input rstn,
    input in,
    output out
);
parameter IDLE = 0, S1 = 1, S11 = 2, S110 = 3, S1101 = 4, S11010 = 5, S110101 = 6;
reg [2:0] cur_state, next_state;
assign out = cur_state == S110101 ? 1 : 0;
always @ (posedge clk) begin
    if (!rstn) cur_state <= IDLE;
    else cur_state <= next_state;
end
always @ (cur_state or in) begin
    case (cur_state)
        IDLE : begin
            if (in) next_state = S1;
            else next_state = IDLE;
        end
        S1: begin
            if (in) next_state = S11;
            else next_state = IDLE;
        end
        S11: begin
            if (!in) next_state = S110;
            else next_state = S11;
        end
        S110 : begin
            if (in) next_state = S1101;
            else next_state = IDLE;
        end
        S1101 : begin
            if (!in) next_state = S11010;
            else next_state = IDLE;
        end
        S11010: begin
            if (in) next_state = S110101;
            else next_state = IDLE;
        end
        S110101: begin
            if (in) next_state = S1;
            else next_state = IDLE; // Bug 2
        end
    endcase
end
endmodule

测试平台

module tb;
reg clk, in, rstn;
wire out;
integer l_dly;
always #10 clk = ~clk;
det_110101 u0 ( .clk(clk), .rstn(rstn), .in(in), .out(out) );
initial begin
    clk <= 0; rstn <= 0; in <= 0;
    repeat (5) @ (posedge clk);
    rstn <= 1;
    @(posedge clk) in <= 1;
    @(posedge clk) in <= 1;
    @(posedge clk) in <= 0;
    @(posedge clk) in <= 1;
    @(posedge clk) in <= 0;
    @(posedge clk) in <= 1;
    @(posedge clk) in <= 1;
    @(posedge clk) in <= 1;
    @(posedge clk) in <= 0;
    @(posedge clk) in <= 1;
    @(posedge clk) in <= 0;
    @(posedge clk) in <= 1;
    #100 $finish;
end
endmodule

仿真日志

ncsim> run
T=10 in=0 out=0
T=30 in=0 out=0
T=50 in=0 out=0
T=70 in=0 out=0
T=90 in=0 out=0
T=110 in=1 out=0
T=130 in=1 out=0
T=150 in=0 out=0
T=170 in=1 out=0
T=190 in=0 out=0
T=210 in=1 out=0
T=230 in=1 out=1
T=250 in=1 out=0
T=270 in=0 out=0
T=290 in=1 out=0
T=310 in=0 out=0
T=330 in=1 out=0
T=350 in=1 out=1
T=370 in=1 out=0
T=390 in=1 out=0
T=410 in=1 out=0
Simulation complete via $finish(1) at time 430 NS + 0

Verilog

  1. Verilog 入门:数字电路设计完整教程
  2. 掌握 Verilog 拼接操作:实用指南
  3. Verilog 序列检测器:构建可靠 FSM 实现模式识别
  4. 深入理解 Verilog 赋值语句:类型、语法与最佳实践
  5. Verilog阻塞与非阻塞赋值:关键区别详解
  6. 掌握Verilog函数:高效RTL设计的复用利器
  7. 理解Verilog任务:函数vs任务、语法与用法全解析
  8. Verilog 时钟发生器设计与实现指南
  9. 掌握 Verilog 数学函数:高效硬件设计的利器
  10. 掌握 Verilog $timeformat:精度控制与显示格式化
  11. 理解与打印 Verilog 任意作用域下的 Timescale
  12. 掌握 Verilog 文件 I/O:打开、读取、写入和关闭