始めに
同期セットリセットのD-FFを用いた4段シフトレジスタをVerilog-HDLを学んだので説明していきます。
4段シフトレジスタの回路シンボル
4段シフトレジスタの回路シンボルを以下に示します。

同期セットリセット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
シュミレーション結果

上記のシュミレーション結果が、タイミングチャートと同じになっていれば大丈夫です。
見にくいですが、[0]がQ1に対応していていて、配列の数が多くなるにつれて、右にシフトしていくことが読み取れます。
終わりに
この説明が、参考になれば幸いです。
コメント