Forum: FPGA, VHDL & Co. Verilog Problem


von hans (Gast)


Lesenswert?

1
              //  Ansprechen des Masterinterfaces
2
3
wire [31:0] data [0:4];        // 4 Byte Datenfeld
4
wire control_fixed_location;
5
wire [31:0] control_write_base;
6
wire [31:0] control_write_length;
7
wire control_go;
8
wire data_to_buffer;
9
wire control_done;
10
wire [1:0]  button_pio_deb;
11
12
assign control_fixed_location = 1'b0;
13
assign control_write_base = 32'h08FFFFAA;
14
assign control_write_length = 32'h00000004;
15
16
reg control_go_reg =1'b0;
17
reg data_to_buffer_reg=1'b0;
18
reg led_pio_reg_1=1'b1;
19
reg led_pio_reg_2=1'b1;
20
reg button_old_1=1'b1;
21
reg button_new_1=1'b1;
22
reg button_old_2=1'b1;
23
reg button_new_2=1'b1;
24
25
Debounce Debounce_1(
26
      .clk(clkin_100),
27
    .keyin(button_pio[0]),
28
    .keyout(button_pio_deb[0])  
29
30
);
31
32
Debounce Debounce_2(
33
      .clk(clkin_100),
34
    .keyin(button_pio[1]),
35
    .keyout(button_pio_deb[1])  
36
);
37
38
39
always @(posedge clkin_100)
40
begin
41
       button_old_1 = button_new_1;
42
      button_new_1 = button_pio_deb[0];
43
 
44
    if ( button_new_1==1'b0 && button_old_1==1'b1)  begin
45
         control_go_reg = 1'b1 ;   
46
         led_pio_reg_1 = 1'b0;
47
        led_pio_reg_2 = 1'b1;
48
        
49
   end
50
   else  begin
51
        control_go_reg= 1'b0; 
52
   end
53
   
54
    button_old_2 = button_new_2;
55
     button_new_2 = button_pio_deb[1];
56
 
57
    if ( button_new_2==1'b0 && button_old_2==1'b1)  begin
58
         data_to_buffer_reg = 1'b1 ;   
59
         led_pio_reg_2 = 1'b0;
60
       led_pio_reg_1= 1'b1;
61
   end
62
   else  begin
63
        data_to_buffer_reg = 1'b0; 
64
   end
65
 
66
    
67
end
68
69
70
71
72
assign data_to_buffer = data_to_buffer_reg;
73
assign control_go = control_go_reg;
74
75
assign data[0] = 32'hAABBAAFF;
76
assign data[1] = 32'hAABBAAFE;
77
assign data[2] = 32'hAABBAAFD;
78
assign data[3] = 32'hAABBAAFC;
79
80
assign led_pio[0] = control_done;
81
assign led_pio[1] = led_pio_reg_1;
82
assign led_pio[2] = led_pio_reg_2;
83
assign led_pio[3] = 1;

von hans (Gast)


Lesenswert?

Hallo helfer,


ich habe ein Problem mit meinem verilog code. ich möchte ein 
Masterinterface ansteuern und dazu sollen 2 Signale jeweils mit einem 
Taster geschalten werden. Ich benutze eine Entprellung in VHDL von 
lothar Miller. Nun mein problem ist das die Abfrage   if ( 
button_new_1==1'b0 && button_old_1==1'b1) nicht erreicht wird.

In der Simulation klappt es und es klappt auch wenn ich statt dem 
debounce Signal (button_pio_deb[0]) das nicht Entprellte benutze.

habe ich irgendwelche Timingprobleme mit dem Debounce Block oder woran 
könnte es scheitern das bei Verwendung des Debounce Signals die LEDs 
nicht geschalten werden aber bei verwendung des prellenden Signals 
schon.


Grüße

von auch Hans (Gast)


Lesenswert?

Hi!
Unabhängig von deinem Problem empfehle ich dir
1
   button_old_1 <= button_new_1;
2
   button_new_1 <= button_pio_deb[0];

statt
1
   button_old_1 = button_new_1;
2
   button_new_1 = button_pio_deb[0];

zu verwenden (eigentlich überall das = durch <= ersetzen; jedenfalls 
innerhalb des always-Blocks).

Und dann google am Besten mal nach dem Unterschied zwischen blocking und 
non-blocking assignments in Verilog und vergiss Zuweisungen mit = in 
einem Block ganz schnell wieder. Sonst wird das hier nicht das letzte 
Problem sein, daß du lösen musst.

Ansonsten poste doch mal den VHDL Code vom Debouncer. Kennt ja nicht 
jeder hier Lothars Code auswendig (schon garnicht wenn es VHDL ist).

Grüße,
Hans

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

auch Hans schrieb:
> Ansonsten poste doch mal den VHDL Code vom Debouncer.
Der muss irgendwo dort sein:
http://www.lothar-miller.de/s9y/categories/5-Entprellung
> Kennt ja nicht jeder hier Lothars Code auswendig
;-)

