• ベストアンサー

FPGA > ポート downtoを使う

FPGAの勉強を始めています。 http://www.kumikomi.net/archives/2009/07/verilog_hdl_1.php 上記のサイトの「(2) エンティティ」のポート宣言の説明のところに port(a, b: in std_logic_vector (3 downto 0); ...略... ) のような部分の"downto"に関して 「downtoは,降順で範囲を指定する予約語です.昇順の場合toを 使います.実際の設計ではもっぱら降順を使います.」 とあります。 downtoをよく使う理由というのはあるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

信号を束ねて表記する際(PortやBus)には、MSBを先に、LSBを後に表記するからです。 たとえば4ビットバスの場合は[3:0]、16ビット幅の場合は[15:0]のように表記します。 この書き方に合わせるために、downtoを使う訳ですね。 別に「必ずしもdowntoで書かなければならない」という訳ではありませんが、他のモジュールや、FPGAに接続するROM/RAM等が降順で記載されているのに自分で作成するコードを昇順で書いた場合、デバッグが面倒ですし、レジスタの取り違い等のミスの原因となります。 そのため、現実問題として昇順で記載することはほぼない、と思っておけば間違いないかと思われます。 以上、ご参考まで。

flex1101
質問者

お礼

ご回答ありがとうございます。 こういう理由でdowntoを使うのですね。 なぜ、というのがわかり納得できました これからdowntoを使っていきます。

