• 締切済み

CPLDでのDIVIDER機能

VHDL及びPLD設計初心者です。 入力クロック1MHzを、8bit(4×2のBCDコード)で0~99の入力信号に対し、同じく99種類の出力パルス(入力"1"で20Hz程度,入力99で2KHz程度)を生成する機能を設けたいのですが、CPLDで実現可能でしょうか。 CPLDは分周自体が不得意と聞いた事もあるような気がしますが・・・ 宜しくお願いします。

みんなの回答

noname#5465
noname#5465
回答No.1

素人ですが、その課題で設計してみました。 チップクロックに4MHzを使う完全同期式のロジックです。 ツールはXILINXの無償版を使ってコンパイルとシミュレーションを確認しています。 デバイスは XC9536-10-PC44 にフィットしました。 以下はロジック本体とテストベンチです。 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity dep is port(CLK,Reset : in std_logic; datu : in std_logic_vector(3 downto 0); -- 設定上 datl : in std_logic_vector(3 downto 0); -- 設定下 depin : in std_logic; -- 分周入力 depout : out std_logic); -- 分周出力 end dep; architecture RTL of dep is signal enp : std_logic_vector(1 downto 0); signal depc : std_logic_vector(7 downto 0); signal load : std_logic; signal depv : std_logic_vector(7 downto 0); signal datu8 : std_logic_vector(7 downto 0); signal datu2 : std_logic_vector(7 downto 0); signal depbuf : std_logic; signal predep : std_logic_vector(7 downto 0); begin -- 8ビット初段分周 process(CLK) begin if (CLK' event and CLK='1') then if (Reset='1') then predep <= "00000000"; else if (enp="01") then predep <= predep+1; end if; end if; end if; end process; -- 8ビット2段目分周 再設定値可変 process(CLK) begin if (CLK' event and CLK='1') then if (Reset='1') then depc <= "00000000"; else if (load='1') then depc <= depv; else if (enp="01") then if (predep="00000000") then depc <= depc-1; end if; end if; end if; end if; end if; end process; -- 分周器 能動パルス process(CLK) begin if (CLK' event and CLK='1') then if (Reset='1') then enp <= "00"; else if (depin='1') then if (enp="00") then enp <= "01"; end if; if (enp="01") then enp <= "10"; end if; else enp <= "00"; end if; end if; end if; end process; -- 2段目分周再設定パルス process(depc) begin if (depc="00000000") then load <= '1'; else load <= '0'; end if; end process; -- 分周出力 process(CLK) begin if (CLK' event and CLK='1') then if (load='1') then if (depbuf='1') then depbuf <= '0'; else depbuf <= '1'; end if; end if; end if; end process; -- 設定上 10倍 datu8(7) <= '0'; datu8(6) <= datu(3); datu8(5) <= datu(2); datu8(4) <= datu(1); datu8(3) <= datu(0); datu8(2) <= '0'; datu8(1) <= '0'; datu8(0) <= '0'; datu2(7) <= '0'; datu2(6) <= '0'; datu2(5) <= '0'; datu2(4) <= datu(3); datu2(3) <= datu(2); datu2(2) <= datu(1); datu2(1) <= datu(0); datu2(0) <= '0'; -- 設定バイナリ変換 process(datu8,datu2,datl) begin depv <= 100-(datu8+datu2+datl); end process; -- 分周出力代入 depout <= depbuf; end RTL; ----- テストベンチ ----- library IEEE; use IEEE.std_logic_1164.all; entity depsim is end depsim; architecture SIM of depsim is component dep port(CLK,Reset : in std_logic; datu : in std_logic_vector(3 downto 0); -- 設定値上 datl : in std_logic_vector(3 downto 0); -- 設定値下 depin : in std_logic; -- 分周入力 depout : out std_logic); -- 分周出力 end component; constant CLK_CYCLE : Time := 250 ns; -- チップクロック signal CLK : std_logic; signal Reset : std_logic; signal datu : std_logic_vector(3 downto 0); signal datl : std_logic_vector(3 downto 0); signal depin : std_logic; signal depout: std_logic; begin unit: dep port map( CLK => CLK ,Reset => Reset ,datu => datu ,datl => datl ,depin => depin ,depout => depout); -- チップクロック 4MHz process begin CLK <= '1'; wait for CLK_CYCLE/2; CLK <= '0'; wait for CLK_CYCLE/2; end process; -- 分周期入力 1MHz process begin depin <= '1'; wait for CLK_CYCLE*2; depin <= '0'; wait for CLK_CYCLE*2; end process; -- 分周設定 process begin Reset <= '1'; -- 初期化 datu <= "0000"; -- 設定上 値 datl <= "0001"; -- 設定下 値 wait for CLK_CYCLE*5; Reset <= '0'; -- 初期化解除 wait for CLK_CYCLE*10000000; end process; end SIM; ---------------------------------------------- 仕様を取り違えたところがあるかもしれませんが 、分周はCPLDで十分に実現可能と思います。 リストはなぜか、字下げが無くなって見づらくなって しまいました。

