Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> VHDL

VHDL dubbele 7-segment displaycontroller voor Pmod SSD – eenvoudige FPGA-integratie

In dit artikel presenteer ik een VHDL-module die een tweecijferig nummer op de Pmod SSD kan weergeven:Seven-segment Display van Digilent. Het dubbele 7-segmentdisplay is compatibel met de Pmod-interface, wat betekent dat u het kunt gebruiken zonder te solderen. Hij past in de Pmod-connector, die standaard is op veel FPGA-ontwikkelborden.

Om de VHDL-implementatie te testen, gebruik ik de Lattice iCEstick, een goedkoop FPGA-ontwikkelbord met een Pmod-connector. Naast de iCEstick heb je een 2×6-pins naar Dual 6-pins Pmod-splitterkabel nodig om de parallelle Pmod-connector op de iCEstick om te zetten naar de in-serieversie van de stekker die het 7-segmentdisplay verwacht. Ten slotte raad ik aan om een USB type-A-verlengkabel te kopen, omdat het onpraktisch is om de iCEstick rechtstreeks op de USB-poort van de computer aan te sluiten.

Hoe 7-segmentdisplays werken

Er zijn veel verschillende 7-segmentdisplays op de markt. Het aantal cijfers varieert tussen de cijfers, evenals de fysieke interface en pin-out. Een generieke oplossing die alle mogelijke 7-segmentdisplays dekt die je tegenkomt, zou waarschijnlijk niet erg gebruiksvriendelijk zijn. U kunt echter de code in dit artikel als basis gebruiken en deze naar wens aanpassen.

De afbeelding hierboven komt uit de datasheet voor de Digilent Pmod-module. Het laat zien hoe het 7-segmentdisplay verbinding maakt met de Pmod-pinnen. Deze pinnen zijn direct toegankelijk voor de FPGA op de iCEstick.

Zeven van de pinnen besturen elk één segment op het display. Door een logisch hoge waarde op zo’n pin te sturen, zal het corresponderende segment op het display oplichten. Maar er staan ​​twee cijfers op dit display en we kunnen er maar één tegelijk bedienen. De P4/C-pin op de J2-connector selecteert het ene of het andere cijfer. Wanneer de logische spanning op deze pin '0' is , het juiste cijfer licht op als het '1' is , het linkercijfer is geactiveerd.

Het decimale punt “DP” is niet verbonden en is niet toegankelijk.

De entiteit

De onderstaande code toont de entiteit van onze seg7 VHDL-module. De entiteit heeft een generieke poort met een constante genaamd clk_cnt_bits . Het definieert de lengte van een interne teller die de vernieuwingsfrequentie van het scherm regelt, de frequentie van het wisselen tussen de linker- en rechtercijfers.

De exacte frequentie is niet essentieel. Selecteer een tellerlengte die in het bereik van 50 tot een paar honderd Hertz ligt. De formule die de vernieuwingsfrequentie bepaalt is refresh_hz =2clk_cnt_bits / clk_hz .

entity seg7 is
 generic (
 -- refresh_hz = (2 ** clk_cnt_bits) / clk_hz
 clk_cnt_bits : integer
 );
 port (
 clk : in std_logic;
 rst : in std_logic;
 value : in integer range 0 to 99;
 segments : out std_logic_vector(6 downto 0);
 digit_sel : out std_logic
 );
end seg7;

Naast de klok en reset heeft de entiteit één ingangssignaal:de waarde die moet worden weergegeven op het 7-segmentdisplay. De value signaal is een geheel getal dat beperkt is tot het bereik van 0 tot 99, omdat dit de enige getalswaarden zijn die met slechts twee cijfers kunnen worden weergegeven.

De uitgangssignalen zijn de zeven segmenten als vector en het cijferselectiesignaal waarmee u het linker- of rechtercijfer kunt kiezen om te verlichten.

Representeert een binair gecodeerd decimaal

Om de cijfers op het display weer te geven, gebruiken we het formaat dat bekend staat als binair gecodeerde decimalen (BCD). Hoewel een binaire weergave de meest efficiënte manier is om het decimale getal op te slaan, komen we problemen tegen wanneer we proberen het in een linker- en rechtercijfer te splitsen om op het display weer te geven. We kunnen geen onderscheid maken tussen de decimale cijfers door simpelweg de vector in stukken te snijden die wordt gebruikt om het getal op te slaan.

subtype digit_type is integer range 0 to 9;
type digits_type is array (1 downto 0) of digit_type;
signal digit : digit_type;
signal digits : digits_type;

