Návrh ovládání zdroje ATX
Zapínání a vypínání PC • zdroj ATX se zapíná spojením řídicího signálu \PS_ON se zemí • zapnutí PC – stiskem tlačítka POWER
• vypnutí PC (hardwarové) – stiskem tlačítka POWER a jeho podržením určitou dobu • reakci je možné nastavit v BIOSU, např. nutnou dobu stisku, uspání počítače při krátkém stisku atd.
Napájecí konektor ATX • na zdroji
pin č. 16 (zelený vodič) - \PS_ON
Super IO čip • speciální obvod na základní desce • např. ite IT8712F, Winbond W83977TF • obsahuje vstupně/výstupní zařízení – např. sériová rozhraní RS-232, rozhraní klávesnice, paralelní port
• řídí otáčky ventilátoru procesoru podle snímané teploty • ovládá zdroj ATX
IT8712-F
Winbond W83977TF
POWER
Super I/O čip
Zdroj ATX
Zahrajeme si na návrháře čipové sady PC • navrhneme část Super IO čipu, který ovládá zapínání a vypínání zdroje ATX podle stisku tlačítka • obvod oproti originálu zjednodušíme: – nebudeme „uspávat“ počítač při krátkém stisku – doba podržení tlačítka nutná pro vypnutí zdroje bude konstantní
Vcc Zdroj ATX
tlačítko
Řídicí obvod clk OSCILÁTOR
Popis chování – po stisku tlačítka dojde k zapnutí zdroje (výstup obvodu log. 1), při uvolnění tlačítka je zdroj stále zapnut – další stisk tlačítka signalizuje vypnutí zdroje: • je-li tlačítko drženo alespoň 4 sekundy, zdroj je vypnut, pokud je tlačítko uvolněno dříve, zdroj zůstává zapnut
Návrh • chování řídicího obvodu popíšeme konečným automatem • čas 4 sekundy po stisku tlačítka bude měřen čítačem – frekvenci hodinového signálu na přípravku nastavíme na 1kHz ⇒ čítač bude 12 bitový, tj. čítá v rozsahu 0 až 4095 po dobu 4,095s – čítač má 1 vstupní signál povol • je-li povol = 1, čítač čítá, je-li povol =0, čítač je zastaven a vynulován
Návrh – čítač má 1 výstupní signál vrchol • vrchol má hodnotu 1, dosáhl-li čítač vrcholové hodnoty 4095, tj. binárně samé 1
• řídicí automat má 2 vstupní signály – x - stav tlačítka (1=stisknuto) – vrchol - výstupní signál čítače
a 2 výstupní signály – povol - ovládání čítače – o - ovládání spínacího tranzistoru zdroje (1=zapnuto)
Návrh Čítač Vcc
x
povol
vrchol
Konečný automat
o
Automatový popis • úmluva v označení vstupů a výstupů v grafu přechodů
00/00 x
vrchol
o povol
Mooreův automat 0x
1x 1x
Q1/10
Q0/00
0x
Q2/10
0x
01
00 1x Q3/11
Q4/00 1x
11
10
0x
Mealyho automat 0x/00
1x/10 1x/10
Q1
Q0
0x/10 0x/00 01/00 00/10 Q2
Q3 1x/00
11/00
10/11
Realizace – problém metastability • předstih (setup time) – doba, po kterou musí být signál na vstupu klopného obvodu typu D ustálen před příchodem hrany synchronizačního (hodinového) pulzu
• v naší aplikaci neexistuje časový vztah mezi stiskem tlačítka a zdrojem hodinového signálu (oscilátorem) – může se stát, že při stisku tlačítka nebude na vstupu klopných obvodů dodržen předstih nebo se změna vstupu dokonce "trefí" do okamžiku hrany hodinového signálu
• v takovém případě hrozí metastabilita klopného obvodu – výstup klopného obvodu se nepřeklopí do 0 nebo 1, ale bude v zakázaném pásmu, event. může i zakmitat – do ustáleného stavu se dostane až při příchodu další hrany hodinového signálu
Řešení metastability • vstupnímu signálu, který nemá časovou vazbu na hodinový signál, "vložíme" do cesty 2 klopné obvody
Realizace z diskrétních součástek (bez čítače) Tabulka přechodů a výstupů 00 01 10 11 00 01 10 11 Q0 Q0 Q0 Q1 Q1 00 00 10 10 Q1 Q2 Q2 Q1 Q1 10 10 10 10 Q2 Q2 Q0 Q2 Q3 10 00 11 00 Q3 Q0 Q0 Q3 Q3 00 00 00 00
Zakódování vnitřních stavů • zvolíme binární kód q 1q 0 Q0
00
Q1
01
Q2
10
Q3
11
Realizace s diskrétních součástek Zakódovaná tabulka přechodů a výstupů xv q1q0
00 01 10 11 00 01 10 11
00 00 00 01 01 00 00 10 10 01 10 10 01 01 10 10 10 10 10 10 00 10 11 10 00 11 00 11 00 00 11 11 00 00 00 00
Mapy pro budící funkce klopných obvodů q0':
q1 q0
q1':
q1 q0
0
0
0
0
0
1
0
1
0
0
0
0
0
1
0
0
1
1
1
1
0
0
1
1
1
1
1
0
0
0
1
1
xv
q0 ' = x q1 + xq0 + xv
xv
q1 ' = xq1 + x q1q0 + vq1 q0
Mapy pro výstupní funkce o:
q1 q0
povol:
q1 q0
0
1
0
1
0
0
0
0
0
1
0
0
0
0
0
0
1
1
0
0
0
0
0
0
1
1
0
1
0
0
0
1
xv
xv
o = x q1 + q1q0 + vq1 q0
povol = xvq1 q0
Schéma obvodu (bez čítače) A6A
A3B
O 0
A4A
x 0
vcc
A2A
A5A
U1A A2B
A1A
A4B
v
q0
A2C
vcc
A2D
U1B A3A
q1
A1B clk d
A1C
clock 200n
RESET 1
ns
povol 0
clk d
0
A4C
Realizace na CPLD • automat popíšeme ve VHDL • popis bude symbolický, kódování vnitřních stavů a tvorbu budicích funkcí ponecháme na software, který provádí syntézu
Blok řídicího automatu entity ovladani is Port ( x : in std_logic; clk : in std_logic; reset : in std_logic; o : out std_logic); end ovladani;
• popíšeme symbolické stavy: type Stavy is (Q0,Q1,Q2,Q3);
• zavedeme vnitřní signály: signal stav,novy_stav: Stavy; signal citac: std_logic_vector(11 downto 0); -- dva signály xk a xl ve funkci klopných obvodů pro řešení metastability signal xk: std_logic; signal xl: std_logic; signal povol: std_logic; signal vrchol: std_logic; -- sdruzeny vstup automatu a vrchol signal vstup: std_logic_vector(1 downto 0);
• popíšeme čítač: process(clk, reset, citac) is begin if (reset='1') then citac <= (others => '0'); elsif (clk'event and clk = '1') then case povol is when '0' => citac <= (others => '0'); when '1' => citac <= citac + 1; when others => citac <= (others => '0'); end case; end if; end process;
• čítač dosáhl vrcholu: vrchol <= citac(0) and citac(1) atd.;
• logický součin je možné zapsat ve VHDL i pomocí cyklu for a zavedením proměnné p: process (vrchol,citac) variable p: std_logic; begin p := '1'; for i in 0 to 11 loop p := p and citac(i); end loop; vrchol <= p; end process;
• popíšeme zapojení klopných obvodů pro řešení metastability: process (xk,xl,clk,reset) begin if (reset='1') then xk <= '0'; xl <= '0'; elsif (clk'event and clk = '1') then xk <= x; xl <= xk; end if; end process;
• popíšeme klopné obvody pro uložení vnitřních stavů process(reset,clk,stav,novy_stav) begin if (reset='1') then stav <= Q0; elsif (clk'event and clk = '1') then stav <= novy_stav; else stav <= stav; end if; end process;
• sdružíme vstupy: vstup <= (xl,vrchol);
• popíšeme tabulku přechodů process (stav,novy_stav,vstup) begin case stav is when Q0 => case vstup is when "00" => novy_stav <= Q0; when "01" => novy_stav <= Q0; when "10" => novy_stav <= Q1; when "11" => novy_stav <= Q1; when others => novy_stav <= Q0; end case; when Q1 => case vstup is when "00" => novy_stav <= Q2; atd.
• popíšeme tabulku výstupů process (stav,vstup) begin case stav is when Q0 => case vstup is when "00" => o <= '0'; povol <= '0'; when "01" => o <= '0'; povol <= '0'; when "10" => o <= '1'; povol <= '0'; when "11" => o <= '1'; povol <= '0'; when others => o <= '0'; povol <= '0'; end case; when Q1 => o <= '1'; povol <= '0'; when Q2 => case vstup is when "00" => o <= '1'; povol <= '0'; atd.