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'

Gandi
-
-
Posty:4
Rejestracja:10 maja 2005, o 14:26
Lokalizacja:polska
VHDL i proste zliczanie '1'

Postautor: Gandi » 10 maja 2005, o 14:38

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.

Piotr
Moderator
Moderator
Posty:468
Rejestracja:14 lut 2003, o 13:53
Lokalizacja:Warszawa
Kontaktowanie:

Postautor: Piotr » 10 maja 2005, o 18:59

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

Gandi
-
-
Posty:4
Rejestracja:10 maja 2005, o 14:26
Lokalizacja:polska

Postautor: Gandi » 10 maja 2005, o 21:16

Od paru dni zajmuje sie VHDL'em i nie mam jeszcze rozeznania. Nie wpadlem na to by uzyc wlasnie typu: std_logic_vector (2 downto 0) := "000". Dziala, dziekuje.

Piotr
Moderator
Moderator
Posty:468
Rejestracja:14 lut 2003, o 13:53
Lokalizacja:Warszawa
Kontaktowanie:

Postautor: Piotr » 10 maja 2005, o 21:32

Typ nie ma znaczenia. uzylem std_logic_vector bo nie wydawalo mi sie, ze bedzie Ci sie chcialo bawic z konwersja integer'a.
Pzdr
PZb

Gandi
-
-
Posty:4
Rejestracja:10 maja 2005, o 14:26
Lokalizacja:polska

Postautor: Gandi » 10 maja 2005, o 22:48

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;

Piotr
Moderator
Moderator
Posty:468
Rejestracja:14 lut 2003, o 13:53
Lokalizacja:Warszawa
Kontaktowanie:

Postautor: Piotr » 10 maja 2005, o 22:57

Tym razem dam Ci wedke, a nie rybe. Potrafisz narysowac sobie schemat blokowy takiego ukladu? Skorzystaj na przyklad z gotowych bloczkow TTL.
Jak nie dasz rady, to daj znac.
Pzdr
PZb

Gandi
-
-
Posty:4
Rejestracja:10 maja 2005, o 14:26
Lokalizacja:polska

Postautor: Gandi » 11 maja 2005, o 15:13

Czy jest w Max+plus w edytorze graficznym, taki element (symbol) ktory po doprowadzeniu liczby dziesietnej rozbija ja na odpowiednie bity? (2 -> 010) ? Musze wysterowac multiplekser ta liczba, a o ile wiem sa tylko takie wysterowywane bitowo.

Piotr
Moderator
Moderator
Posty:468
Rejestracja:14 lut 2003, o 13:53
Lokalizacja:Warszawa
Kontaktowanie:

Postautor: Piotr » 11 maja 2005, o 20:24

Konwertowal? Nie ma.
Pzdr
PZb

Awatar użytkownika
bis
-
-
Posty:134
Rejestracja:12 maja 2005, o 08:11
Lokalizacja:Warszawa

Postautor: bis » 12 maja 2005, o 08:32

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]

Piotr
Moderator
Moderator
Posty:468
Rejestracja:14 lut 2003, o 13:53
Lokalizacja:Warszawa
Kontaktowanie:

Postautor: Piotr » 12 maja 2005, o 15:11

[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

Wróć do „PLD/FPGA i inne zagadnienia techniki cyfrowej”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 0 gości