Debounced rotary button

This commit is contained in:
T-moe
2016-06-13 13:28:09 +02:00
parent f0960edf3c
commit 0d566ce4de
4 changed files with 93 additions and 57 deletions

View File

@@ -12,8 +12,10 @@ entity rotary_dec is
Port ( clk : in std_logic; -- Systemtakt Port ( clk : in std_logic; -- Systemtakt
A : in std_logic; -- Spur A A : in std_logic; -- Spur A
B : in std_logic; -- Spur B B : in std_logic; -- Spur B
right : out std_logic; -- Zaehlrichtung btn : in std_logic; -- Button Input
ce : out std_logic); -- Clock Enable btn_deb : out std_logic; -- Button entprellt
enc_right: out std_logic; -- Zaehlrichtung
enc_ce : out std_logic); -- Clock Enable
end rotary_dec; end rotary_dec;
@@ -21,7 +23,10 @@ architecture Behavioral of rotary_dec is
signal a_old, b_old: std_logic := '0'; signal a_old, b_old: std_logic := '0';
signal a_debounced_reg, a_debounced_next, b_debounced_reg, b_debounced_next : std_logic := '0'; signal a_debounced_reg, a_debounced_next, b_debounced_reg, b_debounced_next : std_logic := '0';
signal counter_a_reg, counter_a_next, counter_b_reg, counter_b_next: unsigned(23 downto 0) := (others => '0'); signal btn_reg, btn_next: std_logic :='0';
signal counter_a_reg, counter_a_next,
counter_b_reg, counter_b_next,
counter_btn_reg, counter_btn_next: unsigned(23 downto 0) := (others => '0');
constant count_max: unsigned(23 downto 0) := to_unsigned(500000,24); --10ms constant count_max: unsigned(23 downto 0) := to_unsigned(500000,24); --10ms
begin begin
@@ -31,15 +36,19 @@ begin
if rising_edge(clk) then if rising_edge(clk) then
counter_a_reg <= counter_a_next; counter_a_reg <= counter_a_next;
counter_b_reg <= counter_b_next; counter_b_reg <= counter_b_next;
counter_btn_reg <= counter_btn_next;
a_debounced_reg <= a_debounced_next; a_debounced_reg <= a_debounced_next;
b_debounced_reg <= b_debounced_next; b_debounced_reg <= b_debounced_next;
a_old <= a_debounced_reg; a_old <= a_debounced_reg;
b_old <= b_debounced_reg; b_old <= b_debounced_reg;
btn_reg <= btn_next;
end if; end if;
end process; end process;
process(A,B, a_debounced_reg, b_debounced_reg, counter_a_reg, counter_b_reg) btn_deb <= btn_reg;
process(A,B, a_debounced_reg, b_debounced_reg, counter_a_reg, counter_b_reg, btn_reg, btn, counter_btn_reg)
begin begin
if(A /= a_debounced_reg and counter_a_reg > count_max) then if(A /= a_debounced_reg and counter_a_reg > count_max) then
@@ -57,6 +66,14 @@ begin
b_debounced_next <= b_debounced_reg; b_debounced_next <= b_debounced_reg;
counter_b_next <= counter_b_reg + 1; counter_b_next <= counter_b_reg + 1;
end if; end if;
if(btn /= btn_reg and counter_btn_reg > count_max) then
btn_next <= btn;
counter_btn_next <= (others => '0');
else
btn_next <= btn_reg;
counter_btn_next <= counter_btn_reg + 1;
end if;
end process; end process;
@@ -68,9 +85,9 @@ variable state: std_logic_vector(3 downto 0);
begin begin
state := a_debounced_reg & b_debounced_reg & a_old & b_old; state := a_debounced_reg & b_debounced_reg & a_old & b_old;
case state is case state is
when "0001" => right <= '0'; ce <= '1'; when "0001" => enc_right <= '0'; enc_ce <= '1';
when "0010" => right <= '1'; ce <= '1'; when "0010" => enc_right <= '1'; enc_ce <= '1';
when others => right <= '0'; ce <= '0'; when others => enc_right <= '0'; enc_ce <= '0';
end case; end case;
end process; end process;

View File

