Forum: FPGA, VHDL & Co. FPGA Programmierungsfehler


von Jimmy (Gast)


Lesenswert?

Hallo zusammen
Ich hab ein kleines problem:
Ich möchte mit jeder steigenden Flanke von clk1 data_in input in einer 
bestimmten speicherregister speichern (insgesamt 7 * 4 Bit zu 
enpfangen).
Das Problem wenn ich 7 in den 2 if Anweisungen schreibe bekomme ich gar 
nichts in data_out. Aber wenn ich 6 in den 2 if Anweisungen schreibe, 
kann ich am Ausgang alle reg_X finden ausser reg_7 der mit mem[6] 
verbunden ist.

Hängt das vielleicht von der deklaration vom Speicherregister?
ich brauche eure Hilfe.
MfG
Jimmy



        reg [3:0] mem [6:0];
  reg [2:0]counter = 3'b000;

always @(posedge clk1) begin
     if(counter < 3'd7) begin
     mem[counter] <= data_in;
     counter <= counter + 3'd1;
                        end
     if(counter == 3'd7) begin
                         sl_comm_rdy <= 1'b1;
                         reg_1 <= mem[0];//
                               reg_2 <= mem[1];//
                               reg_3 <= mem[2];//
                               reg_4 <= mem[3];
                         reg_5 <= mem[4];//
                         reg_6 <= mem[5];//
             reg_7 <= mem[6];

                         end

always @(posedge clk2) begin
data_out <= reg_7;

                       end

von Günter -. (guenter)


Lesenswert?

Jimmy wrote:
> Hallo zusammen
> Ich hab ein kleines problem:
> Ich möchte mit jeder steigenden Flanke von clk1 data_in input in einer
> bestimmten speicherregister speichern (insgesamt 7 * 4 Bit zu
> enpfangen).

Es würde helfen, wenn du noch beschreibst was du an data_out erwartest.

> Das Problem wenn ich 7 in den 2 if Anweisungen schreibe bekomme ich gar
> nichts in data_out. Aber wenn ich 6 in den 2 if Anweisungen schreibe,
> kann ich am Ausgang alle reg_X finden ausser reg_7 der mit mem[6]
> verbunden ist.
>
> Hängt das vielleicht von der deklaration vom Speicherregister?
> ich brauche eure Hilfe.
[...]

Wie ist data_out definiert?

Was soll an data_out ausgeben werden?

1
>   reg [3:0] mem [6:0];
2
>   reg [2:0]counter = 3'b000;
3
> 
4
> always @(posedge clk1) begin
5
>   if(counter < 3'd7) begin
6
>      mem[counter] <= data_in;
7
>      counter <= counter + 3'd1;
8
>   end
9
>   if(counter == 3'd7) begin
10
>      sl_comm_rdy <= 1'b1;
11
>      reg_1 <= mem[0];//
12
>      reg_2 <= mem[1];//
13
>      reg_3 <= mem[2];//
14
>      reg_4 <= mem[3];
15
>      reg_5 <= mem[4];//
16
>      reg_6 <= mem[5];//
17
>      reg_7 <= mem[6];
18
> 
19
>   end
20
21
--- Hier fehlte ein "end" für den always Block
22
23
> 
24
> always @(posedge clk2) begin
25
>   data_out <= reg_7;
26
> 
27
>   end

Dein jetziger Code gibt mit jedem clk2 Signal mem[6] aus. Ist das der 
Sinn?

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.