今日FPGAで学んだこと(5)
この前のverilogのプログラムについて、
ちょっと細かく説明
■verilogについて
・シミュレーターでしかうごかないもの
・論理合成できて、シミュレーターでも動くもの
がある。
for、whileは、シミュレーターのみ
■信号について
・wireとregがある
wire:値を保持しない
reg:値を保持するか、always,function内の信号
【書式】
wire [7:0] A,B;
reg [3:0] C;
・入出力信号(input,output)は、wireを省略している
【書式】
input [2:0] BUTTON;
output LEDG0; // []がないと、1ビット
■値・数値
・0,1,Z(ハイインピーダンス),X(不定値)の4種類
・<ビット幅>'<基数><数値>で表現する
例:1'b1 1ビット2進数で1
基数:b(2進),o(8進),d(10進),h(16進)
省略すると、32ビット10進
■演算子
・算術:割り算関係は重い
・シフト
・符号
・関係
・論理
・ビット
A=4'b0011,B=4'b1100のとき
A & B = 0000だが、 A&&B = 1
・リダクション
input [2:0] BUTTON のような、複数ビットに対して、
いっぺんに&や|をとる
&BUTTON = BUTTON[2] & BUTTON[1] & BUTTON[0]
Verilogのみ(VHDLにはない)
・条件(? :)
sel = cond?A:B
(condは条件)
・連結演算子
異なる信号を1つにする
FLAG[2:0]={A,B,C}
■組み合わせ回路
・assign文(継続代入文)
順序に関係なく評価する
・function文
ifやcaseがかける
組み合わせ回路で構成
ローカル変数はreg
assignは使わない
【書式】
function 出力レンジ 名前;
input 入力信号;
begin
:
いろいろかく
:
end
end function
※出力レンジ1ビットは省略
・if文:function,always内で記述
【書式】
if(a) begin
ステートメント1;
ステートメント2;
end else begin
ステートメント3;
ステートメント4;
end
begin,endを書かないと、1ステートメントだけ実行
・case(A)
casex(A)だと、ドントケアが書ける
【書式】
case(A)
条件:ステートメント;
:
(以下、条件:ステートメント;続く)
:
endcase
・always@()構文:組み合わせ回路編
【書式】
reg out; // 使う変数をreg宣言
always@(a or b) begin
if (a)
out = b;
else
out = ~b;
end
※(a or b)の部分:センシティブリスト
→変化があるとき
■順序回路
・フリップフロップがはいったもの
→記憶できる
→always@()で記述
・always@()構文:順序回路編
【書式】
always(posedge CLK or negedge RESTn) begin
:
:
end
※posedge:立ち上がり negedge:立下り
順序回路のalwaysのセンシビリティリストは
(posedge,negedgeを使って)orで2つしかつなげられない
→組み合わせ回路のalways@のセンシビリティリストは、
a or b or c・・・と、使う分だけ書く(書ける)
<= ノンブロッキング代入 =ブロッキング代入
ノンブロッキング代入は、同時に起こる
ブロッキングは順番に
この前のverilogのプログラムについて、
ちょっと細かく説明
■verilogについて
・シミュレーターでしかうごかないもの
・論理合成できて、シミュレーターでも動くもの
がある。
for、whileは、シミュレーターのみ
■信号について
・wireとregがある
wire:値を保持しない
reg:値を保持するか、always,function内の信号
【書式】
wire [7:0] A,B;
reg [3:0] C;
・入出力信号(input,output)は、wireを省略している
【書式】
input [2:0] BUTTON;
output LEDG0; // []がないと、1ビット
■値・数値
・0,1,Z(ハイインピーダンス),X(不定値)の4種類
・<ビット幅>'<基数><数値>で表現する
例:1'b1 1ビット2進数で1
基数:b(2進),o(8進),d(10進),h(16進)
省略すると、32ビット10進
■演算子
・算術:割り算関係は重い
・シフト
・符号
・関係
・論理
・ビット
A=4'b0011,B=4'b1100のとき
A & B = 0000だが、 A&&B = 1
・リダクション
input [2:0] BUTTON のような、複数ビットに対して、
いっぺんに&や|をとる
&BUTTON = BUTTON[2] & BUTTON[1] & BUTTON[0]
Verilogのみ(VHDLにはない)
・条件(? :)
sel = cond?A:B
(condは条件)
・連結演算子
異なる信号を1つにする
FLAG[2:0]={A,B,C}
■組み合わせ回路
・assign文(継続代入文)
順序に関係なく評価する
・function文
ifやcaseがかける
組み合わせ回路で構成
ローカル変数はreg
assignは使わない
【書式】
function 出力レンジ 名前;
input 入力信号;
begin
:
いろいろかく
:
end
end function
※出力レンジ1ビットは省略
・if文:function,always内で記述
【書式】
if(a) begin
ステートメント1;
ステートメント2;
end else begin
ステートメント3;
ステートメント4;
end
begin,endを書かないと、1ステートメントだけ実行
・case(A)
casex(A)だと、ドントケアが書ける
【書式】
case(A)
条件:ステートメント;
:
(以下、条件:ステートメント;続く)
:
endcase
・always@()構文:組み合わせ回路編
【書式】
reg out; // 使う変数をreg宣言
always@(a or b) begin
if (a)
out = b;
else
out = ~b;
end
※(a or b)の部分:センシティブリスト
→変化があるとき
■順序回路
・フリップフロップがはいったもの
→記憶できる
→always@()で記述
・always@()構文:順序回路編
【書式】
always(posedge CLK or negedge RESTn) begin
:
:
end
※posedge:立ち上がり negedge:立下り
順序回路のalwaysのセンシビリティリストは
(posedge,negedgeを使って)orで2つしかつなげられない
→組み合わせ回路のalways@のセンシビリティリストは、
a or b or c・・・と、使う分だけ書く(書ける)
<= ノンブロッキング代入 =ブロッキング代入
ノンブロッキング代入は、同時に起こる
ブロッキングは順番に