Ich habe gestern den Code nochmal etwas geändert:
- Ich habe die Entprell-Routine rausgeworfen, da ich gesehen habe, dass bei den Tastern RC-Glieder sind, mit einer Zeitkonstante von 100ms.
- Ich habe die Sensitivity List den Prozess geändert, der die Tasten abfragt. Zum einen habe ich die Taktfrequenz aus der Sensitivity-List herausgenommen, und stattdessen die Tastersignale reingepackt. Es ist ja sinnvoller den Prozess aufzurufen, wenn sich ein Taster ändert. Ausserdem habe ich einen 4-ten Taster eingebaut. Bei dessen Betätigung wird eine Subtraktion zur Reduktion des Zählersignals (iTimeCnt_s) ausgeführt. Dieses Signal legt fest wie lange der Zähler hochzählt bis die LED getoggelt wird und bestimmt damit die Blinkfrequenz festlegt. Ziel ist es also damit die Blinkfrequenz durch Tastendruck stetig zu erhöhen. Aufgrund dieser Subtraktionsoperation hab ich alle Variablen des Zählers (iCnt_s iTimeCnt), zu Integer gemacht.
Hier der entsprechende Code des geänderten Prozesses:
Code:
---================Change the blinking frequency by Button input==================---
DetectSpeed: process(sBtn0_i, sBtn1_i, sBtn2_i, sBtn3_i)
begin
if (sBtn0_i = '0') then
iTimeCnt_s <= 12500000;
elsif (sBtn1_i = '0') then
iTimeCnt_s <= 25000000;
elsif (sBtn2_i = '0') then
iTimeCnt_s <= 50000000;
elsif (sBtn3_i = '0') and (iTimeCnt_s > 12500000) then
iTimeCnt_s <= iTimeCnt_s - 12500000;
end if;
end process;
Und der gesamte Code des Projektes, das jetzt nur noch aus einer Entity besteht, da die Entprellung rausgeflogen ist:
Code:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_arith.all;
entity blinky_tast_top is
port (
sClk_i : in std_logic;
sBtn0_i, sBtn1_i, sBtn2_i, sBtn3_i : in std_logic;
sLed_o : out std_logic
);
end;
architecture rtl of blinky_tast_top is
-- signals -------------------------------------------------------------------------
signal svCnt_s : integer range 0 to 99999999 := 0;
signal iTimeCnt_s : integer range 0 to 99999999 := 50000000;
signal sLed_s : std_logic :='0';
signal sBtn0_s, sBtn1_s, sBtn2_s, sBtn3_s : std_logic := '1';
begin
---================Change the blinking frequency by Button input==================---
DetectSpeed: process(sBtn0_i, sBtn1_i, sBtn2_i, sBtn3_i)
begin
if (sBtn0_i = '0') then
iTimeCnt_s <= 12500000;
elsif (sBtn1_i = '0') then
iTimeCnt_s <= 25000000;
elsif (sBtn2_i = '0') then
iTimeCnt_s <= 50000000;
elsif (sBtn3_i = '0') and (iTimeCnt_s > 12500000) then
iTimeCnt_s <= iTimeCnt_s - 12500000;
end if;
end process;
---===============================Toggle the LEDs=================================---
Toggle: process(sClk_i, iTimeCnt_s) -- sClk_i -> 50Mhz
begin
if rising_edge(sClk_i) then
svCnt_s <= svCnt_s + 1; -- every clock cycle -> increment
if svCnt_s = iTimeCnt_s then -- After several Time (iTimeCnt_s):
--
svCnt_s <= 0; -- -> reset counter
sLed_s <= not sLed_s; -- -> toggle LED
end if;
end if;
end process;
sLed_o <= sLed_s;
end;
Leider funktioniert das mit der Subtraktion noch nicht. Und wieder einmal weiß ich nicht, was ich falsch gemacht habe. Wenn ich beispielsweise die zweite Taste betätige (sBtn1_s) habe ich Zählt der Counter bis 25000000. Wenn ich danach die neu hinzugefügte Taste betätige, sollte der counter (25000000-12500000=12500000) die Blinkfrequenz verdoppeln. Tut er aber nicht. Stattdessen blinkt die LED langsamer. Ich habe aber nirgends einen Überlauf oder ähnliches
Kann jemand mit Erfahrung die Subtraktion mal beurteielen? Ich kann doch mit Integer addieren und subtrahieren ...
Lesezeichen