ในฐานะที่เป็นส่วนหนึ่งของชั้นเรียนวิชาไฟฟ้าของฉันฉันต้องทำนาฬิกาเป็น 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;" แต่ฉันล้มเหลว ...