HOME
  Security
   Software
    Hardware
  
FPGA
  CPU
   Android
    Raspberry Pi
  
nLite
  Xcode
   etc.
    ALL
  
LINK
BACK
 

2022/06/15

線形帰還シフトレジスタ LFSRのまとめ、FPGAの Verilog HDLでの実装例 線形帰還シフトレジスタ LFSRのまとめ、FPGAの Verilog HDLでの実装例

(LFSR Linear Feedback Shift Registerについて調べた)

Tags: [FPGA], [電子工作], [Xilinx XC6SLX9], [FPGA 2022]




●線形帰還シフトレジスタ LFSRについて調べた

 LFSR Linear Feedback Shift Registerについて調べた。

線形帰還シフトレジスタ

●周期

 最大の周期は必ず 2^n-1になる。
 ※ 下記の XORと XNORの説明の通り、全部が 0のビット or 全部が 1のビットのパターンが出ない。

 8ビットの場合は 256 - 1 = 255パターン/周期
 16ビットの場合は 65536 - 1 = 65535パターン/周期


FPGAプログラミング大全 Xilinx編 第2版 単行本 - 2021/1/30
ASIN: 4798063266

Verilog HDL&VHDLテストベンチ記述の初歩 (DESIGN WAVE MOOK) 単行本 - 2011/3/30
ASIN: 4789831086

PUの創りかた 単行本(ソフトカバー) - 2003/10/1
ASIN: 4839909865

RISC-VとChiselで学ぶ はじめてのCPU自作 ― オープンソース命令セットによるカスタムCPU実装への第一歩 単行本(ソフトカバー) - 2021/8/25
ASIN: 4297123053

● XORと XNORでのビット列の違い

 XORの場合は全ビットが 0が出ない(また、初期値に全ビットに 0を入れると永久に全ビットが 0のままで変化しない)
 XNORの場合は全ビットが 1が出ない(また、初期値に全ビットに 1を入れると永久に全ビットが 1のままで変化しない)


●フィボナッチ LFSR

 タップが 2個以上有る場合は順次 XORする。
 (ゲートが 2入力の場合としてタップが複数個有る場合は回路遅延的に不利になる)


●ガロア LFSR

 タップはその関係するビットのシフトの所にだけ入る。
 (タップが複数個有る場合でも回路遅延はゲート 1個ぶんで済む)

 FPGAで回路を組む場合、ソフトで処理を実装する場合の共に「ガロア LFSR」の方が「フィボナッチ LFSR」式よりも効率が良い。


●最長LFSRとなる多項式の例

 a) タップの数は必ず偶数個
 b) タップの数は 2個または 4個で必ず「最長LFSR」になる。(タップの数は 6個は不要)

Taps for Maximum-Length LFSR Counters
n(bit)XOR from(tap)
4 bit4、3
8 bit8、6、5、4
9 bit9、5
16 bit14、15、13、4
17 bit17、14
32 bit32、22、2、1
33 bit33、20
168 bit168、166、153、151
※ 必ず自分のビットを含んでいる

 タップシーケンス [n,A,B,C,0] が見つかったとき(0は x^0=1 に対応)、もう1つのタップシーケンスは [n,n-C,n-B,n-A,0]


●フィボナッチ LFSRの Verilog HDLでの実装例
lfsr.v
module lfsr (CLK, load, seed, out);

    // port
    input        CLK;
    input        load;
    input  [7:0] seed;

    output [7:0] out;

    // internal
    reg    [7:0] r;
    wire         tmp_xor;

    always @(posedge CLK) begin
        if (load)
            r <= seed;
        else begin
            r <= (r<<1) | tmp_xor;
        end
    end

    // 8 bit tap 8,6,5,4
    assign tmp_xor = r[7]^r[5]^r[4]^r[3];
    assign out = r;

endmodule


