CPLD

概要

  • ハードウェア記述言語
    • 記述に際しても「ハードウェアを設計している」意識が大切(逐次的でないことがある)

参考

テンプレ

// moduleのポートを設定(PORTはバスでもシグナルでもよい)
module MODULE_NAME (
    PORT1, // in, desc.
    PORT2, // in, desc.
    PORT3 // out, desc.
);

// in / outの設定。ここでバスを明示しなければならない
input selector1;
input A;
input B
output [5:0] data;

// output(wire)とフリップフロップ(reg)の定義。バスを明示しなければならない。
wire [5:0] output; // 本当は書かなくてもいい。outputがregの場合だけ記述しなければならない。
reg Q;
reg [7:0] COUNTER;

[expression] 

endmodule

expression

NET

  • 一つの回路のこと
    • assign: 配線を接続し、NETを作成する。
    • always: センシティビリティリストにトリガーされる記述、NETを作成する

代入

  • ブロッキング代入「=」とノンブロッキング代入「<=」の二通りの代入演算子が存在
assgin O = I1 & I2; // assign文の後で
Q <= D; // always文の中で
  • 動作の差
初期値を X が 1, A が 5, B が 0 とする。
ノンブロッキング代入
X <= A;
B <= X;
X が 5, A が 5, B が 1 となる。
ブロッキング代入 
X = A;
B = X;
X が 5, A が 5, B が 5 となる。

以下の手続き代入文では、A = B の後に B = A が実行されるために、A と B はともに B の値として最終的に同一値を持ちます。ノンブロッキング手続き代入文では、右辺の値が確定してから左辺への代入が実行されるために、AとB の値はスワップします。

reg A, B;

always @(posedge CLK) begin
  A = B;  // ブロッキング代入
  B = A;
end

always @(posedge CLK) begin
  A <= B;  // ノンブロッキング代入
  B <= A;
end

数値

3'b10 // 3bit 3 (3bit定数:2進数で3)
4'o10 // 4bit 8 (4bit定数:8進数で8)
8'h80 // 8bit 128 (8bit定数:16進数で80)
8'd128 // 8bit 128 (8bit定数:10進数で128)
8'bZ // ハイインピーダンス
8'bX // 不定

always

  • sensitivity listを常に監視し、満たされたらexpressionを実行する
  • すべての always 内の文は同時処理であるため記述の順番による処理の時間差はない
always @([sensitivity list]) begin
    [expression]
end
  • conditionには立ち上がりエッジや立下りエッジが入ることが多い。
// 立ち上がり
always@ (posedge CLK) begin
    Q <= D;
end
// 立ち下がり
always@ (negedge CLK) begin
    Q <= D;
end

if

if ([condition1]) begin
    [expression1]
end else begin
    [expression2]
end

シグナルのバス化

Q{3:0} <= {Q{2:0}, D};

assign

  • wireの代入に使う(regの代入には<=)
assign O[7:0] = A[7:0] + 8'd1;

トラブルシューティング

Anonymous ports

  • port設定の引数の最後にカンマが付いていると起きる。

Multi-source in Unit

  • 別のalways文の右辺に同じものがあるから?なんで起きるのか理解できていない。

コーディングルール

あと、これは、好みだと思いますが ・モジュールのI/O は大文字、内部reg, wire宣言は小文字 とするとソースが見やすくなると思います  (キー入力が楽になりますよ、たぶん) ・内部reg, wire宣言は以下のルールを適用する  wire xxxx_sig ; /* 後ろに"_sig"を付ける */  reg xxxx_reg ; /* 後ろに"_reg"を付ける */ ex) wire SPI_DATA_READY;  // SPIモジュールデータ受信完了        ↓ wire spi_data_ready_sig ; /* SPIモジュールデータ受信完了 */


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS