www.mikrocontroller.net

Forum: FPGA, VHDL & Co. FPGA design aufgabe


Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geh mal 3 Meter nach rechts. Du stehst auf dem Schlauch ;)

Bitbreite von ccc?

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Dirk (Gast)
Datum:

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

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein sorry, sind 7 bit

1111111

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sicher ?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: lkmiller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
  if (scnt = 0)   then  q <= not(s1) ; d <= not(s1); p <= s1;  end if;
  if (scnt = 256) then  q <= not(s2) ; d <= not(s2); p <= s2;  end if;
  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.

Autor: Fabian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fpga Kuechle (fpgakuechle) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Fabian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja jetzt hats geklingelt.
Danke für die Antwort.
Ich stand da voll auf dem Schlauch.

mfg Fabian

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.