von auch Hans (Gast)


Lesenswert?

Wird wohl der hier sein.
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.numeric_std.ALL;
4
5
entity Debounce is
6
    Port ( clk    : in  STD_LOGIC;
7
           keyin  : in  STD_LOGIC;
8
           keyout : out  STD_LOGIC);
9
end Debounce;
10
11
architecture Behavioral of Debounce is
12
signal keydeb : std_logic := '0';
13
signal debcnt : integer range 0 to 63 := 0;
14
begin
15
   process begin
16
      wait until rising_edge(clk);
17
      -- XOR
18
      if (keyin=keydeb) then debcnt <= 0;
19
      else                   debcnt <= debcnt+1;
20
      end if;
21
      -- Latch
22
      if (debcnt=63) then keydeb <= keyin; 
23
      end if;
24
   end process;
25
   keyout <= keydeb;
26
27
end Behavioral;

Schließ die LEDs doch für nen Test mal direkt an button_pio_deb an. Dann 
siehst du immerhin ob der Ausgang vom Debouncer funktioniert, wenn du 
denn Taster drückst.

von hans (Gast)


Lesenswert?

hey das problem mit dem schreiben hab ich gelöst hab was im debounce 
ungünstig verändert^^.


habe aber nun eien allg. verilog frage.


ich hab ein reg data_read_reg = 32'h00000000;


und möchte das mit einem wire zuordnen

assign data[0] = data_read_reg; und das wire ist so

wire [31:0] data [0:4];  deklariert


ist das zulässig? Immer wenn ich dieses 4 byte dann senden möchte gibt 
er mit etwas falsches aus aber wenn ich es direkt über den assign befehl 
mache  assign data[0]=32'h0000000 dann geht es.

von Lattice User (Gast)


Lesenswert?

hans schrieb:
> ich hab ein reg data_read_reg = 32'h00000000;

data_read_reg muss so declariert werden:
1
reg [31:0] data_read_reg;

von hans (Gast)


Lesenswert?

achso udn sonst gilt es quasi als 1 Bit reg ?

von auch Hans (Gast)


Lesenswert?

Genau. Und bei der zuweisung von data_read_reg an data würden die Bits 
31 bis 1 mit Nullen aufgefüllt werden.
Für alle Signale die mehr als ein Bit enthalten musst du die Größe bei 
der Deklaration explizit angeben. Sonst wird immer 1 Bit angenommen.
Das einzige, wo Verilog Signalgrößen automatisch anpasst ist bei einem 
"implicit wire". Das aber auch nur in den neueren Verilog Standards. Und 
außerdem sollte man sowas nie verwenden.

von Lattice User (Gast)


Lesenswert?

auch Hans schrieb:
> Das einzige, wo Verilog Signalgrößen automatisch anpasst ist bei einem
> "implicit wire". Das aber auch nur in den neueren Verilog Standards. Und
> außerdem sollte man sowas nie verwenden.

Kann man mit
1
`default_nettype none
unterbinden.

von hans (Gast)


Lesenswert?

1
if ( button_new_2==1'b0 && button_old_2==1'b1 && read_data_available==1'b1)  begin
2
       if((flag==1'b0) & (flag2==1'b0)) begin
3
         data_read_reg <= data[1];
4
        read_buffer_done_reg <= 1'b1 ; 
5
       flag<=1'b1;
6
       led_pio_reg_1<= 1'b1;
7
      end
8
      else if ((flag==1'b1) & (flag2==1'b0)) begin  
9
      data_read_reg_2 <= data[1];
10
      read_buffer_done_reg <= 1'b1 ;
11
        
12
        
13
       led_pio_reg_1<= 1'b0;
14
       read_or_write<=1'b1;
15
       flag2<=1'b1;
16
       end
17
       
18
   end

ich habe mal eine Frage zu diesen Codestück. Ich werte eine fallende 
Flanke eines Buttons aus der entprellt ist. Beim ersten drücken soll 
etwas ausgeführt werden und beim 2. etwas anderes das habe ich durch die 
flags versucht umzusetzen. Nun passiert es aber das manchmal nur das 
erste ausgeführt wird und manchmal beides . Ich weiss nicht woran es 
liegen kann ich habe auch schon versucht die entprellzeit zu verlängern 
das hat aber nichts gebracht. liegt es vielleicht an meiner zuweisung 
der flag werte? Eigentlich werden diese doch erst nach dem zeitschritt 
durch <= übernommen oder versteh ich das falsch.


Danke hans

von hans (Gast)


Lesenswert?

kann e sein das 63 bzw 127 zu wenig im entprell count sind?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

hans schrieb:
> kann e sein das 63 bzw 127 zu wenig im entprell count sind?
Das kommt auf den Takt an. Wenn du da mit 50MHz reindonnerst, dann sind 
127 (=20ns*127 = 2,56us) viel zu wenig. Denn so ein Taster/Schalter 
kann schon mal 50ms lang prellen. Und das ist 20000 mal länger als deine 
Entprellzeit...

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.