VHDL ステートにとどまる時間

このQ&Aのポイント
  • VHDL初心者が質問する、VHDLのステートにとどまる時間についての疑問
  • 質問者は、detectステートにとどまる時間についての考え方に誤りがあると感じている
  • 質問者は、detectステートにとどまる時間はclk_rxの8周期分であると考えているが、実際は7周期分である
回答を見る
  • ベストアンサー

VHDL ステートにとどまる時間

FPGAの初心者です。 上級者の皆さんがNET上に掲載されているVHDLの記述例をみながら勉強中です。 Q1. when detect => if(clk_rx = '1') then if(cnt_bitwidth = 7) then cnt_bitwidth <= 0; state <= proc; else cnt_bitwidth <= cnt_bitwidth + 1; state <= state; cnt_bitwidth = 0 でdetectステートに入ります detect ステートになってから clk_rxの1発目でcnt_bitwidthが1となり clk_rxの2発目でcnt_bitwidthが2となり ・・・・(中略) clk_rxの7発目でcnt_bitwidthが7となり clk_rxの8発目でcnt_bitwidthが7になっているので procステートへ入る ・・・と理解しました。 そうすると、 detectステートにとどまる時間はclk_rx の7周期分になります。 しかし動作から考えると detectステートにとどまる時間はclk_rx の8周期分でなければならない ・・・と思われるので前述の私の理解は間違っていると思います。 間違いを教えてください。

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

  • ベストアンサー
  • TIGANS
  • ベストアンサー率35% (244/680)
回答No.1

Clk_rxの8発目でprocステートに遷移するので detectステートには8周期分いるで正しいですよ。 cnt_bitwidth が {0,1,2,3,4,5,6,7}の間、detectステートにいますよね。 疑問がある場合には、ブロッキング代入について調べるといいかも。 proc文のセンシティビティリスト記述が無いと、実はこれで正しいのかは分からなかったりするんですけどね。

Kuma2000
質問者

お礼

回答ありがとうございます。 >cnt_bitwidth が {0,1,2,3,4,5,6,7}の間、detectステートにいますよね。 cnt_bitwidthが0のときとは detectステートに入ってから、clk_rxの1発目が入るまでの期間のことでしょうか? なお detectステートに入るのはclk(50MHz)のタイミングであり、 clk_rx(153.6KHz)との時間差は不定です。

その他の回答 (1)

  • TIGANS
  • ベストアンサー率35% (244/680)
回答No.2

>detectステートに入るのはclk(50MHz)のタイミングであり、 >clk_rx(153.6KHz)との時間差は不定です。 それは質問時に、すでに判っていた情報ですよね? 申し訳ないですが、後出しで出された情報に対して回答するのは キリが無いので回答するつもりはありませんです。 もし必要であれば、(たんなる興味本位で質問したのでなければ) 自分の希望する回答を得るのに必要十分な情報を提示して再質問してください。