@@ -1,24 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<symbol version="7" name="rotary_dec"> <symbol version="7" name="rotary_dec">
<symboltype>BLOCK</symboltype> <symboltype>BLOCK</symboltype>
<timestamp>2016-6-10T10:5:37</timestamp> <timestamp>2016-6-13T11:22:41</timestamp>
<pin polarity="Input" x="0" y="-160" name="clk" /> <pin polarity="Input" x="0" y="-224" name="clk" />
<pin polarity="Input" x="0" y="-96" name="A" /> <pin polarity="Input" x="0" y="-160" name="A" />
<pin polarity="Input" x="0" y="-32" name="B" /> <pin polarity="Input" x="0" y="-96" name="B" />
<pin polarity="Output" x="384" y="-32" name="ce" /> <pin polarity="Input" x="0" y="-32" name="btn" />
<pin polarity="Output" x="384" y="-96" name="right" /> <pin polarity="Output" x="384" y="-32" name="enc_ce" />
<pin polarity="Output" x="384" y="-96" name="enc_right" />
<pin polarity="Output" x="384" y="-160" name="btn_deb" />
<graph> <graph>
<rect width="256" x="64" y="-192" height="192" /> <rect width="256" x="64" y="-256" height="256" />
<attrtext style="alignment:BCENTER;fontsize:56;fontname:Arial" attrname="SymbolName" x="192" y="-200" type="symbol" /> <attrtext style="alignment:BCENTER;fontsize:56;fontname:Arial" attrname="SymbolName" x="192" y="-264" type="symbol" />
<attrtext style="fontsize:24;fontname:Arial" attrname="PinName" x="72" y="-160" type="pin clk" /> <attrtext style="fontsize:24;fontname:Arial" attrname="PinName" x="72" y="-224" type="pin clk" />
<line x2="0" y1="-224" y2="-224" x1="64" />
<attrtext style="fontsize:24;fontname:Arial" attrname="PinName" x="72" y="-160" type="pin A" />
<line x2="0" y1="-160" y2="-160" x1="64" /> <line x2="0" y1="-160" y2="-160" x1="64" />
<attrtext style="fontsize:24;fontname:Arial" attrname="PinName" x="72" y="-96" type="pin A" /> <attrtext style="fontsize:24;fontname:Arial" attrname="PinName" x="72" y="-96" type="pin B" />
<line x2="0" y1="-96" y2="-96" x1="64" /> <line x2="0" y1="-96" y2="-96" x1="64" />
<attrtext style="fontsize:24;fontname:Arial" attrname="PinName" x="72" y="-32" type="pin B" /> <attrtext style="fontsize:24;fontname:Arial" attrname="PinName" x="72" y="-32" type="pin btn" />
<line x2="0" y1="-32" y2="-32" x1="64" /> <line x2="0" y1="-32" y2="-32" x1="64" />
<attrtext style="alignment:RIGHT;fontsize:24;fontname:Arial" attrname="PinName" x="312" y="-32" type="pin ce" /> <attrtext style="alignment:RIGHT;fontsize:24;fontname:Arial" attrname="PinName" x="312" y="-32" type="pin enc_ce" />
<line x2="384" y1="-32" y2="-32" x1="320" /> <line x2="384" y1="-32" y2="-32" x1="320" />
<attrtext style="alignment:RIGHT;fontsize:24;fontname:Arial" attrname="PinName" x="312" y="-96" type="pin right" /> <attrtext style="alignment:RIGHT;fontsize:24;fontname:Arial" attrname="PinName" x="312" y="-96" type="pin enc_right" />
<line x2="384" y1="-96" y2="-96" x1="320" /> <line x2="384" y1="-96" y2="-96" x1="320" />
<attrtext style="alignment:RIGHT;fontsize:24;fontname:Arial" attrname="PinName" x="312" y="-160" type="pin btn_deb" />
<line x2="384" y1="-160" y2="-160" x1="320" />
</graph> </graph>
</symbol> </symbol>

View File

@@ -4,8 +4,8 @@ MODULE toplevel
SUBMODULE dds SUBMODULE dds
INSTANCE XLXI_2 INSTANCE XLXI_2
SUBMODULE controller SUBMODULE controller
INSTANCE XLXI_90 INSTANCE XLXI_92
SUBMODULE rotary_dec SUBMODULE rotary_dec
INSTANCE XLXI_43 INSTANCE XLXI_91
SUBMODULE lcd_driver SUBMODULE lcd_driver
INSTANCE XLXI_88 INSTANCE XLXI_88