Zoals weergegeven in de bovenstaande code, declareren we een subtype van het gehele getal in het bereik 0 tot en met 9 voor het beschrijven van de waarde die kan worden weergegeven door één decimaal cijfer. Vervolgens declareren we een nieuw arraytype dat twee van dergelijke BCD-waarden kan bevatten. De digit signaal bevat het nummer dat momenteel aan de linker- of rechterkant van het display wordt weergegeven. Aan de andere kant de digits signaal bevat de afzonderlijke decimale tekens voor de twee cijfers, zoals deze zullen verschijnen voor iemand die naar het scherm kijkt.

Decimaal omzetten naar BCD

De invoer voor deze module, value , is een geheel getal in het bereik van 0 tot 99, een binaire weergave van het getal. We moeten dit enkele gehele getal omzetten naar twee gehele getallen in het bereik van 0 tot 9, de BCD's.

Het standaardalgoritme hiervoor is Double Dabble, ook wel bekend als de shift-and-add-3 algoritme. Hoewel dit prima te gebruiken is, zal ik in ons geval kiezen voor een kortere oplossing omdat we slechts twee cijfers hoeven te scheiden.

digits(1) <= value / 10;
digits(0) <= value - ((value / 10) * 10);

Door deling van gehele getallen te gebruiken, zoals weergegeven in de bovenstaande code, kunnen we het meest significante decimale cijfer isoleren en toewijzen aan de digits(1) signaal. Om het minst significante cijfer te vinden, kunnen we het meest significante cijfer aftrekken van de value signaal, waardoor we alleen het nummer overhouden dat we aan de digits(0) kunnen toewijzen signaal.

Klokcycli tellen

Het vertragen van de tijd in FPGA's is eenvoudigweg een kwestie van het tellen van klokcycli. De klokperiode is het enige voorspelbare tijdsinterval waarop u kunt vertrouwen in uw VHDL-code. De onderstaande code toont de clk_count signaal, dat we gebruiken voor het tellen van klokcycli. De clk_cnt_bits generiek bepaalt hoeveel bits er gereserveerd moeten worden voor dit niet-ondertekende signaal.

signal clk_cnt : unsigned(clk_cnt_bits - 1 downto 0);

De exacte verversingssnelheid van het beeldscherm is van minder belang, daarom heb ik hier gekozen voor een niet-ondertekend type. Het stelt ons in staat gebruik te maken van het zelfinpakkende gedrag van het niet-ondertekende signaal. Het enige wat we hoeven te doen is de teller op elke stijgende flank van de klok te verhogen. De onderstaande code toont het synchrone proces met reset dat hiervoor zorgt.

COUNT_PROC : process(clk)
begin
 if rising_edge(clk) then
 if rst = '1' then
 clk_cnt <= (others => '0');
 
 else
 clk_cnt <= clk_cnt + 1;
 
 end if;
 end if;
end process;

Afwisselen tussen cijfers

Nu we de vrijlopende teller werkend hebben, kunnen we de meest significante bit (MSB) van het niet-ondertekende tellersignaal gebruiken om tussen de twee cijfers te schakelen. De MSB wisselt tussen '0' en '1' met een inschakelduur van 50%. De eerste regel van de onderstaande code stelt de digit_sel in signaal gebaseerd op de waarde van de MSB. De tweede lijn implementeert een multiplexer waarbij de MSB als selector wordt gebruikt. Het stuurt de waarde van het actieve cijfer door vanuit de digits array naar digit signaal.

