Hallo! Ich studiere Angewandte Informatik und weiß im Fach Digitaltechnik nicht weiter. Folgende Aufgabe ist zu bewältigen: Erstellen Sie unter Verwendung von ‚Precision RTL Sythesis’ ein FPGA-Projekt für den Baustein: Familie: LatticeEC, Typ: LFEC1E, speed grade: -3, Package: TQFP144. Das Design befindet sich in der Quelldatei v01.vhd. Führen Sie die Schritte „setup design“, „compile“, „synthesize“ und „place & route aus. • Ermitteln Sie aus den Report-Dateien des Entwicklungssystems die höchstmögliche Taktfrequenz, mit der das Design v01.vhd betrieben werden kann. • Berechnen Sie die Frequenz, mit der sich das höchstwertigste Bit des Zählers „ccc“ ändert unter der Annahme, das das Taktsignal clk die Frequenz f = 25 MHz besitzt. Bei dem letzten punkt weiß ich nicht was ich machen soll... Hier der v01.vhd code: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; -- Eingangs- und Ausgangssignale des Moduls v01 entity v01 is port( clk: in std_logic ; b_up: in std_logic; b_left: in std_logic; c_data: out integer range 0 to 255; dp_10: out std_logic ; dp_11: out std_logic ; q: out std_logic_vector ( 6 downto 0 ); p: out std_logic_vector ( 6 downto 0 ); d: out std_logic_vector ( 6 downto 0 ) ); -- Zuordnung der Ein-/Ausgangssignale zu Pin- Nummern des FPGA-Bausteins LFEC1E-3T144C -- general attribute set-up attribute pin_number : string; type exemplar_string_array is array (natural range <>, natural range <>) of character ; attribute array_pin_number : exemplar_string_array ; -- inputs attribute pin_number of clk : signal is "9"; attribute pin_number of b_up : signal is "50"; attribute pin_number of b_left : signal is "51"; -- outputs attribute pin_number of dp_10 : signal is "115"; attribute pin_number of dp_11 : signal is "101"; attribute array_pin_number of q: signal is ("111","112","113","114","116","118","119"); attribute array_pin_number of d: signal is ("100","102","103","104","105","106","107"); attribute array_pin_number of p: signal is ("135","137","138","139","140","141","142"); attribute array_pin_number of c_data: signal is ("27","29","30","31","32","33","34","35"); end v01; -- Ende der Signalbeschreibung -- Beschreibung der logischen Funktionen des Moduls v01 architecture behavior of v01 is -- Liste der internen Signale und Konstanten signal cnt: integer range 0 to 65534; signal scnt: integer range 0 to 2048; signal ccc: integer range 0 to 255; signal i_clk: std_logic ; constant s0: std_logic_vector:= "0000000"; constant s1: std_logic_vector:= "1000000"; constant s2: std_logic_vector:= "0100000"; constant s3: std_logic_vector:= "0010000"; constant s4: std_logic_vector:= "0001000"; constant s5: std_logic_vector:= "0000100"; constant s6: std_logic_vector:= "0000010"; constant s7: std_logic_vector:= "0000001"; begin -- Clock- Teiler process (clk) begin if (clk'event and clk = '1' ) then cnt <= cnt + 1; if (cnt = 32767) then i_clk <= '1'; end if; if (cnt = 0 ) then i_clk <= '0'; end if; end if; end process; -- Zähler mit Dekoder und Ausgangsregistern für LED's und 7-Segmentdisplays process (i_clk) begin if (i_clk'event and i_clk = '1' ) then ccc <= ccc + 1; c_data <= ccc; scnt <= scnt + 1; if (scnt >= 0) and (scnt < 256) then q <= not(s1) ; d <= not(s1); p <= s1; end if; if (scnt >= 256) and (scnt < 512) then q <= not(s2) ; d <= not(s2); p <= s2; end if; if (scnt >= 512) and (scnt < 768) then q <= not(s3) ; d <= not(s3); p <= s3; end if; if (scnt >= 768) and (scnt < 1024) then q <= not(s4) ; d <= not(s4); p <= s4; end if; if (scnt >= 1024) and (scnt < 1280) then q <= not(s5) ; d <= not(s5); p <= s5; end if; if (scnt >= 1280) and (scnt < 1536) then q <= not(s6) ; d <= not(s6); p <= s6; end if; if (scnt >= 1536) and (scnt < 1792) then q <= not(s7) ; d <= not(s7); p <= s7; end if; if (scnt >= 1792) and (scnt < 2048) then q <= not(s0) ; d <= not(s0); p <= s0; end if; end if; end process; -- Ansteuerung der Dezimalpunkte mit Tastern dp_10 <= b_up; dp_11 <= b_left; end behavior; Würde mich über jede Hilfe freuen! Gruß Tobi
@ Tobias (Gast) >• Berechnen Sie die Frequenz, mit der sich das höchstwertigste >Bit des Zählers >„ccc“ ändert unter der Annahme, das das Taktsignal clk die Frequenz f = >25 MHz >besitzt. >Bei dem letzten punkt weiß ich nicht was ich machen soll... Tja, wie wäre es damit? 1.) Suche den Zähler ccc 2.) Ermittle die Bitbreite des Zählers ccc 3.) Berechne die Frequenz des höchstwertigsten Bits. MFG Falk
die erste Frage ist dir ja klar. Bei der zweiten sollst du den Zähler "ccc" im Desing ausfindig machen, dann die Breite des Zählers bestimmen und über die Breite des Zählers kommst darauf, mit welcher Frequenz das höchstwertige Bit des Zählers toggelt, wenn der Takt des Zählers 25 MHz ist.
Okay danke das hat mir schon geholfen, aber ich komme nicht auf die Lösung :S signal ccc: integer range 0 to 255; signal cnt: integer range 0 to 65534; das höchstwertige bit ist 255? Und 25 mhz = 25 000 oder? Was muss ich danach rechnen? Gruß Tobi
Geh mal 3 Meter nach rechts. Du stehst auf dem Schlauch ;) Bitbreite von ccc?
ok wie siehts damit aus: 25 Mhz sind 25000 KHz also 25 000 000 Hz 65 535 * 256 = 16 776 960 dann 16 776 960 / 25 000 000 = 0.6 sec ? d.h. frequenz von cccmax is 1.5 Hz ?
boah das kann doch nicht wahr sein, ich werde daraus nicht schlau... 8 Bit braucht man um 255 darzustellen, aber wie hilft mir das weiter?
Dein Prof hat ausserdem einen kleinen Fehler drin (Oder Aufmerksamkeitstest?). signal cnt: integer range 0 to 65534; Das sollen sicher 65535 sein (2^16-1) @ Tobias Deine Rechnung ist fast richtig. MFG Falk
Noch mal so was: signal scnt: integer range 0 to 2048; Extra ein neues Bit anfangen wegen einem einzigen Zählschritt?? Richtiger wäre wohl doch signal scnt: integer range 0 to 2047; Aus welchem Jahrhundert ist denn die IDEE (bzw. Denkweise) hinter dem Code? Mein Chef würde mich prügeln, wenn ich so unleserliches Zeugs schreiben würde. Z.B.: Ohne Not eine zweite Clock-Domain aufmachen, wer tut denn sowas? UND: eine Hölle voll Komparatoren! Die brauchen einiges an Ressourcen. Wers nicht glaubt: selber ausprobieren. Das könnte ohne Funktionseinschränkung mit einem einfachen Vergleich gelöst werden:
1 | if (scnt = 0) then q <= not(s1) ; d <= not(s1); p <= s1; end if; |
2 | if (scnt = 256) then q <= not(s2) ; d <= not(s2); p <= s2; end if; |
3 | usw. usf. |
Damit gibt es dann ohne Defaultzuweisungen schöne synchrone Latches. Geht hier übrigens ohne weitere Codeänderungen, weil sowieso keine Defaultzuweisungen an q, d und s erfolgen. Und zudem der Fall scnt=2048 nicht abgefangen ist. Viel Spass beim Studium.
Hi, Ich bin an der gleichen Aufgabe dran. Weißt du wie man das berechnen soll ? Denn ich weiß im Moment nicht mehr weiter. mfg Fabian
Ich freu mich schon auf neue Kollegen
Also um die Zahlen aus 0 bis 255 darzustellen brauchst 8 Bit.
(ganzzahliger aufgerundeter logarithmus dualis von der höchsten Zahl,
hat
euer Taschenrechner nur natürlichen oder dekadischen log dann gilt die
Umrechnung: log_2 (x) = ln(x)/ln(2) = log_10(x)/log_10(2)
1. bit wechselt bei jedem takt, halbiert also die Frequenz -> f/2
2. bit, das oberste wechselt bei jedem 1->0 Wechsel des unteren (1) bits
-> f/4
3. bit, das oberste wechselt bei jedem 1->0 Wechsel des zweiten (2) bit
-> f/8
4. bit -> f/16
...
8. bit -> f/???
Klingelst jetzt?
Tobias wrote:
> Hallo!
Ja jetzt hats geklingelt. Danke für die Antwort. Ich stand da voll auf dem Schlauch. mfg Fabian
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.