●ガロア LFSRの Verilog HDLでの実装例
lfsr.v
module lfsr (CLK, load, seed, out);

    // port
    input        CLK;
    input        load;
    input  [7:0] seed;

    output [7:0] out;

    // internal
    reg    [7:0] r;

    always @(posedge CLK) begin
        if (load)
            r <= seed;
        else begin
            // 8 bit tap 8,6,5,4
            r <= {r[0], r[7], r[0]^r[6], r[0]^r[5], r[0]^r[4], r[3], r[2], r[1]};
        end
    end

    assign out = r;

endmodule


● LFSRのテストベンチ
lfsr_tb.v
`timescale 1ns/100ps

`include "lfsr.v"

module lfsr_tb;

    reg        CLK;
    wire       load;
    wire [7:0] seed;

    wire [7:0] out;

    lfsr uut(
        .CLK  (CLK),
        .load (load),
        .seed (seed),
        .out  (out[7:0])
    );

    parameter   P_CLOCK_FREQ = 1000.0 / 50.0; // 50MHz

    initial begin
        CLK = 1'b0;
    end

    always #(P_CLOCK_FREQ/2) begin
        CLK <= ~CLK;
    end

    initial begin
        load = 1;
        seed = 1;
        repeat(2) @(posedge CLK);
        load = 0;
    end

    initial begin
        @(posedge CLK);
        while(load) @(posedge CLK);

        repeat(255 + 4) @(posedge CLK);

        $finish;
   end

endmodule

●シミュレータの結果
 左:フィボナッチ LFSR
 右:ガロア LFSR
