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

Std_logic_vector in VHDL onder de knie krijgen: signaalvectoren maken

Het std_logic_vector-type is VHDL's standaard voor het definiëren van signaalbussen. Terwijl std_logic een enkele draad's toestand modelleert, breidt std_logic_vector dit uit tot een array van draden, wat de representatie van multi-bit bussen mogelijk maakt.

In tegenstelling tot de single-bit std_logic, is std_logic_vector een samengesteld type – een geïndexeerde verzameling van std_logic-elementen. Het kan een willekeurig aantal bits bevatten, wat het ideaal maakt voor het verbinden van componenten die multi-bit data uitwisselen.

Deze blogpost is onderdeel van de Basic VHDL Tutorials-reeks.

Declareer een std_logic_vector-signaal met de volgende syntax:
signal <name> : std_logic_vector(<lsb> to <msb>) := <initial_value>;
of
signal <name> : std_logic_vector(<msb> downto <lsb>) := <initial_value>;
waarbij <name> een door de gebruiker gekozen identifier is en <initial_value> optioneel is. <lsb> en <msb> duiden de least en most significant bit indices aan, respectievelijk.

Het to of downto sleutelwoord specificeert de richting van het bereik (d.w.z. endianness). Beide vormen werken, maar de meeste ontwerpers favoriseren downto voor duidelijkheid. Ik raad aan consistent downto te gebruiken bij het declareren van bitvectoren om verwarring te vermijden.

De VHDL-code voor een byte-grote vector is:

signal MySlv : std_logic_vector(7 downto 0);

De VHDL-code voor een één-bit vector is:

signal MySlv : std_logic_vector(0 downto 0);

De VHDL-code voor een leeg bereik (nul bits) is:

signal MySlv : std_logic_vector(-1 downto 0);

Oefening

In deze videotutorial leren we hoe je std_logic_vector-signalen declareert en hun initiële waarden geeft. We leren ook hoe je over de bits in een vector itereert met een For-Loop om een shiftregister te maken:

De definitieve code die we in deze tutorial maakten:

 library ieee; use ieee.std_logic_1164.all; entity T11_StdLogicVectorTb is end entity; architecture sim of T11_StdLogicVectorTb is signal Slv1 : std_logic_vector(7 downto 0); signal Slv2 : std_logic_vector(7 downto 0) := (others => '0'); signal Slv3 : std_logic_vector(7 downto 0) := (others => '1'); signal Slv4 : std_logic_vector(7 downto 0) := x"AA"; signal Slv5 : std_logic_vector(0 to 7) := "10101010"; signal Slv6 : std_logic_vector(7 downto 0) := "00000001"; begin -- Shift register process is begin wait for 10 ns; for i in Slv6'left downto Slv6'right + 1 loop Slv6(i) <= Slv6(i-1); end loop; Slv6(Slv6'right) <= Slv6(Slv6'left); end process; end architecture; 

Het golfform-venster in ModelSim nadat we op run drukten, en inzoomden op de tijdlijn:Std_logic_vector in VHDL onder de knie krijgen: signaalvectoren maken

Analyse

In deze oefening declareerden we zes std_logic_vector-bussen, elk acht bits lang (één byte).

Signaal Slv1 werd gedeclareerd zonder initiële waarde. De bus verschijnt als XX in de golfform-screenshot omdat de hexadecimale weergave onbekende waarden niet kan representeren. Een nader kijken onthult dat de individuele bits eigenlijk U zijn.

Signaal Slv2 gebruikt de aggregate-toewijzing (others => '0') om alle bits op nul te zetten. Deze beknopte syntax zorgt ervoor dat elk element de gespecificeerde waarde ontvangt, ongeacht de vectorbreedte.

Signaal Slv3 gebruikt dezelfde aggregate-techniek om elke bit op één te initialiseren, wat weergegeven wordt als FF (hex voor acht enen).

Signaal Slv4 demonstreert een hexadecimale initialisator: AA. Aangezien elk hex-cijfer vier bits映射t, dekken twee cijfers de 8-bits vector.

Signaal Slv5 bevat de identieke waarde, maar uitgedrukt in binair (10101010). Zowel Slv4 als Slv5 renderen als AA in de golfform.

Signaal Slv6 start met alle nullen behalve de least significant bit ingesteld op 1. Een proces implementeert een linksshiftregister dat de 1 door de vector cycelt elke 10 ns.

Het proces gebruikt de left en right attributen om de code generiek te houden; het vergroten/verkleinen van de vector vereist geen codewijzigingen.

Er bestaan aanvullende attributen, maar die vallen buiten de scope van deze introductietutorial.

Std_logic_vector in VHDL onder de knie krijgen: signaalvectoren maken

Kernpunten

  • N-bit vectoren moeten gedeclareerd worden met std_logic_vector(N-1 downto 0).
  • Een vector kan als geheel toegewezen worden of individuele bits kunnen benaderd worden.
  • Alle bits kunnen genuld worden met de aggregate-toewijzing (others => '0').
  • Het gebruik van attributen zoals 'left en 'right maakt code generiek en onderhoudbaar.

Doe de Basic VHDL Quiz – deel 2 »
of
Ga naar de volgende tutorial »

VHDL

  1. Uitgebreide Gids voor VHDL Type Conversies met Numeric_Std en Std_Logic_Arith
  2. Signed vs. Unsigned Typen in VHDL: Praktische Inzichten
  3. Dynamische string-lijsten in VHDL: Best Practices & Voorbeeld
  4. Een Tcl-gedreven testbench maken voor een VHDL code-lock module
  5. Een VHDL-testbench netjes beëindigen: methoden en best practices
  6. Een PWM-controller implementeren in VHDL: Ontwerp, Simulatie en FPGA-demo
  7. Willekeurige getallen genereren in VHDL: Van Uniform naar OSVVM
  8. Ontwerpen van een robuuste VHDL-ringbuffer FIFO in blok-RAM
  9. Een self-checking testbench in VHDL bouwen – Een praktische gids
  10. Een dynamische gelinkte lijst in VHDL implementeren met protected types en access pointers
  11. In-process procedures benutten voor schonere VHDL FSM-ontwerpen