関連するQ&A

  • FPGAのシミュレーションに関して

    いつもお世話になっています。 以下の開発環境におけるFPGAのロジックのシミュレーションに疑問があるので質問します。 環境 modelsim Altera starter edition 質問概要 10進カウンターを作ってクロックの立ち上がりで動作するように作ったのに立下りで動作するのは何故か。(10進数をカウンター内部変数TQで数え上げqに出力しているがTQはクロックの立ち上がりで動いているが、qは立下りで動いている様に見える) 10進カウンターの内部構造 ソース概要 ・内部変数TQが0から始まり、+1していき10回数えたら0から桁上がりの変数cを1にしてやりなおし。 ・計算中の内部変数TQで7SEG LEDを駆動させるためのアウトプットqがある。 ・リセットは0の時リセットされる。 VHDLのソースを載せます。 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity COUNT10 is port(RESET,CLK : in std_logic; Q: out std_logic_vector(3 downto 0); C: out std_logic ); end COUNT10; architecture RTL of COUNT10 is signal TQ : std_logic_vector(3 downto 0); begin process (RESET,CLK ) begin if(RESET='0') then TQ <= "0000"; C<='0'; elsif(CLK 'event and CLK ='1') then if(TQ="1001") then TQ <= "0000"; C <='1'; elsif(TQ="0000") then C <='0'; TQ <= TQ + '1'; else TQ <= TQ + '1'; end if; end if; Q<=TQ; end process; end RTL; シミュレーション結果 クロックを数え上げた内部変数TQがqへ値を渡す仕組みになっています。 これがたち下がりの時に行われている様に見える。

  • VHDLに関して

    複数ビットの信号を宣言する際に std_logic_vector を用いますが、その後のdowntoやtoの意味がよく分かりません。 下の画像だとdowntoですが、toでは何故ダメなのでしょうか? また、selはstd_logicでいいと思うのですが何故複数ビットの扱いなのでしょうか? すみませんが、初心者なのでできるだけ分かりやすく説明していただけると幸いです。 宜しくお願いします。

  • VHDL記述の回路設計「加算減算器」

    VHDL記述の回路を設計というかプログラミングをしたのですが、出力が正しくありませんでした。内容は「加算・減算器」です。今回はオーバーフローを(考えてもいいのですが)考えないことにします。 記述内容は以下のようになっています。P_A で加算と減算を切り替えています。問題のボードへの出力ですが、 X_A + X_B = L_A としています。 0000 0000 0000 0001 0000 0001 0010 0000 0010 0011 0000 0011 0100 0000 0100 … という風に X_A だけを 0 に統一した場合でも正しく出力されていますが、 0000 0001 0001 0001 0001 0000 0010 0001 0011 0011 0001 0010 0100 0001 0101 0101 0001 0100 … このように、ビット同士の和の繰り上がりがきいてない感じなんですね。これって下の記述が間違ってるんでしょうか。それとも、ボード出力時のピンの当て方が間違ってるんでしょうか。詳しい方、アドバイスよろしくお願いします。 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity EX is port ( P_A : in std_logic; X_A : in std_logic_vector(3 downto 0); X_B : in std_logic_vector(3 downto 0); L_A : out std_logic_vector(3 downto 0) ); end EX; architecture STRUCTURE of EX is begin process ( X_A, X_B, P_A ) begin if P_A = '1' then L_A <= X_A + X_B; else L_A <= X_A - X_B; end if; end process; end STRUCTURE;

  • HDLのエミュレーターについて

    フリーのシュミュレーターで「Verilog-HDL」や「VHDL」を勉強中なのですが、 「Verilog-HDL」や「VHDL」でパラレルポートなんかを制御させることは可能ですか? 言い換えますと、 PCをパラレルポートなんかを使って 仮想的にFPGAデバイスとして使えるようなソフトはありますか?

  • Verilogでメモリに初期値を記憶する方法

    VHDL言語で次のようにしてRAMエリアに初期値を記憶しましたが, Verilogで同じことをinitialで行おうとしてもうまくいきません。 どうすればよいかアドバイスを下さい。 type ram_type is array (0 to 3) of std_logic_vector (7 downto 0); -- RAM : 4 Byte signal RAM : ram_type:= ("00010010", "10010001","00001111","10001001");

  • VHDLの書き方について

    教科書で signal a : std_logic_vector (3 downto 0); a <= (others => '0'); -- A というような書き方がありました。 この Aの意味は何なのでしょうか?

  • std_logic_vector のピンアサイン

    cyclone ii ボード、Quartus ii 13.0sp1 です。 port ( a, b : in std_logic_vector (15 downto 0); としたとき (1)Pin Planner でピンアサインをしないで、コンパイルするとOKです。 (2)まずa[15]にFitter Location に表示されているピンを設定して、コンパイルするとOKです。    全てをFitter LocationのようにすればOKだと思うのですが、そうすると配線が整然としません。 そこで、自由に設定できるのかな(?)と思って どういうルールで設定するべきかもわからぬままに a[15]にいろいろなPIN_xを設定してみると (3)PIN_141ならばコンパイルはOKでした。 (4)PIN_1ならばコンパイルエラーでした。 std_logic_vector (15 downto 0) の場合どのようなルールでピンアサイン するのか教えてください。

  • カウントダウン VHDL記述に困っています。

    入力側には、4Bit入力データバス、Clock、Reset 出力側には、4Bit出力データバス のカウントダウン回路のVHDLの記述にトライしているのですが、シミュレーションを行うと、期待通りの動作が得られません。 イネーブルは入れません。 参考に下記に記述を記載します。 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity CNT_DOWN is port(D_IN : in std_logic_vector(3 downto 0); CLK, RST : in std_logic; D_OUT : out std_logic_vector(3 downto 0) ); end CNT_DOWN; architecture RTL of CNT_DOWN is D_OUT_TMP <= D_OUT; begin process(RST,CLK) begin if(RST='0') then D_OUT_TMP<=(others=>'0'); elsif(CLK'event and CLK='1') then if(D_OUT_TMP=D_IN) then D_OUT_TMP <= D_OUT_TMP - '1'; end if; end if; end process; end RTL; なのですが、きちんと動きません。 アドバイス下さい。

  • VHDLのvector

    VHDLにおいて「vector(5bitとします)の全bitが'0'である場合」という条件のif文を書く場合、if(Data = "00000") then と記述する以外に方法はありませんか? ここでは Data :in std_logic_vector(4 downto 0); としています。 5bitくらいならまだいいですが、16bitなどでもひたすら'0'を羅列するしかないのでしょうか?よろしくお願いします。

  • VHDLにおける「generic」について

    VHDLの設計にて、 上位のモジュールから下位へgenericを用いて integer値を渡したいのですが、 この時に最上位のモジュールにおける信号「A」の状態をみて、 下位へ渡す integer値を切替えることは可能でしょうか。 例えば Aが '0'なら integer に 10を代入、      Aが '1'なら integer に 15を代入して下位に渡すという感じです。    やりたいことの記述イメージを書いてみました。 --Top モジュールです  ・  ・ (略)  ・ architecture component Module         <- 下位モジュールの宣言   generic(      value: integer:=10     <- generic を宣言 初期値は10      );                   ここの値を信号「A」の状態によって切り替える     port(      din : std_logic;      dout: std_logic      ); end component; signal A: std_logic;         <- 信号「A」を宣言   ・                    この値('0'、'1')を見て integer値を決める   ・ (略)   ・ 単純にif文を使えば、Aの状態によって value へ異なる値を代入することはできますか? それともgenericで一度宣言したら、その後は値を変更できないのでしょうか。 上記に示した方法でなくても、上位のモジュールで何かの値を判断し、下位に渡す generic の integer値を変更できれば構いません。 参考記述、ご紹介頂けると助かります。 説明が分かりづらいかもしれませんが、よろしくおねがいします。