Fibonacci Galois
xxxxxxxx xxxxxxxx
00000001 00000001
00000001 00000001 開始 1
00000010 10111000 2
00000100 01011100 3
00001000 00101110 4
00010001 00010111 ...
00100011 10110011
01000111 11100001
10001110 11001000
00011100 01100100
00111000 00110010
01110001 00011001
11100010 10110100
11000100 01011010
10001001 00101101
00010010 10101110
00100101 01010111
01001011 10010011
10010111 11110001
00101110 11000000
01011100 01100000
10111000 00110000
01110000 00011000
11100000 00001100
11000000 00000110
10000001 00000011
00000011 10111001
00000110 11100100
00001100 01110010
00011001 00111001
00110010 10100100
01100100 01010010
11001001 00101001
10010010 10101100
00100100 01010110
01001001 00101011
10010011 10101101
00100110 11101110
01001101 01110111
10011011 10000011
00110111 11111001
01101110 11000100
11011100 01100010
10111001 00110001
01110010 10100000
11100100 01010000
11001000 00101000
10010000 00010100
00100000 00001010
01000001 00000101
10000010 10111010
00000101 01011101
00001010 10010110
00010101 01001011
00101011 10011101
01010110 11110110
10101101 01111011
01011011 10000101
10110110 11111010
01101101 01111101
11011010 10000110
10110101 01000011
01101011 10011001
11010110 11110100
10101100 01111010
01011001 00111101
10110010 10100110
01100101 01010011
11001011 10010001
10010110 11110000
00101100 01111000
01011000 00111100
10110000 00011110
01100001 00001111
11000011 10111111
10000111 11100111
00001111 11001011
00011111 11011101
00111110 11010110
01111101 01101011
11111011 10001101
11110110 11111110
11101101 01111111
11011011 10000111
10110111 11111011
01101111 11000101
11011110 11011010
10111101 01101101
01111010 10001110
11110101 01000111
11101011 10011011
11010111 11110101
10101110 11000010
01011101 01100001
10111010 10001000
01110100 01000100
11101000 00100010
11010001 00010001
10100010 10110000
01000100 01011000
10001000 00101100
00010000 00010110
00100001 00001011
01000011 10111101
10000110 11100110
00001101 01110011
00011011 10000001
00110110 11111000
01101100 01111100
11011000 00111110
10110001 00011111
01100011 10110111
11000111 11100011
10001111 11001001
00011110 11011100
00111100 01101110
01111001 00110111
11110011 10100011
11100111 11101001
11001110 11001100
10011100 01100110
00111001 00110011
01110011 10100001
11100110 11101000
11001100 01110100
10011000 00111010
00110001 00011101
01100010 10110110
11000101 01011011
10001011 10010101
00010110 11110010
00101101 01111001
01011010 10000100
10110100 01000010
01101001 00100001
11010010 10101000
10100100 01010100
01001000 00101010
10010001 00010101
00100010 10110010
01000101 01011001
10001010 10010100
00010100 01001010
00101001 00100101
01010010 10101010
10100101 01010101
01001010 10010010
10010101 01001001
00101010 10011100
01010100 01001110
10101001 00100111
01010011 10101011
10100111 11101101
01001110 11001110
10011101 01100111
00111011 10001011
01110111 11111101
11101110 11000110
11011101 01100011
10111011 10001001
01110110 11111100
11101100 01111110
11011001 00111111
10110011 10100111
01100111 11101011
11001111 11001101
10011110 11011110
00111101 01101111
01111011 10001111
11110111 11111111
11101111 11000111
11011111 11011011
10111111 11010101
01111110 11010010
11111101 01101001
11111010 10001100
11110100 01000110
11101001 00100011
11010011 10101001
10100110 11101100
01001100 01110110
10011001 00111011
00110011 10100101
01100110 11101010
11001101 01110101
10011010 10000010
00110101 01000001
01101010 10011000
11010100 01001100
10101000 00100110
01010001 00010011
10100011 10110001
01000110 11100000
10001100 01110000
00011000 00111000
00110000 00011100
01100000 00001110
11000001 00000111
10000011 10111011
00000111 11100101
00001110 11001010
00011101 01100101
00111010 10001010
01110101 01000101
11101010 10011010
11010101 01001101
10101010 10011110
01010101 01001111
10101011 10011111
01010111 11110111
10101111 11000011
01011111 11011001
10111110 11010100
01111100 01101010
11111001 00110101
11110010 10100010
11100101 01010001
11001010 10010000
10010100 01001000
00101000 00100100
01010000 00010010
10100001 00001001
01000010 10111100
10000100 01011110
00001001 00101111
00010011 10101111
00100111 11101111
01001111 11001111
10011111 11011111
00111111 11010111
01111111 11010011
11111111 11010001
11111110 11010000
11111100 01101000
11111000 00110100
11110000 00011010
11100001 00001101
11000010 10111110
10000101 01011111
00001011 10010111
00010111 11110011
00101111 11000001
01011110 11011000
10111100 01101100
01111000 00110110
11110001 00011011
11100011 10110101
11000110 11100010
10001101 01110001
00011010 10000000
00110100 01000000
01101000 00100000
11010000 00010000 ...
10100000 00001000 253
01000000 00000100 254
10000000 00000010 255
00000001 00000001 ここで1週 256
00000010 10111000 257
00000100 01011100 258
00001000 00101110 ...
00010001 00010111

・LFSR Linear Feedback Shift Registerについて調べた
LFSR Linear Feedback Shift Registerについて調べた


LFSR Linear Feedback Shift Registerについて調べた





Tags: [FPGA], [電子工作], [Xilinx XC6SLX9], [FPGA 2022]

●関連するコンテンツ(この記事を読んだ人は、次の記事も読んでいます)

AMD Xilinxの FPGA Spartan-6 XC6SLX16のボードを買ってアーケード ゲームを動かす
AMD Xilinxの FPGA Spartan-6 XC6SLX16のボードを買ってアーケード ゲームを動かす

  ALINX AX309 XC6SLX9の中華クローンの XC6SLX16版を購入しました

AMD Xilinxの FPGAの開発アプリ ISE WebPackをダウンロードして Windows 10で動かす方法
AMD Xilinxの FPGAの開発アプリ ISE WebPackをダウンロードして Windows 10で動かす方法

  Spartan-6の FPGAの開発用に Xilinx ISE WebPack開発ソフトウェアを Windows 10で動かす方法

