工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Verilog

Verilogパターン検出器:FPGA向け高度なシーケンス検出

前回の例ではシンプルなシーケンス検出器を扱いました。ここでは、もう少し長いパターンを検出するパターン検出器の例を示します。

設計:110101パターン検出器

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
注: この設計にも前回と同様のオーバラップ検出バグが存在します。S110101状態からの遷移で、入力が1の場合S1に戻っていますが、正しくはパターンの接尾辞が接頭辞と一致する最長プレフィックス(この場合S11)に遷移すべきです。

Verilog

  1. Verilogマスター:デジタル回路設計のための完全チュートリアル
  2. Verilog連結マスター:実践ガイド
  3. Verilogシーケンス検出器:パターン認識のための信頼性の高いFSM構築
  4. Verilog代入文の理解:種類、構文、ベストプラクティス
  5. Verilogブロッキング代入とノンブロッキング代入:違いを徹底解説
  6. Verilog関数のマスター:効率的なRTL設計のために
  7. Verilogタスクの理解:関数との違い、構文、使用法
  8. Verilogクロックジェネレータ:設計と実装ガイド
  9. Verilog数学関数のマスター:効率的なハードウェア設計のために
  10. Verilog $timeformatのマスター:精度と表示制御
  11. 任意のスコープでのVerilog timescale理解と表示