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ę

program vhdl-operacja dodawania itp.

Moderatorzy: Jacek Bogusz, Moderatorzy

gibonskc
-
-
Posty: 1
Rejestracja: 9 paź 2007, o 09:15
Lokalizacja: Kraków

program vhdl-operacja dodawania itp.

Postautor: gibonskc » 9 paź 2007, o 09:21

Hej,
potrzebuje krotkiego prostego programu w vhdl'u, ktory bedzie wykonywal operacje dodawania. Musi byc tam jakas petla, ktora przesyla wartosci liczb A i B, np. inkrementujac je-ewentualnie niech beda zadane na stale programowo(czyli bedzie je mozna zmienic jak cos). Program ten ma funkcjonowac razem z microblazem,korzystac z niego.
Czyli ogolnie, program ma przy pomocy microblaze wykonywac operacje dodawania.

Ja nie mam o tym zielonego pojecia. Jak cos moge odwdzieczyc sie skryptem w AS, JS, PHP itp.

pozdr.

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

Postautor: Piotr » 9 paź 2007, o 18:11

Malo precyzjne pytanie: czy projektowny sumator ma byc sprzetowym "dopalaczem" dla MB czy ma to byc jakos inaczej zorganizowane? Ilu bitowe liczby ma dodawac, zapisane w jakim formacie, jak dlugie ma byc slowo wyjsciowe (tzn. czy ma byc akumulacja na wyjsciu) itp.?
Pzdr
PZb

gibonskc

Postautor: gibonskc » 9 paź 2007, o 19:26

Ma to byc cos w stylu koprocesora, tzn. program w vhdl trzeba bedzie zaimplementowac do ukladu Spartan-3. Liczby A i B mialyby byc 4-bitowe i chyba z tego co rozkminiam maja to byc sgnaly. Slowo wyjsciowe byloby tez 4-bitowe-tzn. normalny wynik dodawania, np. 3(0011)+2(0010)=(1001).

Mozna oprzec sie na tym przykladowym module. Przekazuje on czas do MB i wypluwa godzine na konosli na kompie.

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_signed.all;
use IEEE.std_logic_misc.all;
library Unisim;
use Unisim.all;

-------------------------------------------------------------------------------
-- Port declarations
-------------------------------------------------------------------------------

entity RTC is
port (
Rst : in std_logic; --asynchronious
Clk : in std_logic; --50MHz
BCDHourIn : in std_logic_vector (7 downto 0); --Write BCDHour[7:4] - Digit2; BCDHour[3:0] - Digit1
BCDMinIn : in std_logic_vector (7 downto 0); --Write BCDMin[7:4] - Digit2; BCDMin[3:0] - Digit1
BCDSecIn : in std_logic_vector (7 downto 0); --Write CDSec[7:4] - Digit2; BCDSec[3:0] - Digit1
BCDHourOut : out std_logic_vector (7 downto 0); --Read BCDHour[7:4] - Digit2; BCDHour[3:0] - Digit1
BCDMinOut : out std_logic_vector (7 downto 0); --Read BCDMin[7:4] - Digit2; BCDMin[3:0] - Digit1
BCDSecOut : out std_logic_vector (7 downto 0); --Read BCDSec[7:4] - Digit2; BCDSec[3:0] - Digit1

Wr : in std_logic; --Write; '1': time avaliable on BCDHour. BCDMin, BCDSec
-- '0': time set on BCDHour. BCDMin, BCDSec on is stored with rising edge of clk
Stop : in std_logic --external signal to stop clock
);
end entity RTC;

-------------------------------------------------------------------------------
-- Architecture section
-------------------------------------------------------------------------------

architecture IMP of RTC is
signal sig_1sec: std_logic;
signal Hour: std_logic_vector(7 downto 0);
signal Min: std_logic_vector(7 downto 0);
signal Sec: std_logic_vector(7 downto 0);
begin

clock_div: process(clk)
variable counter: integer;
begin
if rising_edge(clk) then
if Rst='1' then
counter:=0;
sig_1sec<='0';
else
if counter=499999 then
counter:=0;
sig_1sec<='1';
else
counter:=counter+1;
sig_1sec<='0';
end if;
end if; --rst
end if; --clk
end process clock_div;

run_time_clock: process(clk)
begin
if ( rising_edge(clk) ) then
if (Rst='1') then
Hour<="00010010";
Min<=(others=>'0');
Sec<=(others=>'0');
else
if ( Wr='0' ) then --read
if(sig_1sec='1' AND stop='0') then
if( Sec(3 downto 0)="1001") then Sec(3 downto 0 )<="0000"; else Sec(3 downto 0)<=Sec(3 downto 0 )+1; end if;

if( Sec(3 downto 0 )="1001") then
if( Sec(7 downto 4)="0101") then Sec(7 downto 4)<="0000"; else Sec(7 downto 4)<=Sec(7 downto 4 )+1; end if;
end if;

if( Sec(7 downto 0 )="01011001") then
if( Min(3 downto 0)="1001") then Min(3 downto 0 )<="0000"; else Min(3 downto 0)<=Min(3 downto 0 )+1; end if;
end if;

if( Sec(7 downto 0 )="01011001" AND Min(3 downto 0)="1001") then
if( Min(7 downto 4)="0101") then Min(7 downto 4)<="0000"; else Min(7 downto 4)<=Min(7 downto 4 )+1; end if;
end if;

if( Sec(7 downto 0 )="01011001" AND Min(7 downto 0 )="01011001") then
if( Hour(7 downto 0)="00001001" ) then Hour(3 downto 0 )<="0000";
elsif (Hour(7 downto 0)="00010010") then Hour(3 downto 0 )<="0001";
else Hour(3 downto 0)<=Hour(3 downto 0 )+1; end if;
end if;

if( Sec(7 downto 0 )="01011001" AND Min(7 downto 0 )="01011001" ) then
if( Hour(7 downto 0)="00001001" ) then Hour(7 downto 4)<="0001";
elsif (Hour(7 downto 0)="00010010") then Hour(7 downto 4)<="0000";
else Hour(7 downto 4 )<=Hour(7 downto 4 ); end if;
end if;
else
Hour<=Hour;
Min<=Min;
Sec<=Sec;
end if; --sig_1sec
else --write
Hour<=BCDHourIn;
Min<=BCDMinIn;
Sec<=BCDSecIn;
end if;--RdNWr
end if; --reset
end if; --clk
end process run_time_clock;

BCDHourOut<=Hour;
BCDMinOut<=Min;
BCDSecOut<=Sec;


end architecture IMP;


Nazwa sygnału Opis
Wr Sygnał zapisu czasu do modułu RTC. Kiedy Wr=’1’ wraz z narastającym
zboczem zegara wpisywany jest czas wystawiony na liniach BCDHourIn,
BCDMinIn, BCDSecIn
BCDHourIn[7:0] Sygnał wejściowy. Godzina w kodzie BCD
BCDMinIn[7:0] Sygnał wejściowy. Minuta w kodzie BCD
BCDSecIn[7:0] Sygnał wejściowy. Sekunda w kodzie BCD
BCDHourOut[7:0] Sygnał do odczytu. Godzina w kodzie BCD
BCDMinOut[7:0] Sygnał do odczytu. Minuta w kodzie BCD
BCDSecOut[7:0] Sygnał do odczytu. Sekunda w kodzie BCD
Stop Sygnał zatrzymania zegara. Stop=1: zegar nie liczy
Rst Reset
Clk Zegar.


Dzieki z gory za pomoc

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 52 gości