digit_sel <= clk_cnt(clk_cnt'high);
digit <= digits(0) when clk_cnt(clk_cnt'high) = '0' else digits(1);

BCD naar 7-segmentencoder


De laatste stap van de seg7-module is het vertalen van de BCD die is opgeslagen in de digit signaal naar een visuele weergave op het 7-segmentdisplay. De onderstaande code toont een proces dat dit bereikt door gebruik te maken van een case-statement.

De positie in de vector van elke letterlijke bit komt overeen met één segment op het scherm. Index 0 is gelijk aan segment A, index 1 is B, enzovoort, helemaal tot aan index 6, die segment G bestuurt. De toewijzingen van segmenten aan vectorindexen zijn afgeleid van de datasheet voor de Digilent 7-segmentweergave.

ENCODER_PROC : process(digit)
begin
 case digit is
 
 when 0 => segments <= "0111111";
 when 1 => segments <= "0000110";
 when 2 => segments <= "1011011";
 when 3 => segments <= "1001111";
 when 4 => segments <= "1100110";
 when 5 => segments <= "1101101";
 when 6 => segments <= "1111101";
 when 7 => segments <= "0000111";
 when 8 => segments <= "1111111";
 when 9 => segments <= "1101111";
 
 end case;
end process;

De uitvoer

De seg7 VHDL-module geeft op het display weer wat u toewijst aan de value ingangssignaal. In de testbench verhogen we value signaal eenmaal per seconde. Vervolgens simuleren we iets meer dan 100 seconden, zodat we het omlooppunt van de value kunnen observeren teller.

De bovenstaande golfvorm is van ModelSim. Het toont het eerste deel van de simulatie, waar de waarde heeft geteld van 0 tot 15. We kunnen zien dat de getallen in de digits array telt ook. Die (0) tellen elke keer dat de value signaal verandert, terwijl de tientallen (1) verhogen op elk tiende getal.

U kunt het ModelSim-project, inclusief de testbench, downloaden via onderstaand formulier.

Als u de seg7-module als bovenste module op de FPGA implementeert, zal het display hoogstwaarschijnlijk een stabiele “00” weergeven. Dat komt omdat '0' is de meest voorkomende standaardwaarde die wordt gegeven aan niet-geïnitialiseerde signalen in FPGA's. Wanneer de value signaal wordt ingesteld op allemaal nullen, het display zal precies dat weergeven.

Om door alle mogelijke invoernummers te bladeren, heb ik een wrapper VHDL-module gemaakt die de value verhoogt signaal tien keer per seconde. Vervolgens heb ik de seg7-module in de verpakking geïnstantieerd voordat ik het ontwerp op de Lattice iCEstick implementeerde. De onderstaande looping GIF-video laat zien hoe het geïmplementeerde ontwerp eruit ziet op het 7-segmentdisplay.

De Pmod SSD kopen:display met zeven segmenten

Het 7-segmentdisplay dat in deze blogpost wordt gebruikt, is afkomstig van Digilent. U kunt de Pmod-module aanschaffen in de webshop van Digilent, maar u kunt deze ook verkrijgen bij een van de vele resellers. In de onderstaande lijst heb ik een link naar de productpagina geplaatst voor de weergave in een aantal online elektronicawinkels die het artikel verkopen.

  • Digilent
  • Digi-Key
  • Mouser
  • RS Electronics (VK)
    (Ga naar de hoofdpagina van RS Electronics om de site voor uw land te selecteren)
  • Farnell (VK)
    (Ga naar de hoofdpagina van Farnell om de site voor uw land te selecteren)

Houd er rekening mee dat als u het Digilent 7-segmentdisplay wilt gebruiken met de Lattice iCEstick , of een ander FPGA-ontwikkelbord met een 6×2-pins Pmod-connector, heeft u ook een splitterkabel nodig. De kabel is verkrijgbaar bij Digilent , Digi-toets , Mouser , en RS Electronics .

Bovendien zijn alle componenten verkrijgbaar bij verschillende verkopers op Amazon en eBay.

VHDL-cursus met behulp van het Digilent 7-segmentdisplay

Ik heb een nieuwe VHDL- en FPGA-cursus gelanceerd voor absolute beginners. In de cursus gebruik ik het 7-segmentdisplay van Digilent en het Lattice iCEstick FPGA-ontwikkelbord voor het lesgeven van VHDL. Klik op onderstaande link om meer over de cursus te lezen!

FPGA en VHDL Fast Track:

Praktisch voor absolute beginners

Bent u bekend met programmeren, maar nieuw met VHDL?

Heeft u behoefte aan een korte introductie over dit onbekende onderwerp?

Is je agenda vol en heb je geen tijd meer om te studeren?

Begrijp in een paar avonden de basisprincipes van FPGA-ontwikkeling met behulp van VHDL! Deze cursus is bedoeld voor IT-professionals en studenten die behoefte hebben aan een snelle terugblik op het onderwerp. Met deze cursus en het voordelige Lattice iCEstick-ontwikkelbord ontwikkel je binnen enkele uren echte hardware.

Klik hier om meer te lezen en je in te schrijven:
FPGA en VHDL Fast-Track:hands-on voor absolute beginners


VHDL

  1. Hoe maak je een Tcl-gestuurde testbench voor een VHDL-codeslotmodule?
  2. Een geklokt proces maken in VHDL
  3. Hoe maak je een ringbuffer FIFO in VHDL
  4. Tutorial:je eerste FPGA-programma:een led-knipperlicht
  5. Hoe een ademend LED-effect te creëren met behulp van een sinusgolf die is opgeslagen in blok RAM
  6. Hoe u uw eerste VHDL-programma maakt:Hello World!
  7. Interactieve testbank met Tcl
  8. Een gelijktijdige verklaring maken in VHDL
  9. Geïntegreerde Logic Analyzer (ILA) en virtuele invoer/uitvoer (VIO) gebruiken
  10. Hoe willekeurige getallen te genereren in VHDL
  11. Een procedure gebruiken in VHDL