WebElektronika

Számláló megvalósítása komponensekkel a Nexys 3 FPGA panelon

person access_time 2015.11.12.
Egy korábban bemutatott számlálót készítünk el újra, de most a különböző funkciókat nem egy VHDL file-ban helyezzük el, hanem külön file-okban, amelyeket majd komponensekként fogunk felhasználni.


A korábban bemutatott 1 Hz-es számlálónk két fő részre osztható. Számlálóra és osztóra. Most is ezek fő egységek jelennek meg, de nem egy VDL file-ban külön processekben, hanem egy funkció egy VHDL file-ban került megvalósításra, amelyeket komponensként fogunk felhasználni.

Az első VHDL kód az osztásért felel, azaz, ez osztja le a 100 MHz-es órajelet. Az osztási arány beállítása nem itt történik, hanem ott, ahol felhasználjuk ezt a file-t komponensként.

library IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity oszto is
    port(CLK, CLR : in std_logic;
            OSZTAS : in integer;
            KI : out std_logic);
end oszto;

architecture BEH of oszto is
signal    seged : integer := 0;
begin

    process(CLK, CLR, seged, OSZTAS)
    begin
        if CLR = '1' then
            seged <= 0;
        else
            if rising_edge(CLK) then
                seged <= seged + 1;
            else
                null;
            end if;
        end if;
        if seged < OSZTAS then
            KI <= '0';
        else
            KI <= '1';
            seged <= 0;
        end if;
    end process;
    
end BEH;

 

Ez a VHDL file a számlálásért felel. A bejövő órajelet számolja és 0-255 között tudja megjeleníteni a Nexys 3 panel LED-jein.

library IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity szamlal is
    port(CLK, CLR : in std_logic;
            KI : out std_logic_vector(7 downto 0));
end szamlal;

architecture BEH of szamlal is
signal    SKI : std_logic_vector(7 downto 0);
begin

    process(CLK, CLR, SKI)
    begin
        if CLR = '1' then
            SKI <= (others => '0');
        else
            if rising_edge(CLK) then
                SKI <= SKI + 1;
            else
                null;
            end if;
        end if;
        KI <= SKI;
    end process;
    
end BEH;

 

Ebben a VHDL file-ban alkalmazzuk a korábbi két file-t komponensként. Az osztási arány 1/10000000, az az 0.1 Hz-es jelet számolunk.

library IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity mutat is
    port(CLK, CLR : in std_logic;
            KI : out std_logic_vector(7 downto 0));
end mutat;

architecture BEH of mutat is
    component oszto is
        port(CLK, CLR : in std_logic;
                OSZTAS : in integer;
                KI : out std_logic);
    end component;

    component szamlal is
        port(CLK, CLR : in std_logic;
                KI : out std_logic_vector(7 downto 0));
    end component;
signal    SCLK : std_logic;
begin

    nev1 : oszto port map(CLK, CLR, 10000000, SCLK);
    nev2 : szamlal port map(SCLK, CLR, KI);    
    
end BEH;

 

A Spartan 6-os FPGA lábkiosztásáért az *.ucf file felel, ebben tudjuk megadni szövegesen vagy a PlanAhead szoftverrel az adott portokhoz tartozó lábakat.

NET "CLK" LOC = V10;
NET "CLR" LOC = C9;

NET "KI[0]" LOC = T11;
NET "KI[1]" LOC = R11;
NET "KI[2]" LOC = N11;
NET "KI[3]" LOC = M11;
NET "KI[4]" LOC = V15;
NET "KI[5]" LOC = U15;
NET "KI[6]" LOC = V16;
NET "KI[7]" LOC = U16;

 

Az *.ucf file-t tudjuk szövegesen is szerkeszteni, de javasolt a PlanAhead (user guide) program használata.