<< Model Sim-Alteraの使い方 | top | USB電源のノイズ対策 >>

スポンサーサイト

一定期間更新がないため広告を表示しています

スポンサードリンク | - | | - | - |

FPGAで4bitシフトレジスタ

 さて、FPGAでSFCコントローラの制御をするときに必要になるのはシフトレジスタだ。
まずは4bitシフトレジスタだ、ということでVerilog HDLで書いてみた。
自動制御に使ったTC74HC165APを参考にした。
大きな違いは、load端子がHighでロードすること。ちょっと引っかかったのはブロッキング代入'='とノンブロッキング代入'<='だ。ブロッキング代入は逐次的に実行されるのだが、ノンブロッキング代入は並列的に実行される。使い分けよう。

module SH(a,clk,load,q);
input [3:0] a;
input clk,load;
output q;
reg q;
reg [3:0] r;

always @(posedge load) begin
  r = a;
  q <= a[3];
  r <= (r << 1);
  end

always @(posedge clk) begin
  if(load==0)
    begin     
      q <= r[3];
    end
      r <= (r << 1);
end
endmodule

(注:Model Simだとコンパイルが通るが、Quartusiiだと通らない。二つのalways文の中で同じ変数mに代入操作することは出来ない?2013/9/7追記)
シミュレーションのためのモジュールは次のとおり。

`timescale 1ps/1ps
module sim;
  reg [3:0] a;
  reg clk,load;
  wire q;
  parameter STEP = 100000;
  SH SH0(.a(a),.clk(clk),.load(load),.q(q));
 
  always begin
    clk = 0;
    #STEP;
    clk = 1;
    #STEP;
  end
 
  always begin
    load = 0;
    #(STEP*7);
    load = 1;
    #(STEP);
   end
 
  initial begin
  a = 4'b1111;
  #(STEP*10);
  a = 4'b0111;//0がa[3]
  #STEP;
  #STEP;
    end
endmodule

シミュレーション結果を見てみよう。

上からパラレル信号、クロック、ロード信号、シリアル信号の順。
ロード信号の立ち上がりのところでレジスタにパラレル信号が記憶され、ロードがHighの間パラレルの最初の信号が出力される。ロードがLowになるとクロックの次の立ち上がりで次のパラレル信号が出力される。
SFCのコントローラにオシロを繋いで見た波形そのものだ。

あとは16bitに拡張すればよい。

あと、関係ないけどFPGAで数値計算とかしたいな。素数判定とか並列的にさ。プロジェクトオイラーの問題解けないかな。
ジャジャガッチ | FPGA | 02:48 | comments(0) | trackbacks(0) |

スポンサーサイト

スポンサードリンク | - | 02:48 | - | - |
Comment









Trackback
URL:

03
--
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
--
>>
<<
--
PR
RECOMMEND
RECENT COMMENT
MOBILE
qrcode
OTHERS
Since 2013/09/17
LATEST ENTRY
CATEGORY
ARCHIVE
LINKS
PROFILE
SEARCH