WebElektronika

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

person access_time 2015.11.02.
Egy olyan aszinkron törlésű számlálót készítünk el VHDL nyelven egy Spartan 6 FPGA panelon, amelynek a 8 bites kimenetét összekötjük a panelon lévő LED-ekkel. Szeretnénk látni a LED-eken a számlálást, ezért kell egy osztó is, amely a 100 MHz-es órajelet leosztja 1 Hz-es jellé. Ezt az 1 Hz-es jelet fogjuk számolni és a LED-eken megjeleníteni.


A Digilent készít különböző fejlesztőeszközöket, tesztpaneleket, műszereket. A termékkínálatában megtalálhatók az FPGA-s fejlesztőpanelek is.
A Nexys 3 panelen egy Spartan 6-os FPGA található, amelynek az egyik globális órajelbemenetére 100 MHz -es órajel csatlakozik. 

Használjuk fel ezt, készítsünk egy olyan számlálót, amellyel 1 Hz-es jelet számolunk, az eredményt pedig megjelenítjük a panelon lévő LED soron.

Az osztót és a számlálót egy VHDL file-ban készítjük el, tehát nem használunk fel komponenseket. A 100 MHz-es jelet leosztjuk egy process-ben, a számlálást pedig egy másik processben valósítjuk meg.

A következő VHDL entitásneve az "oszto", noha nem csak az osztás megvalósításáért felel ez a kód, hanem a számlálásért is.

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

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

architecture BEH of oszto is
signal    seged : integer := 0;
signal    temp : std_logic;
signal    SKI : std_logic_vector(7 downto 0);
begin

    process(CLK, CLR, seged)
    begin
        if CLR = '1' then
            seged <= 0;
        else
            if rising_edge(CLK) then
                seged <= seged + 1;
            else
                null;
            end if;
        end if;
        if seged < 100000000 then
            temp <= '0';
        else
            temp <= '1';
            seged <= 0;
        end if;
    end process;
    
    
    process(CLR, temp, SKI)
    begin
        if CLR = '1' then
            SKI <= (others => '0');
        else
            if rising_edge(temp) then
                SKI <= SKI + 1;
            else
                null;
            end if;
        end if;
        KI <= SKI;
    end process;
    
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;

 

A Spartan 6-os FPGA-ban elhelyezkedő áramkörünket a Floorplan editor segítségével tekintetjük meg (1. ábra).

kep
1. ábra   Floorplan elemzés