Forum: FPGA, VHDL & Co. Zahlenfolge als kombinatorische Logik


von Andrea K. (aeris)


Lesenswert?

Hallo Leute!

Ich hab mal ne Frage zu ner Verilog-Aufgabe, und zwar soll ich eine 
Zahlenreihe als kombinatorische Logik modellieren.

an = (an-4 + an-3 + an-2) / 2

Das ist die Reihe, immer "a index n" oder "a index n-4" ist gemeint.

a0 = 1
a1 = 2
a2 = 3
a3 = 4

Das sind die Startwerte, die Rekursionsformel oben gilt also für n>3.
Die weitere Aufgabenstellung ist:
----------
Eingänge: CLK zu jeder steigenden Flanke werden N inkrementiert und A_N 
aktualisiert
RESET synchron; für RESET = 1 werden N und A_N zurückgesetzt
Ausgänge: A_N aktuelles an
N aktuelles n

Die Berechnung von an soll als ein kombinatorisches Netz beschrieben 
sein, welches durch kein Register unterbrochen wird. Die Register zur 
Speicherung der Zwischenschritte sowie das Register für an sollen je 32 
Bit breit sein. Die Berechnung findet komplett in Integer-Arithmetik 
statt, d. h. bei „/ 2“ werden die Nachkommastellen abgeschnitten.
Simulieren Sie Ihr Modell mit einem von Ihnen erstellten Testrahmen, und 
ver-gleichen Sie die Ergebnisse mit den manuell berechneten Werten.
----------
So, und nun bin ich verwirrt, wie ich diese rekursive Formel genau 
umsetzen soll, mit den Indexwerten und so.

Natürlich ist auch ein Reset geplant, also Grundform natürlich
1
always @(posedge CLK, posedge RESET) begin
2
  if (RESET) begin
3
    A_N = 0;
4
    N = 0;
5
  end
6
  else begin
7
    ...
8
  end

von Günter -. (guenter)


Lesenswert?

Andrea Keil wrote:
> Hallo Leute!
>
> Ich hab mal ne Frage zu ner Verilog-Aufgabe, und zwar soll ich eine
> Zahlenreihe als kombinatorische Logik modellieren.
>
> an = (an-4 + an-3 + an-2) / 2
>
...
> ----------
> So, und nun bin ich verwirrt, wie ich diese rekursive Formel genau
> umsetzen soll, mit den Indexwerten und so.
>
> Natürlich ist auch ein Reset geplant, also Grundform natürlich
>
>
1
> always @(posedge CLK, posedge RESET) begin
2
>   if (RESET) begin
3
>     A_N = 0;
4
>     N = 0;
5
>   end
6
>   else begin
7
>     ...
8
>   end
9
>

Der Ansatz ist ganz gut, aber vielleicht solltest du erst mal das module 
definieren, damit du weißt was für Ein- und Ausgänge du hast.

Also z.B.
1
module folge(clk, reset, a_in, a_out)
2
3
input         clk;
4
input         reset;
5
input  [31:0] a_in;
6
output [31:0] a_out;
7
8
endmodule

Dann teile es auf in einen sequentiellen Teil, das ist der Teil den du 
angefangen hast und einen kombinatorischen Teil.

Natürlich kannst du den sequentielle Teil mit einem indizierten Array 
machen. Du kannst aber die Register auch einzeln definieren, da es nicht 
so viele sind. Also z.B.:
1
reg [31:0] a0;
2
reg [31:0] a1;
3
reg [31:0] a2;
4
reg [31:0] a3;
5
reg [31:0] a4;
6
7
always @(posedge clk, posedge reset)
8
  if(reset) begin
9
   a0 <= 0;
10
   a1 <= 0;
11
   a2 <= 0;
12
   a3 <= 0;
13
   a4 <= 0;
14
  end else begin
15
16
   a0 <= a_in;
17
   a1 <= a0;
18
   a2 <= a1;
19
   a3 <= a2;
20
   a4 <= a3;
21
22
  end

Dieser Teil schiebt nun immer bei einem Takt die a Werte weiter.

Die folgende kombinatorische Logik verknüpft dann die Werte und erzeugt 
das Ausgangssignal a_out, z.B. so:
1
assign a_out = (a4 + a3 + a2) / 2;

Den Code habe ich nicht durch einen Compiler laufen gelassen, es kann 
also sein das da ein paar Syntaxfehler auftauchen. Aber das Prinzip 
sollte verständlich sein. Wahrscheinlich habe ich das mit den 
Startwerten falsch gemacht. Ich bin davon ausgegangen die werde einzeln 
per Clk über a_in eingegeben. Natürlich kannst du die auch beim reset 
setzen und dann raus schieben.

Gruß

Günter

von Andrea K. (aeris)


Lesenswert?

Ah ja, danke, das macht schon erstmal Sinn! Kann es nur leider nicht 
gleicht testen, weil ich dazu erstmal wieder an den Unirechner müsste.
Das mit den Modulgrenzen hab ich nur aus Redundanz weggelassen, das ist 
natürlich klar, dass das drum rum muss :)

Diese assign-Formel hatte ich mir auch schon überlegt, was mein Hänger 
glaub ich war, war dass ich zwischen den Startwerten und den folgenden 
"a"s variablentechnisch einen Unterschied machen wollte, also zwei Sätze 
Variablen dafür.

Was meinst du mit
"Natürlich kannst du die auch beim reset setzen und dann raus schieben."
? Also mit dem "rausschieben". Ich denke, ich werd die Startwerte 
komplett in den RESET-Zweig tun können.

von Günter -. (guenter)


Lesenswert?

Andrea Keil wrote:
> Ah ja, danke, das macht schon erstmal Sinn! Kann es nur leider nicht
> gleicht testen, weil ich dazu erstmal wieder an den Unirechner müsste.
> Das mit den Modulgrenzen hab ich nur aus Redundanz weggelassen, das ist
> natürlich klar, dass das drum rum muss :)

Kennst du Icarus Verilog?

Hier findest du einige Informationen über den Simulator:

http://iverilog.wikia.com/wiki/Main_Page

Zum anschauen von Signalen eignet sich gtkwave:

http://home.nc.rr.com/gtkwave/

Beide sind auch für Windows erhältlich.

...
>
> Was meinst du mit
> "Natürlich kannst du die auch beim reset setzen und dann raus schieben."
> ? Also mit dem "rausschieben". Ich denke, ich werd die Startwerte
> komplett in den RESET-Zweig tun können.

Mit dem "rausschieben" meinte ich einfach, dass die Register a0-a4 ja 
wie ein Schieberegister angeordnet sind. Also mit jedem Takt werden die 
Werte eins weiter geschoben.

Wenn jetzt die Werte bei Reset gesetzt werden, dann werden ja mit jedem 
weiteren Takt die Werte aus der Registerreihe raus geschoben und neue 
Werte kommen über a_in rein.

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.