Forum: FPGA, VHDL & Co. FPGA design aufgabe


von Tobias (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ 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

von Schlumpf (Gast)


Lesenswert?

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.

von Tobias (Gast)


Lesenswert?

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

von Ich (Gast)


Lesenswert?

Geh mal 3 Meter nach rechts. Du stehst auf dem Schlauch ;)

Bitbreite von ccc?

von Tobias (Gast)


Lesenswert?

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 ?

von Dirk (Gast)


Lesenswert?

Nicht mal fast.
Wieviel Bits benötigt man um den Wert 255 darzustellen ?

von Tobias (Gast)


Lesenswert?

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?

von Tobias (Gast)


Lesenswert?

nein sorry, sind 7 bit

1111111

von Dirk (Gast)


Lesenswert?

Sicher ?

von Falk B. (falk)


Lesenswert?

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

von lkmiller (Gast)


Lesenswert?

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.

von Fabian (Gast)


Lesenswert?

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

von Fpgakuechle K. (Gast)


Lesenswert?

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!

von Fabian (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.