marl77
質問者

お礼

遅くなりまして申し訳ありません。 回答いただき有難うございました。参考にさせていただきます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • CPLDでの分周について

    入力クロック1MHzを、8bit(4×2のBCDコード)で099の入力信号に対し、同じく99種類の出力パルス(入力"1"で20Hz程度,入力99で2KHz程度)を生成する機能を設けたいのですが、CPLDで実現可能でしょうか。 CPLDは分周自体が不得意と聞いた事もあるような気がしますが・・・ 宜しくお願いします。

  • 4MHzから1Hzへのカウンタを用いた分周について

    4bitカウンタを従列接続することによって、4MHzの水晶発振器の出力を1Hzまで分周する回路をつくれ という問題がありますが、実現方法がわかりません。 4×10^6個のパルスを分周することになると思いますが、4bitカウンタでは2^16ごと周波数が落ちていくので、1Hzきっちりにはならない気がします。 何か勘違いをしていますでしょうか? よろしくお願いします。

  • CPLDはクロックを入れなくても使える?

    ザイリンクス、アルテラ、ラティスなどのCPLDを使いたいと思っています。 一般的(?)にはCPLDにクロックを入れて、そのエッジで信号を取り込んで処理する同期回路設計をすると思います。 今回はCPLDで標準ロジックを複数入れるようなものを作ってみようと思っています。 例えば5入力ANDや、4bit-16bitデコーダのような感じのものです。 これらもクロックに同期して取り込んだ方が出力がきれいに安定するのはわかるのですが、あえてこれは良しとした場合、CPLDにはクロックを入れなくても動かすことはできるのでしょうか? ご存知の方がいらっしゃいましたらご教示お願いいたします。

  • 高周波パルス生成ICを探しています

    色々と探してみましたが、 見つかりませんでしたので質問させていただきます。 現在大学の開発でマイコンからACサーボパックへパルスを送り 対象を制御しようとし、高周波数を出力できるICを必要としています。 具体的に 125.000KHzと、 124.958KHzのパルスを生成したいのですがこれを実現するには、 約374MHzの周波数が必要なのです。 パラレル、シリアル通信どちらでもいいのですが マイコンからの信号を受けて周波数を可変できるようなICを探しています。   信号  パルス ■⇒⇒⇒□⇒⇒⇒■ マイコン  IC   制御対象 CPLDなどで組むのもいいのですが、開発費の問題で出来る限り安価な IC単品で可能になれば、と考えています。 ご教授宜しくお願いいたします。

  • Xilinx ISE 分周波形シミュレーション

    50MHzを分周して1MHz,1KHz,200Hzなどの信号を作るとします。 カウンタを使ってそれぞれの信号を作ったのですがきちんと分周されているのかシミュレートしたいと思います。 TestBenchWaveFormを選択し、SimulateBehavioralModelを実行し、波形を確認したのですが200Hzの信号に対し、50MHzが速すぎるので200Hzの信号の立ち上がりが確認できません。 スケール([1000][ns]とか書いてあるところ)を変えてもあまり変化がみられないのですが、200Hz信号を確認したい場合どうすればよいのでしょうか?

  • PLL(Phase locked loop)についてぜひ教えてください。

    以前に「n逓倍器」について多くのアドバイスをいただき、ありがとうございました。 結局、水晶振動子で安定した周波数出力をし、PLLを使ってn倍の逓倍器を作ろうと決めました。 ICはMC14060を使おうと思っています。 このICは14ビットのバイナリカウンタで、発振器も内蔵しており、水晶振動子を接続することで、14ビットの範囲で任意に分周させて出力が出来るようです。(この時点で間違っていたらすいません。。) それで、100Hz程度の正弦波をPLLに入力させようとしているので、一般的な水晶振動子では周波数が高すぎる(数MHzを多く見かけました)ため、分周して出力させようと考えました。 水晶振動子を調べると0.032768MHzという水晶振動子を見つけたのですが、それを14ビットで分周すると・・・ 0.032768(MHz)×(1/2の14乗)=2Hzとなるので十分だと考えました。 そこで質問があるのですが、水晶振動子の出力を分周させて低めの周波数(数Hz~数KHzぐらい)で出力させようとするときは、高めの周波数(数MHz~数十MHz)の水晶振動子を値の大きなビットで分周させてつくったほうが良いのでしょうか?それとも、あらかじめ低い周波数(私が見つけた水晶振動子程度)の水晶振動子を値の小さなビットで分周させて出力させたほうが良いのでしょうか?? 「良いのでしょうか?」というのは波形が安定しているかどうか(歪みなどが無いか)という視点のみです。 また分周についてお知りの方は、14ビットでは欲しい周波数まで分周できないときは、直列に分周器をつなげる(例えば14ビット分周器を2個)ことでビット数を増やし、高い周波数の水晶振動子でも数Hzの周波数で出力させることが可能でしょうか?? 回路の初心者なのでどんなことでもアドバイスをいただければとても助かります。よろしくお願い致します。

  • スピードメーターのパルスについて (電子回路の分野)

     スピードメーターを購入しましたが、バイク側のパルスが特殊なため正しい表示をしません。そこでパルスを合わせるため分周回路を製作しているのですが電気は苦手でうまくいきません。  バイク側のパルスですが、40パルスで(5V信号)、これをメーターが対応できる4パルスにするには単純に10分周すればよいのでしょうか?  また、10分周で動作することを前提にTC4017BPとゆうICカウンタを使用して製作しているのですが、うまく分周されません。具体的には、パルスの入力(元の40パルス)をクロック(14番ピン)に接続し、10分周された出力はQ0(3番)からひろっています。これだけです。  結果は、ICカウンタを繋がない状態と同じでまったく分周されていない40パルスの信号が出ています。他にも接続する部分があるのでしょうか?また、他になにか必要なのでしょうか?アドバイスよろしくお願いします。

  • 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; 以上、よろしくお願いします

  • AVRのインプットキャプチャについて

    AVRのインプットキャプチャを利用してパルス立ち上がりエッジ間の時間を計測したいのですが、どうも計算が合いません。知恵を貸してください・・・ 1MHzの駆動でカウンタの分周が64分周なら単純に1カウント64μSecですよね? 実際に計測しますと130Hzのパルス立ち上がりエッジ間に60カウントしました。ですので・・・ 60パルス*64μSec=3840μSec となると思うのですが、 130Hzならパルス立ち上がりエッジ間は・・・ 1Sec/130Hz=0.007692Sec すなわち7692μSecですよね? もし計算間違ってたら教えてください。 計測対象のパルスですが、これはPCファンの回転信号を計測しました。 DSOnanoで計測したら130Hzでした。 AVRのタイマ/カウンタの値はUARTで確認しました。 AVRのタイマーの設定を間違ってたらいけないので記載していきます。以下の通りです。 TIMSK = (1<<ICF1); TCCR1B = (1<<ICES1)|(3<<CS10);//上りエッジの64分周

  • VHDLでこんな事できますか?

    VHDL(デバイスはCPLD)でこのような回路はできますか?  クロック ----→????-------→ output1                         |                         ----→ output2                         |                         ----→ output3   クロックの入力に同期して  output1 → OFF → output2 → OFF → output3  → OFF → output1 →・・以下最初 という感じで出力を一ずつ移動させ間にOFFを挟むという感じです。(出力はONのときどこか一箇所だけ) 入力はクロックだけです。

このQ&Aのポイント
  • 軽い関係の男性との恋愛に悩んでいます。彼に対しては複雑な気持ちになることがあり、結婚願望があるのに選ばれないのではないかと不安になります。
  • 彼との関係が複雑で、自分自身もイライラしています。彼との結婚の可能性や自分の依存体質について悩んでいます。
  • 恋人未満の男性との関係に苦しんでいます。彼との距離を割り切れず、自分自身にもイライラしています。アドバイスをお願いします。
回答を見る