FPGAでSFCコントローラ作ったよ!

 FPGA(DE0)でSFCコントローラが作れました。

 最終的なシフトレジスタのコードは

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

always @(posedge clk or posedge load) begin
if(load)
    begin
    r = a;
    q = r[15];
    r = r << 1;
    end
else
    begin
    q = r[15];
    r = r << 1;
    end

end
endmodule

クロックのクロストーク(?)が最後の敵でした。

まあ、これが出来たところで何の役に立つんだと言われれば何の役にも立たないと自信を持って言えます。
よい子の皆さんはFPGAなんてオーバースペックなもの使わないで素直にシフトレジスタを買ってきましょう。

詳しくはここ
ジャジャガッチ | FPGA | 16:02 | comments(0) | trackbacks(0) |

DE0の拡張ヘッダを使う

 DE0を自作した機器と接続するためには40ピンの拡張ヘッダを使う。4ピンは電源、GNDに使用されているので残り36ピン。
 問題は、SFCコントローラは5V系なのにDE0の出力が3.3V系なことだ。レベル変換が必要だ。
 東芝のホームページを見ると、5V→3.3VにはTC74VHC/LVX/LCXを、3.3V→5VにはTC74VHCT/ACTを使えばよいと書いてある。
 というわけで電子パーツ屋で買ってきた。TC74VHC125FとTC74VHCT32AF。前者はバッファ、後者はORゲート(バッファは置いてなかった)。
 FPGAでAND回路を作って動作確認したが問題なし。これでダイレクトにSFCコントローラを接続すればよいはずだ。
ジャジャガッチ | FPGA | 20:05 | comments(0) | trackbacks(0) |

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) |

Model Sim-Alteraの使い方

 今日もFPGA。さあ、今日は適当に回路を作ってシミュレーションしてみよう。
DE0についてきたModel Sim-Alteraを使ってシミュレーションする。
まず、Model Simでソースファイルを書く。

module notclk(clk,a,q);
input clk,a;
reg r;
output q;

always @(posedge clk) begin
r <= !a;
end
assign q = r;
endmodule

順序回路を使うときはreg型を使うらしい。(※8/31追記 reg q;というのを最初の方に入れとけばreg rを使わなくてもよいらしい)
入力端子clkにはクロックを入れ、クロックの立ち上がりでレジスタに入力端子aを反転したものを入れ、それを出力する、という回路になっている。
では、シミュレーション用のモジュールsimを定義する。

module notclk(clk,a,q);
input clk,a;
reg r;
output q;

always @(posedge clk) begin
r <= !a;
end
assign q = r;
endmodule

