Verilog-HDLを使用した4段シフトレジスタ回路の表し方

集積回路工学

始めに

同期セットリセットのD-FFを用いた4段シフトレジスタをVerilog-HDLを学んだので説明していきます。

4段シフトレジスタの回路シンボル

4段シフトレジスタの回路シンボルを以下に示します。

セットリセットの同期D-FFを使用した四段シフトレジスタの回路シンボル

同期セットリセットD-FFの真理値表

以下に同期セットリセットD-FFの真理値表を示します。

同期セットリセットD-FFの真理値表

注意

RBは、リセットが0の時にQが0になるというような意味があり、SBは、セットが0の時にQが1になるという意味があるので意味を考えて作る必要があります。

タイミングチャートの例

以下にタイミングチャートの例を示します。

タイミングチャートの例

上の真理値表を参考にして、タイミングチャートを作成しました。

Q1からQ2に移動するにつれて、CLKの1周期右に移動していることが読み取れます。

このことから、シフトレジスタは、波形を右に移動させる特性があることが分かります。

VerilogHDL メインのソースコード

以下に、4段シフトレジスタのメインソースコードを示します。

© 2017, Xilinx, Inc. All rights reserved. Vivado 2021.1
メイン ソースコード
--------------------------------------------------------------

`timescale 1ns / 1ps
module stady_2(CLK,RB,SB,IN,Q);
input IN,CLK,RB,SB;
output [3:0]Q;
reg  [3:0]Q;
always @(posedge CLK)begin  //CKが↑に上がった時  
    //Qの時
    if(RB==1'b0) 
    Q<=1'b0;    //RBが0ならば、Q1に0代入
    else if(SB==1'b0)
    Q<=1'b1;    //SBが0ならば、Q1に1代入
    else if(SB==RB==1'b0)
     Q<=1'b0;   //SB,RBが0ならば、Qに0代入
    else begin
    Q[0]<=IN;       //CKがうえにあがったら、Q[0]にIN代入
    end
   begin
    Q[1]<=Q[0]; //CKがうえにあがったら、Q[1]にIN代入
    Q[2]<=Q[1];//CKがうえにあがったら、Q[2]にIN代入
    Q[3]<=Q[2];//CKがうえにあがったら、Q[3]にIN代入
    end
end
endmodule

beginのみが1文のみしか入力できませんでしたが、begin-endを使用することで、、多くの文を入れることに成功しました。

VerilogHDL テストベンチのソースコード

以下に、同期セットリセットのD-FFのテストベンチソースコードを示します。

© 2017, Xilinx, Inc. All rights reserved. Vivado 2021.1
テストベンチ ソースコード
--------------------------------------------------------------
`timescale 1ns / 1ps
module stady_2_test(
    );
    //input
    reg CLK;
    reg SB;
    reg RB;
    reg IN;
    //output
    wire [3:0]Q;
    //回路とテストフィクスチャの接続
    stady_2 uut(
        .CLK(CLK),
        .SB(SB),
        .RB(RB),
        .IN(IN),
        .Q(Q)
    );
    //Sb,Rb,D,CLK時間間隔
    initial begin
    #100                    //100s
    SB <= 1'b0;
    RB <= 1'b1;
    IN <= 1'b0;
    CLK =1;
    #2 RB<=1'b0;    //2s
    #10 RB<=1'b1;   //10s
    #10 IN<=1'b1;   //10s
    #10 IN<=1'b0;   //10s
    #36 SB<=1'b1;   //36s
    #10 SB<=1'b0;   //10s
    end
    //クロック間隔
    always 
    #5              //5s
    CLK=~CLK;
endmodule

シュミレーション結果

シュミレーション結果 © 2017, Xilinx, Inc. Vivado 2021.1

上記のシュミレーション結果が、タイミングチャートと同じになっていれば大丈夫です。

見にくいですが、[0]がQ1に対応していていて、配列の数が多くなるにつれて、右にシフトしていくことが読み取れます。

終わりに

この説明が、参考になれば幸いです。

コメント

タイトルとURLをコピーしました