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