Hallo ich habe verständnis fragen zum Programmieren eines VHDL code (Addierer) auf ein FPGA (CycloneII). ich habe folgenden 4 bit Addierer programmiert : entity adder is port( a : in signed(3 downto 0); b : in signed(3 downto 0); sum : out signed(4 downto 0) ); end adder; architecture addierer of adder is signal temp : signed(4 downto 0); begin temp <= (resize(a,5) + resize(b,5)); sum <= temp; end addierer; soweit ist gut. Jetzt stellen sich folgende Aufgaben : mit einem CLK sollen ein Synchron und Asynchron Addierern gebaut werden. Ich habe verständliche Probleme und zwar : - ein Clock wird benötigt. Warum? der Addierer kriegt zwei 4bit Werte von außen. wozu der Takt? -wo liegt der Unterschied zwischen synchron und asynchron Addierer. - wie kann ich mein Addierer Synchron programmieren? Vielen Dank im Voraus. Julia
Für einen synchronen Addierer brauchst du natürlich erstmal noch nen Input Pin namens clk. Dann fügst du in die architecture nen process ein, in die sensitivitylist kommt clk. Am Anfang vom process machst du ein if(rising_edge(clk)). so addiert der Adder nur bei steigender Taktflanke.
Verschiedene Varianten für deine Kollegen, JuliO ;-)
1 | entity adder is |
2 | port( |
3 | clk : in std_logic; |
4 | a : in signed(3 downto 0); |
5 | b : in signed(3 downto 0); |
6 | sum : out signed(4 downto 0) |
7 | );
|
8 | end adder; |
9 | |
10 | architecture addierer of adder is |
11 | |
12 | signal temp : signed(4 downto 0); |
13 | |
14 | begin
|
15 | |
16 | temp <= (resize(a,5) + resize(b,5)) when rising_edge(clk); |
17 | sum <= temp; |
18 | |
19 | end addierer; |
1 | entity adder is |
2 | port( |
3 | clk : in std_logic; |
4 | a : in signed(3 downto 0); |
5 | b : in signed(3 downto 0); |
6 | sum : out signed(4 downto 0) |
7 | );
|
8 | end adder; |
9 | |
10 | architecture addierer of adder is |
11 | |
12 | signal temp : signed(4 downto 0); |
13 | |
14 | begin
|
15 | |
16 | temp <= (resize(a,5) + resize(b,5)); |
17 | sum <= temp when rising_edge(clk); |
18 | |
19 | |
20 | end addierer; |
1 | entity adder is |
2 | port( |
3 | clk : in std_logic; |
4 | a : in signed(3 downto 0); |
5 | b : in signed(3 downto 0); |
6 | sum : out signed(4 downto 0) |
7 | );
|
8 | end adder; |
9 | |
10 | architecture addierer of adder is |
11 | |
12 | signal temp : signed(4 downto 0); |
13 | |
14 | begin
|
15 | |
16 | sum <= temp; |
17 | |
18 | process(clk) |
19 | begin
|
20 | if rising_edge(clk) then |
21 | temp <= (resize(a,5) + resize(b,5)); |
22 | end if; |
23 | end process; |
24 | |
25 | end addierer; |
1 | entity adder is |
2 | port( |
3 | clk : in std_ulogic; |
4 | a : in signed(3 downto 0); |
5 | b : in signed(3 downto 0); |
6 | sum : out signed(4 downto 0) |
7 | );
|
8 | end adder; |
9 | |
10 | architecture addierer of adder is |
11 | |
12 | begin
|
13 | |
14 | process
|
15 | begin
|
16 | wait until rising_edge(clk); |
17 | sum <= ( resize( a, 5) + resize( b, 5)); |
18 | end process; |
19 | |
20 | end addierer; |
Hier meine Variante, ganz ohne Prozess... ;-)
1 | entity adder is |
2 | port( |
3 | clk : in std_ulogic; |
4 | a : in signed(3 downto 0); |
5 | b : in signed(3 downto 0); |
6 | sum : out signed(4 downto 0) |
7 | );
|
8 | end adder; |
9 | |
10 | architecture addierer of adder is |
11 | begin
|
12 | |
13 | sum <= (resize(a,5) + resize(b,5)) when rising_edge(clk); |
14 | |
15 | end addierer; |
Oliver Wachter schrieb: > Ihr macht hier dem Herrn "Julia" die Hausaufgaben. Das ist doch sein oder ihr Problem... Spätestens in der Prüfung muß er/sie es selber können.
Danke sehr für die Hilfe und schnelle Antworten. Wie sieht dann ein Code für Asynchron Addierer. Nun, was ist aber der Unterschied zwischen asynchron und synchron Addierer? Asynchron wird der Carrierer etwa von einem Volladdierer zum anderen weitergeleitet.? ist so richtig? es geht eigentlich mehr um Verstehen. Danke euch nochmal ..
Julia schrieb: > Wie sieht dann ein Code für Asynchron Addierer. So:
1 | entity adder is |
2 | port( |
3 | --- clk : in std_ulogic;
|
4 | a : in signed(3 downto 0); |
5 | b : in signed(3 downto 0); |
6 | sum : out signed(4 downto 0) |
7 | );
|
8 | end adder; |
9 | |
10 | architecture addierer of adder is |
11 | begin
|
12 | |
13 | sum <= (resize(a,5) + resize(b,5)); --- when rising_edge(clk); |
14 | |
15 | end addierer; |
> Nun, was ist aber der Unterschied zwischen asynchron und synchron > Addierer? Der Takt. > Asynchron wird der Carrierer etwa von einem Volladdierer zum > anderen weitergeleitet.? Das Carry ergibt sich automatisch und hat mit synchron/asynchron nichts zu tun...
Julia schrieb: > Danke sehr für die Hilfe und schnelle Antworten. > Wie sieht dann ein Code für Asynchron Addierer. > > Nun, was ist aber der Unterschied zwischen asynchron und synchron > Addierer? Asynchron wird der Carry etwa von einem Volladdierer zum > anderen weitergeleitet.? ist so richtig? es geht eigentlich mehr um > Verstehen. > > > Danke euch nochmal ..
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.