Verilog Problem

Gast #2714831
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;
Gast #2714838
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
Gast #2715069
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
Gast #2715548
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.
Gast #2716431
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.
Gast #2717410
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.
Gast #2721087
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren