
Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięVHDL i proste zliczanie '1'
Moderatorzy:Jacek Bogusz, Moderatorzy
Witam
Mam jeden sygnal wejsciowy S1, ktorego ustawiam raz na '1' raz na '0' itd.
Chce zliczyc ilosc wystapien '1' gdy je ustawie. Ale zliczanie typu:
if S1='1' then A:=A+1; else A:=A; end if; NIE DZIALA
S1 to: S1: in bit
A to: variable A :integer range 0 to 5;
Problem jest w tym ze nie zwieksza mi sie stan. Jak zmusic aby zmienna zwiekszala sie o 1 z kazdym wystapieniem '1'. Musze miec ilosc '1' pod ta zmienna.
Z gory dzieki.
Mam jeden sygnal wejsciowy S1, ktorego ustawiam raz na '1' raz na '0' itd.
Chce zliczyc ilosc wystapien '1' gdy je ustawie. Ale zliczanie typu:
if S1='1' then A:=A+1; else A:=A; end if; NIE DZIALA
S1 to: S1: in bit
A to: variable A :integer range 0 to 5;
Problem jest w tym ze nie zwieksza mi sie stan. Jak zmusic aby zmienna zwiekszala sie o 1 z kazdym wystapieniem '1'. Musze miec ilosc '1' pod ta zmienna.
Z gory dzieki.
To dziala na pewno.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ew is port (
S1: in std_logic;
ao: out std_logic_vector (2 downto 0)
);
end ew;
architecture Behavioral of ew is
begin
process (S1) is
variable a : std_logic_vector (2 downto 0) := "000";
begin
if S1='1' then A:=A+1;
else A:=A;
end if;
ao <= a;
end process;
end Behavioral;
Pzdr
PZb
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ew is port (
S1: in std_logic;
ao: out std_logic_vector (2 downto 0)
);
end ew;
architecture Behavioral of ew is
begin
process (S1) is
variable a : std_logic_vector (2 downto 0) := "000";
begin
if S1='1' then A:=A+1;
else A:=A;
end if;
ao <= a;
end process;
end Behavioral;
Pzdr
PZb
A co w przypadku gdy mam dwa sygnaly S1 i S2 i osobno chce zliczac ich wystapienia, a potem zsumowac? Taki kod jest bledny:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ew is port (
S1,S2: in std_logic;
ao: out std_logic_vector (2 downto 0)
);
end ew;
architecture Behavioral of ew is
begin
process (S1,S2) is
variable a,b,c : std_logic_vector (2 downto 0) := "000";
begin
if S1='1' then A:=A+1; else A:=A; end if;
if S2='1' then B:=B+1; else B:=B; end if;
c:=a+b;
ao <= c;
end process;
end Behavioral;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ew is port (
S1,S2: in std_logic;
ao: out std_logic_vector (2 downto 0)
);
end ew;
architecture Behavioral of ew is
begin
process (S1,S2) is
variable a,b,c : std_logic_vector (2 downto 0) := "000";
begin
if S1='1' then A:=A+1; else A:=A; end if;
if S2='1' then B:=B+1; else B:=B; end if;
c:=a+b;
ao <= c;
end process;
end Behavioral;
przykłady Piotra i Gandiego będą działały wyłącznie w symulatorze. Wtedy proces jest uaktywniany wyłącznie na zmianę zadeklarowanych sygnałów.
Zupełnie nie będzie to działało w realnym układzie
Ja raczej zastosował bym proste zliczanie "ZBOCZY W GÓRĘ"
na jakimś liczniku
coś na kształt:
if rising_edge( S ) then
A <= A +1;
endif
Zapis inkrementacji licznika zależy od typu na jakim zliczasz.
Resztę musisz dopisać sobie sam w zależności od innych wymagań projektu.[/fade]
Zupełnie nie będzie to działało w realnym układzie
Ja raczej zastosował bym proste zliczanie "ZBOCZY W GÓRĘ"
na jakimś liczniku
coś na kształt:
if rising_edge( S ) then
A <= A +1;
endif
Zapis inkrementacji licznika zależy od typu na jakim zliczasz.
Resztę musisz dopisać sobie sam w zależności od innych wymagań projektu.[/fade]
[quote="bis"]przykłady Piotra i Gandiego będą działały wyłącznie w symulatorze. Wtedy proces jest uaktywniany wyłącznie na zmianę zadeklarowanych sygnałów.
Zupełnie nie będzie to działało w realnym układzie
*** Polecam weryfikacje tego stwierdzenia w sprzecie.
Ja raczej zastosował bym proste zliczanie "ZBOCZY W GÓRĘ"
na jakimś liczniku
coś na kształt:
if rising_edge( S ) then
A <= A +1;
endif
Zapis inkrementacji licznika zależy od typu na jakim zliczasz.
Resztę musisz dopisać sobie sam w zależności od innych wymagań projektu.
*** Jest to oczywiscie zdecydowanie lepsze rozwiazanie, ale wyznaczony punkt startu wskazywal na nieco inna sciezke.
Pzdr
PZb
Zupełnie nie będzie to działało w realnym układzie
*** Polecam weryfikacje tego stwierdzenia w sprzecie.
Ja raczej zastosował bym proste zliczanie "ZBOCZY W GÓRĘ"
na jakimś liczniku
coś na kształt:
if rising_edge( S ) then
A <= A +1;
endif
Zapis inkrementacji licznika zależy od typu na jakim zliczasz.
Resztę musisz dopisać sobie sam w zależności od innych wymagań projektu.
*** Jest to oczywiscie zdecydowanie lepsze rozwiazanie, ale wyznaczony punkt startu wskazywal na nieco inna sciezke.
Pzdr
PZb
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 2 gości