請問ahdl或vhdl程式高手
請問我想做小綠人程式,現在我有一個紅綠燈控制電路,該如何再加入以兩顆LED燈閃爍代替小綠人,倒數時LED以1秒閃爍,最後倒數十秒時以0.5秒閃爍。
我是用quartusII做的,最好能教我怎麼寫或幫我寫,程式做出來後電路現該怎接呢?
請描述越詳細越好~
1 個解答
- ?Lv 61 0 年前最佳解答
你好,
因為大大已經做好一組的紅綠燈了,所以小綠人的部份可以由紅綠燈的燈號來取得。就如同紅綠燈,小綠人也是兩組對稱的,所以只要設計一組,然後呼叫兩次就好了!
一組的小綠人,輸入信號計有:CLK : 1hZ的時鐘信號、R : 對方的紅燈指示、RT : 小綠人的秒數、GM : 小綠人燈號輸出。
當對邊的紅燈亮起時,這時小綠人的計數器啟動倒數,倒數的秒數由計數器(gmcnt)完成。當倒數時,以計數器的LSB決定是否燈亮,如此是1HZ的閃爍,到了最後10秒鐘,以CLK控制燈亮,如此是0.5HZ的閃爍。
一組小綠人的完整程式如下,請參考!
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity greenman is Port (
CLK : in std_logic;--clock 1hz
R : in std_logic;--opposite Red
RT : in std_logic_vector(7 downto 0);--period
GM : out std_logic);--green man
end greenman;
architecture arch of greenman is
signal gmcnt : std_logic_vector(7 downto 0);--Time counter
begin
process(CLK)
begin
if CLK'event and CLK='1' then
if (R='0') then
gmcnt<=RT;
else
gmcnt<=gmcnt-'1';
end if;
end if;
end process;
process(gmcnt,R,CLK)
begin
if ((R='1' and gmcnt(0)='1' and gmcnt>="00001010") or
(R='1' and CLK='1' and gmcnt<"00001010")) then
GM<='1';
else
GM<='0';
end if;
end process;
end arch;