- 締切済み
CPLDでのDIVIDER機能
VHDL及びPLD設計初心者です。 入力クロック1MHzを、8bit(4×2のBCDコード)で0~99の入力信号に対し、同じく99種類の出力パルス(入力"1"で20Hz程度,入力99で2KHz程度)を生成する機能を設けたいのですが、CPLDで実現可能でしょうか。 CPLDは分周自体が不得意と聞いた事もあるような気がしますが・・・ 宜しくお願いします。
- みんなの回答 (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で十分に実現可能と思います。 リストはなぜか、字下げが無くなって見づらくなって しまいました。
お礼
遅くなりまして申し訳ありません。 回答いただき有難うございました。参考にさせていただきます。