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; |
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
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
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 ;-)
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.
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.
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; |
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.