logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

VHDL: Jak zrealizować licznik impulsów z 4 wejściami zegarowymi?

sesil 28 Gru 2006 14:59 2312 3
REKLAMA
  • #1 3378566
    sesil
    Poziom 16  
    Posty: 281
    Pomógł: 14
    Ocena: 22
    muszę wykonać projekt który zlicza impulsy z 4 niezależnych wejść.

    Mam pytanie czy mogę zrobić taki licznik z 4 wejściami zegarowymi ???
    Chodzi mi czy zrobić to jako jeden process czy 4 niezależne procesy (tylko wtedy nie wiem jak zrobić sumowanie)

    dziś dopiero do tego przysiądę ale już bym wolał wiedzieć z którą wersją kombinować
  • REKLAMA
  • #2 3379017
    pndemon
    Poziom 19  
    Posty: 444
    Pomógł: 35
    Ocena: 18
    rozumiem, że pierwszy z pomysłów polega na podaniu sumy logicznej zliczanych sygnałów na wejście taktujące licznika, jeśli tak to wg mnie, jeżeli jesteś w stanie zagwarantować, że impulsy nie pojawią się w tym samym czasie, albo tak szybko jeden po drugim, że licznik nie zdążyć zareagować, to będzie ok.

    ten drugi pomysł z tego punktu widzenia wydaje się być bezpieczniejszy, na koniec tylko sumujesz wyjścia ze wszystkich liczników i masz wynik, co do procesu sumowania, to przecież są gotowe licznik w bibliotece ieee, masz tam przeciążone operatory '+'.

    pozdrawiam
  • REKLAMA
  • #3 3384207
    sesil
    Poziom 16  
    Posty: 281
    Pomógł: 14
    Ocena: 22
    już zrobiłem ale coś mi nie chce kompilować, gdzieś jest błąd
    Czy suma:=qa+qb+qc+qd; - można tak zrobić???

    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;

    entity licz4 is
    Port ( A : in STD_LOGIC;
    B : in STD_LOGIC;
    C : in STD_LOGIC;
    D : in STD_LOGIC;
    R : in STD_LOGIC;
    Q : out STD_LOGIC_VECTOR (7 downto 0));
    end licz4;
    architecture Behavioral of licz4 is

    begin
    p1: process (R,A)
    variable qa : unsigned(7 downto 0);
    begin
    if R= '0' then qa:="00000000";
    elsif A'event and A='0' then qa:=qa+1;
    elsif qa = 99 then qa:="00000000";
    else qa:=qa;
    end if;
    end process;

    p2: process (R,B)
    variable qb : unsigned(7 downto 0);
    begin
    if R= '0' then qb:="00000000";
    elsif B'event and B='0' then qb:=qb+1;
    elsif qb = 99 then qb:="00000000";
    else qb:=qb;
    end if;
    end process;

    p3: process (R,C)
    variable qc : unsigned(7 downto 0);
    begin
    if R= '0' then qc:="00000000";
    elsif C'event and C='0' then qc:=qc+1;
    elsif qc = 99 then qc:="00000000";
    else qc:=qc;
    end if;
    end process;

    p4: process (R,D)
    variable qd : unsigned(7 downto 0);
    begin
    if R= '0' then qd:="00000000";
    elsif D'event and D='0' then qd:=qd+1;
    elsif qd = 99 then qd:="00000000";
    else qd:=qd;
    end if;
    end process;

    process (qa,qb,qc,qd)
    variable suma : unsigned(7 downto 0);
    suma:=qa+qb+qc+qd;
    if suma:="01100011" then suma:="0000000" else suma:=suma;
    Q<=suma;
    end Behavioral;
  • #4 3386797
    pndemon
    Poziom 19  
    Posty: 444
    Pomógł: 35
    Ocena: 18
    o rany ;]

    generalnie to nie jestem zwolennikiem stosowania zmiennych, gdyż ich syntezowalność bywa wątpliwa, polecam operować na sygnałach

    dlaczego nie chce się kompilować, dlatego że zmienne są dostępne tylko wewnątrz procesu, w którym zostały utworzone, z tego też względu nie mogą występować na liście czułości innego

    generalnie sprawa jest prosta, utwórz 4 sygnały typu std_logic_vector(7 downto 0) i ich używaj w procesach, a zamiast przypisania do zmiennej typu ":=" piszesz "<=" i będzie ok.

    dodatkowo polecam stosowanie nawiasów, bo vhdl nie ma priorytetów operatorów, tzn. wszystkie są równoprawne.
REKLAMA