Hallo zusammen,
ich arbeite mich noch einmal neu, kleinschrittig in programmierbare
Logik ein. Und schon habe ich etwas gefunden was ich nicht hinbekomme.
Vielleicht könnt ihr mir helfen?
Ich möchte für die 4 pushbuttons des Nexys2 für spätere Projekte eine
Komponente machen.
1 | entity nexys2_btn is
|
2 | Generic(g_fclk : integer := 50000000;
|
3 | g_buttons : integer := 4);
|
4 | Port ( isl_clk : in STD_LOGIC;
|
5 | islv_btn : in STD_LOGIC_VECTOR (g_buttons-1 downto 0);
|
6 | osl_btn : out STD_LOGIC_VECTOR (g_buttons-1 downto 0));
|
7 | end nexys2_btn;
|
8 |
|
9 | architecture Behavioral of nexys2_btn is
|
10 | signal slv_btn1 : std_logic_vector(g_buttons-1 downto 0) := (others=>'0');
|
11 | signal slv_btn2 : std_logic_vector(g_buttons-1 downto 0) := (others=>'0');
|
12 | signal slv_btn3 : std_logic_vector(g_buttons-1 downto 0) := (others=>'0');
|
13 | signal i_clkdiv : integer range 0 to g_fclk/20-1 := 0;
|
14 | begin
|
15 |
|
16 | shift_in : process begin
|
17 | wait until rising_edge(isl_clk);
|
18 | if( i_clkdiv < g_fclk/20-1) then
|
19 | i_clkdiv <= i_clkdiv + 1;
|
20 | else
|
21 | i_clkdiv <= 0;
|
22 | slv_btn3 <= slv_btn2;
|
23 | slv_btn2 <= slv_btn1;
|
24 | slv_btn1 <= islv_btn;
|
25 | end if;
|
26 | end process shift_in;
|
27 |
|
28 | osl_btn <= slv_btn1 and slv_btn2 and not slv_btn3; --funktioniert das für den ganzen Vektor? Und wie nur einen schnellen clock lang?
|
29 |
|
30 |
|
31 | end Behavioral;
|
Ich habe die Hardware erst mal in den Schrank gelegt und versuche mich
nur mit ise. In folgender Testbench wird aber gar nichts in die 3
Vektoren slv_btn1...slv_btn3 geschrieben. Ich habe die weiße Fahne in
der Hand und änge fest.
Testbench bekommt folgende Muster. Der Rest ist der Auto-Code von Ise,
also eigentlich nur component und Takterzeugung.
1 | -- Stimulus process
|
2 | stim_proc: process
|
3 | begin
|
4 | -- hold reset state for 100 ns.
|
5 | wait for 100 ns;
|
6 |
|
7 | islv_btn <= "1000";
|
8 | wait for 1 ms;
|
9 | islv_btn <= "0001";
|
10 | wait for 1 ms;
|
11 | islv_btn <= "0010";
|
12 | wait for 1 ms;
|
13 | islv_btn <= "0001";
|
14 | wait for 1 ms;
|
15 | islv_btn <= "0011";
|
16 | wait for 1 ms;
|
17 | islv_btn <= "1111";
|
18 | wait for 1 ms;
|
19 | islv_btn <= "1101";
|
20 | wait for 1 ms;
|
21 | islv_btn <= "1111";
|
22 | wait for 1 ms;
|
23 | islv_btn <= "1111";
|
24 | wait for 1 ms;
|
25 | islv_btn <= "1111";
|
26 | wait for 1 ms;
|
27 |
|
28 | wait;
|
29 | end process;
|
Was mache ich nicht richtig? Und als zweite Frage: wie könnte ich es
erreichen, dass beim erreichen der Entprellbedingung "110" also der
Flanke nur einen schnellen Takt lang das bit im osl_btn gesetzt wäre?
Vielen Dank!