BI-SAP.21 Struktura a architektura počítačů
Jdi na navigaci předmětu

Modulární prvek do hry FORBES

1. Zadání

FORBES je automatová hra (kdysi) vídaná v restauračních zařízeních nižší kvality a nevalné pověsti :-). Hra se skládá ze tří kotoučů, které hráč postupně roztáčí a zastavuje s cílem mít ten samý obrazec na všech třech kotoučích. V rámci úlohy budeme za obrazce považovat hodnoty 0-F a pro splnění úlohy stačí implementovat pouze jeden kotouč.

Úkolem je tedy implementovat obvod, který bude zobrazovat "náhodná" čísla v rozmezí 0-F poté, co se stiskne tlačítko ROLL. Výsledek zobrazujte pouze na 1 pozici 7segmentového displeje (viz práce s AN0, AN1, AN2, AN3 v referenčním manuálu nebo na předchozích úlohách).

2. Realizace

2.1. Přechodové a výstupní funkce, Zapojení automatu

Tato část je obdobná jako v předcházející úloze na detektor posloupnosti Implementace (& simulace) sekvenčního obvodu.

2.2. Celkové zapojení

Celkové zapojení (zapojení je pouze doporučené - případné jiné řešení je ponecháno na vůli řešitele) pro nahrání do vývojového kitu je na následujícím obrázku. Použitý pin na signálu CLK najdete v sekci Wiring pod názvem Clock. Jeho funkce je prakticky identická s běžným vstupním pinem, ale během mapování při syntéze jej nemusíte již přiřazovat (Logisim ví, že jde o vstup pro hodinový signál a ví, kde se zdroj hodinového signálu na vývojovém kitu nachází).

Forbes - Top

Popis jednotlivých bloků je v následujících sekcích.

Debounce Board

Obdobně jako v předcházející úloze na detektor posloupnosti by mohl nastat problém s kvalitou fyzického kontaktu tlačítka. To není nijak ošetřeno proti tzv. zákmitům a jeden stisk tak může vyvolat několik změn hodnot, které by byly vyhodnoceny jako samostatné stisky tlačítka. Proto využijeme prvek Debounce, který můžete stáhnout zde (pokud jste jej už nestáhli minule). Do projektu jej přidáte pomocí volby FileMerge…​. Projekt obsahuje dvě schémata - odstraňovače zákmitů - jeden určený pro simulaci debounce_sim, druhý pro použití na vývojovém kitu debounce_board.

Controller

Blok Controller řídí činnost celého obvodu:

  • Obvod začíná svoji činnost (tj. spustí Counter a inicializuje ShiftReg), když je na vstup ROLL (BTNL) přivedena logická 1 (stiskne se tlačítko).
  • Pokud je ROLL v logické 0 (tlačítko se uvolní), generují se další čísla (tj. Counter stále běží, ale ShiftReg se už neinicializuje).
  • Po dalším stisku (a uvolnění) tlačítka se generování čísel zastaví (tj. Controller se vrátí do výchozího stavu).

Popis řídicích signálů (výstupů bloku Controller):

  • CE alias Count_Enable slouží k povolení čítání součástky Counter (v logické 1).
  • SI alias Shift_Init slouží k inicializaci ShiftReg (jinak by se zobrazovala pořád 0).
    • Signál SI musí být platný minimálně po dobu prvního otočení čítače – proto má Controller na vstupu signál s z komponenty Counter, aby mohl počkat na jeho aktivaci a teprve potom SI vypnout.

Čítač/Counter (CTR24)

Blok ve spodní části schématu je čítač (prvek Counter v sekci Memory) nastavený na délku 24 bity (Data bits24) a maximální hodnotu 0xffffff (Maximum value0xffffff). Toto nastavení aktivuje jeho výstupní signál cca 1x za sekundu (pouze krátký pulz). Díky tomu bude hra "hratelná", ale můžete experimentovat i s jinými délkami.

Splitter + Hex Digit Display

Zapojení za výstupy bloku ShiftReg slouží k vyvedení výstupu na sedmisegmentový displej:

  • Součástka zvýrazněná fialovým kroužkem je Splitter (sekce Wiring), který umožňuje spojení více jednobitových signálů do jednoho vícebitového. Přesné nastavení Splitter-u (4 bity, správný směr, pořadí atd.) je vidět na obrázku (červený kroužek v levé dolní části). Důkladně si zkontrolujte pořadí bitů - bit 0 musí jít na výstup a, který má nejnižší váhu.
  • Nad Splitter-em je virtuální displej Hex Digit Display (sekce Input/Output), který umožní přímé zobrazení stavu i na fyzickém displeji vývojového kitu. Virtuálnímu displeji můžete vypnout zobrazení desetinné tečky (volba Has decimal pointNo v levé dolní části s nastavením - nebudete ji pak muset mapovat).

ShiftReg

Blok ShiftReg je zpětnovazební registr (Linear-feedback shift register - LFSR - více info na Wikipedii) sloužící pro generování "náhodných" čísel.

Doporučené zapojení ShiftReg:

Forbes - Shiftreg

Blok ShiftReg se skládá ze čtyř klopných obvodů a zpětné vazby napojené pomocí XORu z posledních dvou klopných obvodů zpět na vstup prvního klopného obvodu. OR a signál Shift_In umožňuje inicializaci LFSR, jinak by v něm byly stále samé nuly.

2.3. Otestování funkce

Otestování funkce doporučujeme nejprve pro každý jednotlivý blok (Controller, ShiftReg). Pokud byste chtěli simulovat celé zapojení, pak proveďte následující úpravy:

  • použijte prvek debounce_sim namísto debounce_board (jinak by byla simulace extrémně pomalá),
  • nastavte prvek Counter na délku 4 bity (Data bits4), maximální hodnota by se měla nastavit automaticky na 0xf,
  • přepněte se v levé části do nastavení simulace (Simulate), vyberte, že chcete simulovat schéma top a poté povolte automatické přepínání hodinového signálu (Enable Clock ticks). V menu SimulateAuto-Tick Frequency vyberte frekvenci 16 Hz.
Automatické generování hodin - povolení

S výše uvedeným nastavením můžete aktivovat vstup (ROLL) a sledovat odezvu celého zapojení. POZOR: debounce_sim přidá do simulace latenci cca 1 sekundu. Během této doby nechte signál na vstupu aktivní, jinak ho debounce_sim odfiltruje jako zákmit! Counter s délkou 4 bity také bude generovat výstup cca 1x za sekundu, takže i výstup blok ShiftReg by se měl měnit cca 1x za sekundu.

Po ukončení simulace se nezapomeňte přepnout zpět do módu pro editování schématu (ikona Ikona - Edit), vyměnit debounce_sim zpět za debounce_board a nastavit prvek Counter na délku 24 bity (Data bits24).

2.4. Realizace na kitu Basys3

Pro ovládání detektoru využijte následující prvky:

  • tlačítko BTNR (pravé) pro hlavní ovládání ROLL,
  • tlačítko BTND (dolní) pro signál RESET
  • vnitřní hodinový signál (CLK100MHz) pro hodinový signál CLK (pouze pokud jste ve schématu nepoužili speciální hodinový pin Clock, jinak se signál CLK mapuje automaticky),
  • katody sedmisegmentového displeje pro signál Hex_Digit_Display_1, který vytvoří virtuální displej Hex Digit Display (viz poznámka níže).
Důležité:

Nezapomeňte během nastavení syntézy nastavit Divider Value na 1, jinak by se obvod mohl tvářit, že nic nedělá (byl by extrémně zpomalený).