FPGA design aufgabe

Gast #671276
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
#671280
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
Gast #671290
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.
Gast #671362
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
Gast #672755
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.
Gast #675579
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren