การใช้งาน VHDL ของ debouncer


0

ในฐานะที่เป็นส่วนหนึ่งของชั้นเรียนวิชาไฟฟ้าของฉันฉันต้องทำนาฬิกาเป็น VHDL ฉันพยายามทำให้วินาทีกะพริบเป็นจุดระหว่างการแสดงผล 7 ส่วนและแน่นอนแสดงนาทีและชั่วโมง (hh: mm) แต่งานสุดท้ายของฉันคือการเพิ่มปุ่มเพื่อตั้งค่าชั่วโมงและนาที หลังจากสองสามชั่วโมงมีข้อผิดพลาดเกี่ยวกับการแบ่งปันสัญญาณ ฯลฯ ฉันยอมแพ้ ... : s และฉันรู้ว่า VHDL ไม่ได้สำหรับฉันอย่างแน่นอน ใครช่วยบอกวิธีใช้ปุ่มที่มีเพียงสัญญาณเดียวหลังจากคลิก?


-- Company: 
-- Engineer: 
-- 
-- Create Date:    21:33:34 05/20/2019 
-- Design Name: 
-- Module Name:    Zegar - Behavioral 
-- Project Name: 
-- Target Devices: 
-- Tool versions: 
-- Description: 
--
-- Dependencies: 
--
-- Revision: 
-- Revision 0.01 - File Created
-- Additional Comments: 
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;

-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity Zegar is

    Port (
    clock : in STD_LOGIC;
    reset : in STD_LOGIC;
    przycisk : inout STD_LOGIC;
    przycisk : inout STD_LOGIC;
    dot : out STD_LOGIC;
    anoda : inout STD_LOGIC_VECTOR ( 3 downto 0);
    segm : out STD_LOGIC_VECTOR (7 downto 0)

    );
end Zegar;

architecture Behavioral of Zegar is

signal  sec : STD_LOGIC := '0';
signal  sekunda_ENABLE : STD_LOGIC := '0';
signal  minuta_ENABLE : STD_LOGIC := '0';
signal  minuta_DZ_ENABLE : STD_LOGIC := '0';
signal  godzina_ENABLE : STD_LOGIC := '0';

signal mux : STD_LOGIC := '0';
signal wysw : STD_LOGIC_VECTOR (1 downto 0) := "00";
signal bcd : STD_LOGIC_VECTOR (3 downto 0);


signal minuta_jed : STD_LOGIC_VECTOR (3 downto 0) := "0000";
signal minuta_dz : STD_LOGIC_VECTOR (3 downto 0) := "0000";
signal godzina_jed : STD_LOGIC_VECTOR (3 downto 0) := "0000";
signal godzina_dz : STD_LOGIC_VECTOR (3 downto 0) := "0000";

begin

process(clock)

        VARIABLE counter : natural := 0;
        --sekundy
