www.mikrocontroller.net

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

Autor: Andrea Keil (aeris)
Datum: 30.04.2008 09:23

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
always @(posedge CLK, posedge RESET) begin
  if (RESET) begin
    A_N = 0;
    N = 0;
  end
  else begin
    ...
  end
Autor: Günter .. (guenter)
Datum: 30.04.2008 13:20

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
>
>
> always @(posedge CLK, posedge RESET) begin
>   if (RESET) begin
>     A_N = 0;
>     N = 0;
>   end
>   else begin
>     ...
>   end
> 

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.
module folge(clk, reset, a_in, a_out)

input         clk;
input         reset;
input  [31:0] a_in;
output [31:0] a_out;

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.:
reg [31:0] a0;
reg [31:0] a1;
reg [31:0] a2;
reg [31:0] a3;
reg [31:0] a4;

always @(posedge clk, posedge reset)
  if(reset) begin
   a0 <= 0;
   a1 <= 0;
   a2 <= 0;
   a3 <= 0;
   a4 <= 0;
  end else begin

   a0 <= a_in;
   a1 <= a0;
   a2 <= a1;
   a3 <= a2;
   a4 <= a3;

  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:
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
Autor: Andrea Keil (aeris)
Datum: 01.05.2008 15:31

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.
Autor: Günter .. (guenter)
Datum: 01.05.2008 20:31

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.

Antwort schreiben

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

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos verwenden, Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net