View File

@@ -17,8 +17,6 @@
<signal name="J18_IO2" /> <signal name="J18_IO2" />
<signal name="J18_IO3" /> <signal name="J18_IO3" />
<signal name="J18_IO1" /> <signal name="J18_IO1" />
<signal name="ROT_A" />
<signal name="ROT_B" />
<signal name="XLXN_79" /> <signal name="XLXN_79" />
<signal name="LCD_busy" /> <signal name="LCD_busy" />
<signal name="LCD_RS" /> <signal name="LCD_RS" />
@@ -37,7 +35,10 @@
<signal name="FORM(0)" /> <signal name="FORM(0)" />
<signal name="BTN_EAST" /> <signal name="BTN_EAST" />
<signal name="XLXN_77" /> <signal name="XLXN_77" />
<signal name="ROT_A" />
<signal name="ROT_B" />
<signal name="ROT_CENTER" /> <signal name="ROT_CENTER" />
<signal name="XLXN_181" />
<port polarity="Input" name="CLK_50MHZ" /> <port polarity="Input" name="CLK_50MHZ" />
<port polarity="Output" name="SPI_SCK" /> <port polarity="Output" name="SPI_SCK" />
<port polarity="Output" name="DAC_CS" /> <port polarity="Output" name="DAC_CS" />
@@ -46,8 +47,6 @@
<port polarity="Output" name="J18_IO2" /> <port polarity="Output" name="J18_IO2" />
<port polarity="Output" name="J18_IO3" /> <port polarity="Output" name="J18_IO3" />
<port polarity="Output" name="J18_IO1" /> <port polarity="Output" name="J18_IO1" />
<port polarity="Input" name="ROT_A" />
<port polarity="Input" name="ROT_B" />
<port polarity="Output" name="LCD_RS" /> <port polarity="Output" name="LCD_RS" />
<port polarity="Output" name="LCD_E" /> <port polarity="Output" name="LCD_E" />
<port polarity="Output" name="LCD_DB(7:0)" /> <port polarity="Output" name="LCD_DB(7:0)" />
@@ -57,6 +56,8 @@
<port polarity="Input" name="SW0" /> <port polarity="Input" name="SW0" />
<port polarity="Input" name="SW1" /> <port polarity="Input" name="SW1" />
<port polarity="Input" name="BTN_EAST" /> <port polarity="Input" name="BTN_EAST" />
<port polarity="Input" name="ROT_A" />
<port polarity="Input" name="ROT_B" />
<port polarity="Input" name="ROT_CENTER" /> <port polarity="Input" name="ROT_CENTER" />
<blockdef name="spi_driver"> <blockdef name="spi_driver">
<timestamp>2016-5-20T8:33:2</timestamp> <timestamp>2016-5-20T8:33:2</timestamp>
@@ -122,13 +123,15 @@
<line x2="0" y1="-288" y2="-288" x1="64" /> <line x2="0" y1="-288" y2="-288" x1="64" />
</blockdef> </blockdef>
<blockdef name="rotary_dec"> <blockdef name="rotary_dec">
<timestamp>2016-6-10T10:5:37</timestamp> <timestamp>2016-6-13T11:22:41</timestamp>
<rect width="256" x="64" y="-192" height="192" /> <rect width="256" x="64" y="-256" height="256" />
<line x2="0" y1="-224" y2="-224" x1="64" />
<line x2="0" y1="-160" y2="-160" x1="64" /> <line x2="0" y1="-160" y2="-160" x1="64" />
<line x2="0" y1="-96" y2="-96" x1="64" /> <line x2="0" y1="-96" y2="-96" x1="64" />
<line x2="0" y1="-32" y2="-32" x1="64" /> <line x2="0" y1="-32" y2="-32" x1="64" />
<line x2="384" y1="-32" y2="-32" x1="320" /> <line x2="384" y1="-32" y2="-32" x1="320" />
<line x2="384" y1="-96" y2="-96" x1="320" /> <line x2="384" y1="-96" y2="-96" x1="320" />
<line x2="384" y1="-160" y2="-160" x1="320" />
</blockdef> </blockdef>
<blockdef name="lcd_driver"> <blockdef name="lcd_driver">
<timestamp>2016-6-6T19:34:31</timestamp> <timestamp>2016-6-6T19:34:31</timestamp>
@@ -175,13 +178,6 @@
<blockpin signalname="CLK_50MHZ" name="I" /> <blockpin signalname="CLK_50MHZ" name="I" />
<blockpin signalname="J18_IO1" name="O" /> <blockpin signalname="J18_IO1" name="O" />
</block> </block>
<block symbolname="rotary_dec" name="XLXI_43">
<blockpin signalname="CLK_50MHZ" name="clk" />
<blockpin signalname="ROT_A" name="A" />
<blockpin signalname="ROT_B" name="B" />
<blockpin signalname="XLXN_79" name="ce" />
<blockpin signalname="XLXN_77" name="right" />
</block>
<block symbolname="lcd_driver" name="XLXI_88"> <block symbolname="lcd_driver" name="XLXI_88">
<blockpin signalname="CLK_50MHZ" name="clk" /> <blockpin signalname="CLK_50MHZ" name="clk" />
<blockpin signalname="BTN_EAST" name="reset" /> <blockpin signalname="BTN_EAST" name="reset" />
@@ -215,7 +211,16 @@
<blockpin signalname="SW0" name="I" /> <blockpin signalname="SW0" name="I" />
<blockpin signalname="LED0" name="O" /> <blockpin signalname="LED0" name="O" />
</block> </block>
<block symbolname="controller" name="XLXI_90"> <block symbolname="rotary_dec" name="XLXI_91">
<blockpin signalname="CLK_50MHZ" name="clk" />
<blockpin signalname="ROT_A" name="A" />
<blockpin signalname="ROT_B" name="B" />
<blockpin signalname="ROT_CENTER" name="btn" />
<blockpin signalname="XLXN_79" name="enc_ce" />
<blockpin signalname="XLXN_77" name="enc_right" />
<blockpin signalname="XLXN_181" name="btn_deb" />
</block>
<block symbolname="controller" name="XLXI_92">
<blockpin signalname="CLK_50MHZ" name="clk" /> <blockpin signalname="CLK_50MHZ" name="clk" />
<blockpin signalname="BTN_EAST" name="rst" /> <blockpin signalname="BTN_EAST" name="rst" />
<blockpin signalname="LCD_busy" name="lcd_busy" /> <blockpin signalname="LCD_busy" name="lcd_busy" />
@@ -226,7 +231,7 @@
<blockpin signalname="FREQ(16:0)" name="freq_out(16:0)" /> <blockpin signalname="FREQ(16:0)" name="freq_out(16:0)" />
<blockpin signalname="XLXN_77" name="enc_right" /> <blockpin signalname="XLXN_77" name="enc_right" />
<blockpin signalname="XLXN_79" name="enc_ce" /> <blockpin signalname="XLXN_79" name="enc_ce" />
<blockpin signalname="ROT_CENTER" name="enc_btn" /> <blockpin signalname="XLXN_181" name="enc_btn" />
</block> </block>
</netlist> </netlist>
<sheet sheetnum="1" width="5440" height="3520"> <sheet sheetnum="1" width="5440" height="3520">
@@ -288,20 +293,10 @@
<branch name="J18_IO1"> <branch name="J18_IO1">
<wire x2="3888" y1="1632" y2="1632" x1="3856" /> <wire x2="3888" y1="1632" y2="1632" x1="3856" />
</branch> </branch>
<branch name="ROT_A">
<wire x2="1136" y1="1600" y2="1600" x1="1056" />
</branch>
<branch name="ROT_B">
<wire x2="1136" y1="1664" y2="1664" x1="1056" />
</branch>
<branch name="CLK_50MHZ">
<wire x2="1136" y1="1536" y2="1536" x1="1056" />
</branch>
<branch name="XLXN_79"> <branch name="XLXN_79">
<wire x2="1792" y1="1664" y2="1664" x1="1520" /> <wire x2="1776" y1="1664" y2="1664" x1="1520" />
<wire x2="1792" y1="1664" y2="1664" x1="1776" />
</branch> </branch>
<instance x="1136" y="1696" name="XLXI_43" orien="R0">
</instance>
<branch name="LCD_busy"> <branch name="LCD_busy">
<attrtext style="alignment:SOFT-BCENTER;fontsize:28;fontname:Arial" attrname="Name" x="1648" y="1024" type="branch" /> <attrtext style="alignment:SOFT-BCENTER;fontsize:28;fontname:Arial" attrname="Name" x="1648" y="1024" type="branch" />
<wire x2="784" y1="1024" y2="1728" x1="784" /> <wire x2="784" y1="1024" y2="1728" x1="784" />
@@ -323,9 +318,6 @@
<iomarker fontsize="28" x="3888" y="1632" name="J18_IO1" orien="R0" /> <iomarker fontsize="28" x="3888" y="1632" name="J18_IO1" orien="R0" />
<iomarker fontsize="28" x="4336" y="1808" name="J18_IO4" orien="R0" /> <iomarker fontsize="28" x="4336" y="1808" name="J18_IO4" orien="R0" />
<iomarker fontsize="28" x="3472" y="1632" name="CLK_50MHZ" orien="R180" /> <iomarker fontsize="28" x="3472" y="1632" name="CLK_50MHZ" orien="R180" />
<iomarker fontsize="28" x="1056" y="1600" name="ROT_A" orien="R180" />
<iomarker fontsize="28" x="1056" y="1664" name="ROT_B" orien="R180" />
<iomarker fontsize="28" x="1056" y="1536" name="CLK_50MHZ" orien="R180" />
<instance x="2736" y="1456" name="XLXI_88" orien="R0"> <instance x="2736" y="1456" name="XLXI_88" orien="R0">
</instance> </instance>
<iomarker fontsize="28" x="2656" y="1168" name="CLK_50MHZ" orien="R180" /> <iomarker fontsize="28" x="2656" y="1168" name="CLK_50MHZ" orien="R180" />
@@ -423,16 +415,37 @@
<branch name="CLK_50MHZ"> <branch name="CLK_50MHZ">
<wire x2="1792" y1="1408" y2="1408" x1="1776" /> <wire x2="1792" y1="1408" y2="1408" x1="1776" />
</branch> </branch>
<branch name="ROT_CENTER">
<wire x2="1792" y1="1536" y2="1536" x1="1760" />
</branch>
<branch name="BTN_EAST"> <branch name="BTN_EAST">
<wire x2="1792" y1="1472" y2="1472" x1="1760" /> <wire x2="1792" y1="1472" y2="1472" x1="1760" />
</branch> </branch>
<iomarker fontsize="28" x="1760" y="1536" name="ROT_CENTER" orien="R180" />
<iomarker fontsize="28" x="1760" y="1472" name="BTN_EAST" orien="R180" /> <iomarker fontsize="28" x="1760" y="1472" name="BTN_EAST" orien="R180" />
<iomarker fontsize="28" x="1776" y="1408" name="CLK_50MHZ" orien="R180" /> <iomarker fontsize="28" x="1776" y="1408" name="CLK_50MHZ" orien="R180" />
<instance x="1792" y="1824" name="XLXI_90" orien="R0"> <branch name="ROT_A">
<wire x2="1072" y1="1536" y2="1536" x1="1056" />
<wire x2="1136" y1="1536" y2="1536" x1="1072" />
</branch>
<branch name="ROT_B">
<wire x2="1072" y1="1600" y2="1600" x1="1056" />
<wire x2="1136" y1="1600" y2="1600" x1="1072" />
</branch>
<branch name="CLK_50MHZ">
<wire x2="1072" y1="1472" y2="1472" x1="1056" />
<wire x2="1136" y1="1472" y2="1472" x1="1072" />
</branch>
<iomarker fontsize="28" x="1056" y="1536" name="ROT_A" orien="R180" />
<iomarker fontsize="28" x="1056" y="1600" name="ROT_B" orien="R180" />
<iomarker fontsize="28" x="1056" y="1472" name="CLK_50MHZ" orien="R180" />
<iomarker fontsize="28" x="1104" y="1664" name="ROT_CENTER" orien="R180" />
<instance x="1792" y="1824" name="XLXI_92" orien="R0">
</instance> </instance>
<branch name="ROT_CENTER">
<wire x2="1120" y1="1664" y2="1664" x1="1104" />
<wire x2="1136" y1="1664" y2="1664" x1="1120" />
</branch>
<instance x="1136" y="1696" name="XLXI_91" orien="R0">
</instance>
<branch name="XLXN_181">
<wire x2="1792" y1="1536" y2="1536" x1="1520" />
</branch>
</sheet> </sheet>
</drawing> </drawing>