Xilinxの FPGA Spartan-6の Block RAM RAMB8BWERに初期値を入れて ROMとして使う方法
Xilinxの FPGA Spartan-6の Block RAM RAMB8BWERに初期値を入れて ROMとして使う方法

  Xilinxの FPGA Spartan-6の Block RAM RAMB8BWERに初期値を入れて ROMとして使う方法

FPGA Spartan-6 XC6SLX16でファミコンを動かす!
FPGA Spartan-6 XC6SLX16でファミコンを動かす!

  Xilinx FPGA Spartan-6 XC6SLX16 NES clone in ALINX AX309

Xilinxの FPGA Spartan-6で PicoBlaze KCPSM 8 ビット マイクロコントローラーを動かす!
Xilinxの FPGA Spartan-6で PicoBlaze KCPSM 8 ビット マイクロコントローラーを動かす!

  PicoBlaze KCPSM6 in Spartan-6 with ISE WebPack

Xilinxの FPGA Spartan-6で MicroBlazeを ISE WebPack 14.7で無料ライセンスで動かす方法
Xilinxの FPGA Spartan-6で MicroBlazeを ISE WebPack 14.7で無料ライセンスで動かす方法

  How to MicroBlaze in Spartan-6 with ISE WebPack 14.7 only Free License to Blink LED !

USB HOST機能を FPGAに実装する方法、FPGAの GPIOに USB HIDデバイスを接続したい!!
USB HOST機能を FPGAに実装する方法、FPGAの GPIOに USB HIDデバイスを接続したい!!

  FPGAに USB HOST機能を実装して Low Speedの USB HIDデバイスを接続するのら

USBの通信プロトコルを勉強する
USBの通信プロトコルを勉強する

  今まで漠然としていた USBデバイスの通信方法を理解します

USB HOST機能が欲しいのでワンチップマイコンの GPIOで USB HOST機能を実現する
USB HOST機能が欲しいのでワンチップマイコンの GPIOで USB HOST機能を実現する

  FPGAに USBデバイスを接続したいのですが、USB HOSTの通信を実装できないので困っています

OLIMEX LPC-H40(Philips LPC2106)
OLIMEX LPC-H40(Philips LPC2106)

  MOTHER BOARD for LPC-H40(LPC-H2106) and ASM Sample Program.

【2022年版】最近流行の RISC-Vプロセッサの環境を WSL Ubuntu上に構築する方法
【2022年版】最近流行の RISC-Vプロセッサの環境を WSL Ubuntu上に構築する方法

  RISC-Vプロセッサの Rocket Chipの開発環境を Windows上に構築して Verilogする方法

XILINX FPGAのBlock RAMをROMとして使う方法
XILINX FPGAのBlock RAMをROMとして使う方法

  FPGAに内蔵のBLOCK-RAMにROMとして初期値を与える方法

スパルタン2で
スパルタン2で"ギャラクシアン基板"を作る!

  Verilog言語で記述してあります

スパルタン2で
スパルタン2で"MIDWAY 8080(TAITO インベーダ基板)"を動かす!

  ハードウェアで本物を作ります

スパルタン2で
スパルタン2で"パックマン"を動かす!

  FPGAでパックマンが動きます

スパルタン2で
スパルタン2で"ド*キーコ*グ"を動かす!

  これもFPGAで動いちゃいます

スパルタン3でアーケードゲームを動かす!
スパルタン3でアーケードゲームを動かす!

  XAPP694の使用例、INVADER/GALAXIAN/PACMAN/D*NKEY-K*NG/TIME PILOT




[HOME] | [BACK]
リンクフリー(連絡不要、ただしトップページ以外は Web構成の変更で移動する場合があります)
Copyright (c) 2022 FREE WING,Y.Sakamoto
Powered by 猫屋敷工房 & HTML Generator

http://www.neko.ne.jp/~freewing/fpga/lfsr_verilog/