begin

        if(clock'event and clock = '1') then
                if(counter < 50000000) then
                        counter := counter + 1;
                else
                        sec <= not sec;
                        counter := 0;
                end if;
        end if;

end process;

--sekundy 
process(sec, reset)

        VARIABLE counter : natural  range 0 to 60;
begin
        if (reset = '1') then
                counter := 0;
        else if(sec'event and sec = '1') then
                if(counter < 59) then
                        counter := counter + 1;
                                sekunda_ENABLE <= '0';
                else
                        counter := 0;
                        sekunda_ENABLE <= '1';
                end if;
        end if;
end if;

end process;

--minuty jed
process(sekunda_ENABLE, reset)
begin
        if (reset = '1') then
                minuta_jed <= "0000";
        else if(sekunda_ENABLE'event and sekunda_ENABLE = '1') then
                if(minuta_jed < "1001") then
                        minuta_jed <= minuta_jed + 1;
                                minuta_ENABLE <= '0';
                else
                        minuta_jed <= "0000";
                        minuta_ENABLE <= '1';
                end if;
        end if;
end if;

end process;

--minuty dzies
process(minuta_ENABLE, reset)
begin
        if (reset = '1') then
                minuta_dz <= "0000";
        else if(minuta_ENABLE'event and minuta_ENABLE = '1') then
                if(minuta_dz < "0101") then
                        minuta_dz <= minuta_dz + 1;
                                minuta_DZ_ENABLE <= '0';
                else
                        minuta_dz <= "0000";
                        minuta_DZ_ENABLE <= '1';
                end if;
        end if;
end if;
end process;

--godziny jed

process(minuta_DZ_ENABLE, reset)
begin
        if (reset = '1') then
                godzina_jed <= "0000";
        else if(minuta_DZ_ENABLE'event and minuta_DZ_ENABLE = '1') then
                if(godzina_jed < "1001") then
                        godzina_jed <= godzina_jed + 1;
                                godzina_ENABLE <= '0';
                        if(godzina_jed = "0011" and godzina_dz = "0010") then
                                godzina_jed <= "0000";
                                godzina_ENABLE <= '1';
                        end if;
                else
                        godzina_ENABLE <= '1';
                        godzina_jed <= "0000";
                end if;
        end if;
end if;
end process;

--godzina dzies
process(godzina_ENABLE, reset)
begin
        if (reset = '1') then
                godzina_dz <= "0000";
        else if(godzina_ENABLE'event and godzina_ENABLE = '1') then
                if(godzina_dz < "0010") then
                        godzina_dz <= godzina_dz + 1;
                else
                        godzina_dz <= "0000";
                end if;
        end if;
end if;
end process;

--MUX licznik

process(clock)
        VARIABLE counter : natural :=0;
begin
        if(clock'event and clock = '1') then
                if(counter < 100000) then
                        counter := counter + 1;
                else
                        counter := 0;
                        mux <= not mux;
                end if;
        end if;
end process;


process(mux)
begin
        if(mux'event and mux = '1') then
            if(wysw < "11") then 
            wysw <= wysw + 1;
         else              
                wysw <= "00";
             end if;
        end if;

end process;
                with wysw select
                        anoda <= "1110" when "00",
                                                "1101" when "01",
                                                "1011" when "10",
                                                "0111" when "11",
                                                "1111" when others;

                                with anoda select
                                dot <= sec when     "1011",
                                                '1' when others;

                        with wysw select
                        bcd <= godzina_jed when "10",
                                         godzina_dz when "11",
                                         minuta_dz when "01",
                                         minuta_jed when "00",
                                         "1111" when others;

                        with bcd select
                        segm <=         "11000000" when "0000",
                                                "11111001" when "0001",
                                                "10100100" when "0010",
                                                "10110000" when "0011",
                                                "10011001" when "0100", 
                                                "10010010" when "0101",
                                                "10000010" when "0110",
                                                "11111000" when "0111",
                                                "10000000" when "1000",
                                                "10010000" when "1001",
                                                "11111111" when others; 

end Behavioral;>

ฉันต้องเพิ่มสัญญาณหลังจากกดปุ่มไปที่กระบวนการ "- minuty jed" หรือ "--godziny jed" ฉันพยายามสร้างพรีสเกลเลอร์คนอื่นและสร้าง "IF" เช่น "if button = '1' และ anotherprescaler = '1'" จากนั้น "minuta_jed <= minuta_jed + 1;" แต่ฉันล้มเหลว ...

คำตอบ:


2

มีการ debounce:

  1. สวิตช์เด้ง
    • ซึ่งหมายความว่าในการทำพวกเขาทำแล้วแตกแล้วทำก่อนที่จะปิดตัวลงในที่สุด
    • เหมือนกันเมื่อหยุด พวกเขาแตกแล้วทำ ฯลฯ ก่อนจะเปิดออกในที่สุด
  2. สวิทช์ที่แตกต่างกันเด้งแตกต่างกัน จำนวนเวลาที่ใช้ในการชำระแตกต่างกันไปเช่นเดียวกับความเร็วที่พวกเขาตีกลับ
  3. สวิทช์สามารถตีกลับที่แตกต่างกันในการทำและทำลาย สวิทช์บางอย่างทำให้เด้ง แต่ไม่ทำลายหรือเด้งตามระยะเวลาที่แตกต่างกันหรือช่วงเวลาที่แตกต่างกัน

สิ่งใดก็ตามที่ถูกกระตุ้นจากขอบนั่นคือต้องการนับ "สวิตช์กด" จำเป็นต้องกรองสิ่งประดิษฐ์ที่ตีกลับสวิตช์จากการกดสวิตช์จริง

วิธีหักล้าง:

  1. ตัวอย่างช้ากว่าเวลาตัดสินของสวิตช์ (มีช่วงเวลา> 2x เวลาตกตะกอน) นี่เป็นวิธีที่ง่ายที่สุดและช้าที่สุด
  2. สถานะของสวิตช์ตัวกรอง Low-pass (เปลี่ยนตัวแปรแยกเป็นแบบต่อเนื่อง) จากนั้นรันผลลัพธ์ผ่านบล็อกที่มีฮิสเทรีซิส ง่ายในแบบอะนาล็อกสิ้นเปลืองทรัพยากรในระบบดิจิตอล
  3. เรียกใช้สถานะดิบของสวิตช์ผ่านเครื่องสถานะด้วยความล่าช้า

ฉันมีอัลกอริธึม "ดีที่สุด" จำนวนมากสำหรับการดีบั๊ด แต่เพื่อให้ง่ายคุณอาจต้องการเพียงแค่ทำ "เคล็ดลับอย่างช้า ๆ " นี่คือความตายง่ายเชื่อถือได้และดีพอสำหรับการบ้าน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.