`timescale 1ps/1ps
module sim;//シミュレーション用のモジュール
reg a,clk;//入力はreg型
wire q;//出力はwire型
parameter STEP = 100000;//1STEP = 100ns C言語でいう#defineか。
notclk notclk0(.clk(clk),.a(a),.q(q));
initial begin
  a = 0;
  #STEP a = 1;//#STEP => #100000って書いてもok。
end
always begin//クロックの生成
  clk = 0;
  #(STEP/100);
  clk = 1;
  #(STEP/100);
end
endmodule

では、コンパイルしよう。

コンパイルできたらいよいよシミュレーション開始。

出てきたダイアログでシミュレーションしたいモジュールを選択します。
View→Waveで波形を見ていきます。Objectsウィンドウから見たい変数をドラッグアンドドロップします。


Runします。ここらへんを適当にいじろう。右から3番目を押してすぐに一番右を押せば大分時間が進みます。

波形が出てきた。

赤いのは出力が不定ということだと思う。-(マイナス)を押すとズームアウトします。+はズームイン。マイナスを適当に押してやるとそれっぽい波形が見えます。

入力が0から1に変化していて、その次のクロックの立ち上がりでちゃんと出力が反転していることが見えます。よかったよかった。
ジャジャガッチ | FPGA | 23:19 | comments(0) | trackbacks(0) |

FPGA:回路図を確認する

 HDLの記述だけでは味気ない、実際に回路を見たいというときは
Tool→Netlist Viewer→RTL Viewer
を使えばよいらしい。試しにNAND回路を記述してみた。

module tmp(a,b,c);
input a,b;
output c;
wire w;
MYAND AND0(.a(a),.b(b),.c(w));
MYNOT NOT0(.a(w),.c(c));
endmodule

module MYNOT(a,c);
input a;
output c;
assign c = !a;
endmodule

module MYAND(a,b,c);
input a,b;
output c;
assign c = a & b;
endmodule

こいつをRTL Viewerで見ると



こういうのが見れます。モジュールのとこをダブルクリックするとちゃんとANDゲートなども見えます。
ジャジャガッチ | FPGA | 21:15 | comments(0) | trackbacks(0) |

FPGA:色々試してみる

Verilog HDLの記述を色々試してみる。昨日試した

module tmp(a,b,c);
input a,b;
output c;
assign c = a & b;
endmodule

これからスタート。モジュールを増やしてみる。

module tmp(a,b,c);
input a,b;
output c;
assign c = a & b;
endmodule

module test(A,B,C);
input A,B;
output C;
add add0(.a(A),.b(B),.c(C));
endmodule


無事コンパイルできた。モジュールを呼び出してみる。
module tmp(a,b,c);
input a,b;
output c;
assign c = a & b;
endmodule

module add(a,b,c);
input a,b;
output c;
assign c = a + b;
endmodule

module test(A,B,C);
input A,B;
output C;
add add0(.a(A),.b(B),.c(C));
endmodule


これもコンパイルは通った。順番を入れ替えてみる。

module tmp(a,b,c);
input a,b;
output c;
assign c = a & b;
endmodule

module test(A,B,C);
input A,B;
output C;
add add0(.a(A),.b(B),.c(C));
endmodule

module add(a,b,c);
input a,b;
output c;
assign c = a + b;
endmodule

C言語的な頭だとtestの前にaddを記述しておかないとエラーになる気がしたのだが、問題なくコンパイルできた。

ちなみにコンパイルはCtrl + Lでも出来ます。

ジャジャガッチ | FPGA | 20:48 | comments(0) | trackbacks(0) |

FPGA再挑戦!

 今日からFPGAに再挑戦します。
大分前に購入したDE0を使います。
まず周辺ソフトウェアをインストール(QuartusII)。
開発ソフトは付属のDVDから無事インストールできたが、ドライバ(USB Blaster)のインストールで問題が。
Windows 7に対応していないらしい。

QuartusII 10.0付属のドライバはWindows 7に対応しているらしいのでドライバのみダウンロードしてくる。
これでさしあたって必要なソフトは準備出来た。

では、簡単な回路を作ってみよう。
File→New Project Wizard
で新たなプロジェクトを作成する。
プロジェクト名はtmpにした。
デバイスはCycloneIIIのEP3C16F484C6を選択。
あとは全部すっ飛ばした。

左上のアイコンをクリックして新しいファイルを作成する。

Verilog HDLファイルを作成する。
次のように入力する。

module tmp(a,b,c);
input a,b;
output c;
assign c = a & b;
endmodule

ただのand回路だ。モジュールの名前はプロジェクト名に一致させないといけないみたい。
右の方のアイコンでコンパイルできる。

次に実際のデバイスとのピン対応を設定する。


マニュアルにどのピンがどういう役割を持っているか書いてあるのでそれを見て設定する。
今回はH2⇔a、G3⇔b、J1⇔cと対応させる。H2、G3がプッシュボタン、J1がLEDになっている。
NodeNameとLocationを対応させる。そしたら再コンパイル。次にデバイスに回路を構築する。

Hardware Setupでデバイスを選択して、Startを押せばデバイスに回路が構築される。
ジャジャガッチ | FPGA | 20:48 | comments(0) | trackbacks(0) |

FPGAでディスプレイに絵を描く

 FPGAでアナログ映像端子であるVGAに信号を送って絵を表示する回路に挑戦した。

下図みたいな信号を生成する回路を作った。



赤丸で囲ったところが水平の同期信号。各区切りがディスプレイの横一列に対応する。


これをズームアウトすると、垂直方向の同期信号も見える。これで1画面の描画が終わる。

ディスプレイの左上から右へ描画していくからその間にRGBの値を信号として与えれば

描画できる。RGBの波形を見ると0000と1111が交互に並んでいるから

左半分黒、右半分白で表示される。意外と簡単に出来た。
ジャジャガッチ | FPGA | 20:00 | comments(0) | trackbacks(0) |

FPGA

 本格的にFPGAで遊び始めたのでFPGAカテゴリを作った。

最初にFPGAとはどんなものか説明しておく。

今世の中で幅をきかせているのはデジタル回路。

値は0か1しかなくて、例えばNOT回路は入力を反転する。

AND回路なら二つの入力が1のときだけ出力が1になる。

こういう回路を組み合わせて複雑な回路を作ると面白いことが出来る。例えば

入力→出力と書くとして

(0,0)→(0,0)
(0,1)→(0,1)
(1,0)→(0,1)
(1,1)→(1,0)

という関係を持つようにAND回路とかNOT回路とかを組み合わせられれば

その回路は二進数の足し算回路になる。

で、FPGAはPCを通して任意のデジタル回路を焼けるICのこと。

PCに設計図を書くだけだからハンダ付けしなくてもいいし、何度でも焼けるから

失敗しても大丈夫。

すばらしい。

もっとすばらしいのは簡単に複雑な回路を作れること。

AND回路とかをグラフィカルに配置して設計することも出来るけど、

コードを書くことによっても設計できる。

例えば

入力はAとBで、出力はCとD。
これこれこういう条件のときCは1でDは0になる。
・・・

みたいに得たい結果を書いていけば自動的にそれを実現する回路を生成してくれる。

FPGAを始めてまだあまり経っていない僕でさえ50行くらいコードを書けば、




こういうとっても複雑な回路を作れます。

記述言語はVHDLとVerilog HDLがよく知られていて、VHDLから入ったけど

Verilog HDLに変えました。C言語ライクな言語らしいので。

ジャジャガッチ | FPGA | 19:52 | comments(0) | trackbacks(0) |
1/1PAGES | |

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