関連する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の勉強を始めて数日になるのですが、ある参考書に載っている記述が理解できませんので、質問させていただきました。 「基本クロックに同期して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;

  • 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.

  • 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の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との違いを教えていただけませんでしょうか? 初歩的な質問で恐縮ですが宜しくお願いいたします。

  • VBA 時間の抜き出しが上手く処理できない

    時間の抜き出しをするのに下記のコードを候補に挙げましたが、 「'コロンが2個の場合 (時:分:秒)」の場合は上手く処理できますが 「'コロンが1個の場合 (分:秒)」の数値が上手く処理できません。 ’----------------------------------------------------------------------- Option Explicit Sub コロンの数を数える() Dim i As Long, cnt As Long, n As Variant For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row cnt = 0 '←cntをリセット Do n = InStr(n + 1, Cells(i, "A"), ":") If n = 0 Then Exit Do Else cnt = cnt + 1 End If Loop If cnt < 1 Then MsgBox "[:]がありません。" '←cntが1未満のときにメッセージを発出します。 End Else Cells(i, "B").Value = cnt End If Next End Sub Sub 時間抜き出し() Dim i As Long, cnt As Long Dim n As Single For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row n = InStr(n + 1, Cells(i, "A"), ":") 'コロン「:」の位置を特定する If Cells(i, "B") = 1 Then 'コロンが1個の場合 (分:秒) Cells(i, "C").NumberFormatLocal = "h:mm:ss" If Mid(Cells(i, "A"), n - 2, 1) = " " Or Mid(Cells(i, "A"), n - 2, 1) = "(" Then '10分以下の場合 Cells(i, "C") = Mid(Cells(i, "A"), n - 1, 4) Cells(i, "C") = "0:" & Cells(i, "C") Else '10分以上 Cells(i, "C") = Mid(Cells(i, "A"), n - 2, 5) Cells(i, "C") = "0:" & Cells(i, "C") End If Else 'コロンが2個の場合 (時:分:秒) Cells(i, "C").NumberFormatLocal = "h:mm:ss" Cells(i, "c") = Mid(Cells(i, "A"), n - 1, 7) End If n = 0 Next End Sub

  • 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へ値を渡す仕組みになっています。 これがたち下がりの時に行われている様に見える。

  • RTLの書き方について 非同期リセット

    http://www.asahi-kasei.co.jp/akm/japanese/product/ak4114/ak4114_f04j.pdf 30ページ目 Figure32 Mode4,6タイミング に書かれているLRCKとBICKの関係をつかってクロックの数をカウントしていくカウンタをVHDLで作りたいのですが、リセットの部分でわからないことがあり、質問させて頂きます。 【実現したい回路】 カウンタはクロックの立下りでカウント。LRCK=1となったところでカウンタを0に戻したい。方法として自分で考えたのは、LRCK=1となった時にフラグを立ててそれによって非同期リセットをかけようと考えたのですが、下記のRTLではシミュレーションは出来ても論理合成でエラーとなってしまい記述方法に問題があるようです。そもそもこのフラグを立てる方法が間違っているなどやり方のアドバイスありましたらよろしくお願いします。 【前半略】 architecture RTL of Counter is signal CNT_REG : std_logic_vector(2 downto 0); signal FLG_REG : std_logic; begin process (BICK,RST,FLG_REG) begin if RST ='0' then CNT_REG <= (others => '0'); elsif FLG_REG='1' then CNT_REG <= (others => '0'); elsif BICK'event and BICK='0' then CNT_REG <= CNT_REG + '1'; end if; end process; CNT <= CNT_REG; process (BICK,LRCK) begin if LRCK'event and LRCK='0' then FLG_REG <= '1'; else FLG_REG <= '0'; end if; end process; end RTL;

  • Verilog-HDLによる設計において

    現在Z8085のCPUを設計しており、テンポラリレジスタにラッチする部分でなかなか上手くいきませんので質問させていただきます。 always文を使用したステートマシンにより制御しようとしているのですが次のようなWarningが出ます。 Warning: Latch IR[0]$latch has unsafe behavior Warning: Latch IR[1]$latch has unsafe behavior            : Warning: Latch IR[7]$latch has unsafe behavior Warning: Latch TMP1[0]$latch has unsafe behavior Warning: Latch TMP1[1]$latch has unsafe behavior            : Warning: Latch TMP1[7]$latch has unsafe behavior Warning: Latch TMP2[0]$latch has unsafe behavior Warning: Latch TMP2[1]$latch has unsafe behavior            : Warning: Latch TMP2[7]$latch has unsafe behavior Warning: Latch NEXT_STATE[0]$latch has unsafe behavior Warning: Latch NEXT_STATE[1]$latch has unsafe behavior <ソース> module CPU_TMP( CLK, nRST, FROM_DCD, IR, TMP1, TMP2, STATE, NEXT_STATE ); input CLK;//クロック input nRST;//リセット input [7:0] FROM_DCD;//入力命令 output [7:0] IR;//命令レジスタ output [7:0] TMP1;//テンポラリレジスタ1 output [7:0] TMP2;//テンポラリレジスタ2 output [1:0] STATE;//現在のステート output [1:0] NEXT_STATE;//次のステート reg [7:0] IR; reg [7:0] TMP1; reg [7:0] TMP2; reg [1:0] STATE; reg [1:0] NEXT_STATE; //状態 parameter S0 = 2'b00; parameter S1 = 2'b01; parameter S2 = 2'b10; parameter SD = 2'b11; //命令 parameter INRA = 8'h11; parameter MVIA = 8'h22; parameter JMP = 8'h33; always @( posedge CLK ) begin     if( nRST == 0 )       STATE <= SD;     else       STATE <= NEXT_STATE; end always @( STATE ) begin    case( STATE )      SD : begin            IR <= 0;            TMP1 <= 0;            TMP2 <= 0;            NEXT_STATE <= S0;          end      S0 : begin            IR <= FROM_DCD;            case( FROM_DCD )              INRA : NEXT_STATE <= S0;              MVIA : NEXT_STATE <= S1;              JMP : NEXT_STATE <= S2;            endcase          end      S1 : begin              TMP1 <= FROM_DCD;              NEXT_STATE <= S0;          end      S2 : begin              TMP2 <= FROM_DCD;              NEXT_STATE <= S0;          end endcase end endmodule どのようにしたらこのWarningを消すことができるでしょうか。

  • 最終行がわからない場合

    エクセルです。 ・最終行は毎回違ってくるので Cells(Rows.Count, "A").End(xlUp).Row で取得したいです。 ・今は最終行が51行という前提で作業をしています。 ・1行目にはタイトルが入っています。 ・2行目以降には文字が入っています。  今回はテストのため数字を入れました。 最終行が51の場合は ************************************************ Sub test1() Dim i As Long Dim cnt As Long For i = 1 To 10 Call test2 Next End Sub -------------------- Sub test2() Dim str As String If cnt = 0 Or cnt = 42 Then cnt = 2 ElseIf cnt = 2 Then cnt = cnt + 10 ElseIf cnt = 12 Then cnt = cnt + 10 ElseIf cnt = 22 Then cnt = cnt + 10 ElseIf cnt = 32 Then cnt = cnt + 10 End If With Sheets("Sheet1") For myRow = cnt To cnt + 9 str = str & "," & .Cells(myRow, 1) Next myRow End With Debug.Print str End Sub ************************************************ このような方法で、str に10個ずつセルの値を格納できるのですが 最終行が不明の場合はどうすればいいのでしょうか? イミディエイトウインドウに表示される値は ,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,32,33,34,35,36,37,38,39,40 ,41,42,43,44,45,46,47,48,49,50 ,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,32,33,34,35,36,37,38,39,40 ,41,42,43,44,45,46,47,48,49,50 です。 最終行まで来たらまた2行目から取得しなおします。 なのでIf cnt = 0 Or cnt = 42 Thenにしました。 最終行が60だったり65だったりした場合は、strに10個格納できないですが、少ない分には問題ないです。 これで、最終行が100でも200でも対応できるコードを作りたいのですが わかりません。 お知恵を拝借願います。