VHDLのFF記述について

このQ&Aのポイント
  • VHDLのFFの基本的な使い方と、信号の遅延についての質問です。
  • 入力AはA_inという信号を経由してFFの出力Xが出力されますが、入力Bは直接FFの出力Yにつながっているためです。
  • 初心者の質問ですが、入力Aと入力Bの違いについて教えていただけませんか?
回答を見る
  • ベストアンサー

VHDLのFF記述について

お世話になります。VHDL同期FFの基本的な使い方で、今一イメージができない部分がありますのでご教示いただけたら有難いです。 次のようなVHDL記述で、 entity test is port (    CLK : in  std_logic;    xRST : in  std_logic;    A  : in std_logic;    B  : in std_logic;    X  : out std_logic;    Y  : out std_logic ); end; architecture RTL of test is signal  A_in: std_logic; signal  A_out: std_logic; signal  B_out: std_logic; begin    A_in <= A ;    X <= A_out;    Y <= B_out; process (CLK, xRST ) begin    if(xRST = '0')then       A_out <= '0';       B_out <= '0';    elsif (CLK' event and CLK ='1') then       A_out <= A_in;       B_out <= B;    end if;  end process; end; ・入力Aは一度A_inというsignalを通ってFF出力していて、この時出力XはAが1クロック分遅れて出力されます。 ・入力BはそのままFF出力しているのですが、出力YはAと同期して出力されます。 B-->Yのような場合、はFFがかからないのがなぜなのか、Aとの違いを教えていただけませんでしょうか? 初歩的な質問で恐縮ですが宜しくお願いいたします。

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

  • ベストアンサー
  • mahaze
  • ベストアンサー率29% (217/731)
回答No.1

私はVHDLを使わなくなって久しいですが、回答も付きにくそうなんでとりあえず。 シミュレーションでの結果でしょうか? A,B,CLKをどういうタイミングで入力してますか? >出力YはAと同期して出力されます。 YとAが同期するはずはありません。この記述内では関連性はありませんから。 入力タイミングがわからないので想像ですが、 A,B,CLKを全部同じタイミングで入力してないですか? CLKの立ち上がりでラッチするので、同じタイミングだとどっちに転ぶかわかりません。 CLKの立ち上りとA,B入力のタイミングはずらしてください。そうしないと正確な結果は出てきません。

matsat
質問者

お礼

早速の回答ありがとうございました。おっしゃるとおり、クロックと入力を同じタイミングでシミュレーションしていた為におかしかったみたいです。少しだけタイミングをずらした時に思い通りの動作になりました。実際の回路で考えれば当たり前のことなのに頭が回りませんでした。助かりました。本当にありがとうございました。

関連するQ&A

  • カウントダウン 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記述の回路設計「加算減算器」

    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;

  • VHDLについて教えてください

    VHDLついてお教えください。 今、VHDLの勉強しているのですがsignal文とvariable文の違いが良く分かりません。 以下の記述で(1)の結果なぜこのようになるのか分かりません。 ご存知の方、ご教授願います。 例(1) process(A, B, C, D) begin D < = A; X < = B + D; D < = C; Y < = B + D; end process; 結果 X < = B + C; Y < = B + C; 例(2) process(A, B, C) variable D : std_logic_vector( 3 downto 0 ); begin D := A; X < = B + D; D := C; Y < = B + D; end process; 結果 X < = B + A; Y < = B + C;

  • VHDLについてですが何がおかしいのでしょう?

    VHDLについてですが何がおかしいのでしょう? 下記をSynthesize実行すると「 Line 22. rol can not have such operands in this context.」という表示がでます。どういうことなのでしょうか?ソースは本のサンプルどおりのはずなのですが・・。(VHDLとCPLDによるロジック設計入門)という本の126Pのリスト6.12です。 CPLDでザイリンクスWebpackV6.31を使っています。 ===================== library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; use IEEE.NUMERIC_STD.ALL; -- Uncomment the following lines to use the declarations that are -- provided for instantiating Xilinx primitive components. --library UNISIM; --use UNISIM.VComponents.all; entity shift2 is port( SW : in unsigned(1 to 4); SW2,SW3 : in std_logic; LED : out unsigned(5 downto 2)); end shift2; architecture RTL of shift2 is signal S : integer; begin S <= CONV_INTEGER( not (SW3 & SW2)); LED <= SW rol S; ------------------------------Line22 end RTL;

  • VHDL CPLD ISEパルス立上り・立下り検出

    前略 ・VHDLの初心者です。ザイリンクスの ISE13.1とCPLD(XC9572XL)を使ってLEDのON/OFFをさせようとしています。 外部クロック(1KHz)をカウントして1000回でLEDを ON→OFF、OFF→ON を繰り返すようにしています。 外部クロック立上りのタイミングで Clk' event and Clk = '1' によりパルスをカウントするとは 論理合成もできてターゲットボード上でLEDのON/OFFを確認できています。 <質問>  外部パルスの立下りもカウントするようにしたいのですが、どのようなVHDL コードをかけばよいのでしょうか おしえてください。  下記のように if(( Clk' event and Clk = '1') or (Clk' event and Clk = '0')) とすると Syntax チェックはOKなのですが 論理合成(Synthesize XST)をおこなうと unsupported Clock statement の論理合成エラーがでてしまいます。 以下 VHDLソースコード //----------------------------- architecture RTL of Clk_Led_OnOff is Signal Count: Integer range 0 to 2000; Signal Led_signal : Std_Logic; begin process(Clk) begin if(( Clk' event and Clk = '1') or (Clk' event and Clk = '0')) -- if( Clk' event and Clk = '1') then Count <= Count + 1; --インクリメント if(Count < 1000)then Led_Signal <= '0'; else Led_Signal <= '1'; --OFF end if; if(Count >= 2000)then Count <= 0; end if; end if; Led <= Led_signal; end process; end RTL; 以上、よろしくお願いします

  • 記述の仕方について(VHDL)

    VHDLの記述で、同一の出力に入力の条件に対応した複数の値を代入することは出来ないのでしょうか? 7セグメントを光らせるプログラムなのですが、1つは1)時計回りにセグメントが光っていくもの、もうひとつは2)反時計回りに光っていくものとなっています。これをif文で条件をつけて、Aの場合は1)のprocessをBの場合には2)のをという感じで書いてみたんですが、FITをしようとするとエラーが出てしまいます。出力はportで「SEG」と定義しています。 プログラムの一部: process 1) begin  case 1) is when ・・・ => SEG <= ・・・   end case end process process 2) begin case 2) is when ・・・ => SEG <= ・・・ ・・・

  • Verilog-HDLのFF記述について

    先程アップしたのは、図が変になってしまいました。 改めて質問します。 1つのFF(非同期リセット)をVerilog-HDLで記述すると、以下のように記述出来ますよね? always @ ( posedge CLK or negedge RESET ) begin if ( !RESET ) begin Q <= 1'b0 ; xQ <= 1'b1 ; end else begin Q <= D ; xQ <= ~D ; end end この1つのFFをalways文を2つ使って記述出来るんですか? ご回答宜しくお願いします。

  • VHDLの記述で、わからない記述があり困っています

    VHDLの勉強を始めて数日になるのですが、ある参考書に載っている記述が理解できませんので、質問させていただきました。 「基本クロックに同期してleをトグルする」という説明の後に、下記の様な 記述がありました(信号名などはオリジナルとは変えてます)。 一番不明なのは、”latch”信号です。 2~5行めを簡単に説明すると、”clk”の立ち上がりで、in1とlatchが 0であった場合、leが反転し、latchが1になるということだと思いますが、 いまいち理解が出来ません。 6、7行目をみてもさっぱりで、in1とlatchが1だったら latchが1になる。 これは、いったい何を意味しているのでしょうか。 ブロック図的なものでもあればわかりやすいのかもしれませんが、 そのあたりの説明は一切載ってませんので、どう考えてよいのかがわ からないのです。 はじめは、T型フリップフロップのイメージかと思ったのですが、 どうも違うようです。 このlatch信号の意味をどなたかわかる方がいらっしゃいましたら ご教授願いたいのですが、よろしくお願いします。    process (clk)     if clk'event and clk = '1' then       if in1 = '0' and latch ='0' then        le <= not le;        latch <='1';       elsif in1 = '1' and latch = '1' then        latch <= '0';       elsif in1 = '0' and latch = '1' then        latch <= '1';       end if;     end process;

  • 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 立ち上がり 立ち下がり両方検出

    VHDLで回路を記述する際に、立ち上がりと立ち下がりの両方を検出する際にはどうすればよいでしょうか? 立ち上がりだけなら if CLK_2M'event and CLK_2M='1' then とすればよいですが、立ち上がりと立ち下がりとなると、 if CLK_2M'event and CLK_2M='0' then elsif CLK_2M'event and CLK_2M='1' then と記述すると、うまくSynthesizeしてくれません。 また、 if CLK_2M'event then if CLK_2M='1' then elsif CLK_2M='0' then と書いてもエラーを出してしまいます。 エラーの内容は1番目のコードの場合はCLK_2Mに関係無い内容ですが、念のため乗せておきます。 1番目の場合 Signal ANSOUT<0> cannot be synthesized, bad synchronous description. ちなみにANSOUTというのはLEDに出力を出すためのsignalです signal ANSOUT : std_logic_vector(7 downto 0); LEDOUT <= ANSOUT; -- LEDOUTはLED出力用PIN 2番目の場合 line 39: unsupported Clock statement.

専門家に質問してみよう