Goedenamiddag iedereen,
Zit best met een probleempje dat ik niet opgelost krijg.. De bedoeling is om op een fpga bordje met een frequentie van 100mhz een puls Deler/Teller te maken die om de seconden telt (dit met een 4 bit teller)
(Het is in VHDL te doen btw.)
Zal even m'n codes die ik geschreven heb hier zetten en me vervolgens nader verklaren..
Teller
Als ik dit dus implanteer werkt het naar behoren.. Het enkele probleem is dat hij pas begint te tellen na 500ms.
Als ik zoals in de code de deler laat delen door 100*10^6-1 dan begint hij pas vanaf 0 en na 1 sec begint hij te tellen maar dan telt hij maar om de 2 sec..
Dus weet iemand wat ik fout doe
?
Mvg,
Levi.
Zit best met een probleempje dat ik niet opgelost krijg.. De bedoeling is om op een fpga bordje met een frequentie van 100mhz een puls Deler/Teller te maken die om de seconden telt (dit met een 4 bit teller)
(Het is in VHDL te doen btw.)
Zal even m'n codes die ik geschreven heb hier zetten en me vervolgens nader verklaren..
Teller
Delerlibrary IEEE;
use IEEE.STD_LOGIC_1164.all;
use ieee.numeric_std.all;
entity Teller is
Port ( Clk : in STD_LOGIC;
Reset : in STD_LOGIC;
Teller_Out : out STD_LOGIC_VECTOR (3 downto 0));
end Teller;
architecture Behavioral of Teller is
signal Teller_In : integer range 0 to 15;
begin
Cnt_In : process (Clk, Reset)
begin
if reset = '1' then
Teller_In <= 0;
elsif rising_edge(Clk) then
if Teller_In = 15 then
Teller_In <= 0;
else
Teller_In <= Teller_In + 1;
end if;
end if;
end process;
Teller_Out <= STD_LOGIC_Vector(to_unsigned(Teller_In,4)); -- Signaal Count_in veranderen naar een 4 bit tekenloze vector,
-- en kan dan naar een 4 bit vector omgezet worden voor Count_Out.
end Behavioral;
Deler_Teller port mappinglibrary IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Deler is
Port (
Deler_in : in STD_LOGIC;
Reset : in STD_LOGIC;
Deler_out: out STD_LOGIC
);
end Deler;
architecture Behavioral of Deler is
signal Tijdelijk: STD_LOGIC;
signal Teller : integer range 0 to 99999999 := 0;
begin
frequency_Deler: process (Reset, Deler_in) begin
if (Reset = '1') then
Tijdelijk <= '0';
Teller <= 0;
elsif rising_edge(Deler_in) then
if (Teller = 99999999) then
Tijdelijk <= NOT(Tijdelijk);
Teller <= 0;
else
Teller <= Teller + 1;
end if;
end if;
end process;
Deler_out <= Tijdelijk;
end Behavioral;
Dus waar zit hem juist het probleem.. Gezien ik in de teller met een rising edge werk.. Denk ik dus te delen door (100*10^6/2)-1 waarom.. Omdat hij 50% van de tijd een 0 geeft en 50% van de tijd een 1.library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Deler_Teller is
Port ( Deler_in, Reset : in STD_LOGIC;
Teller_Out : out STD_LOGIC_Vector (3 downto 0));
end Deler_Teller;
architecture Behavioral of Deler_Teller is
component Deler is
port (Deler_in, Reset : in STD_Logic;
Deler_Out : out STD_Logic);
end component;
component Teller is
port (Clk, Reset : in STD_Logic;
Teller_Out : out STD_Logic_Vector (3 downto 0));
end component;
signal s1 : STD_Logic;
begin
D1 : Deler port map (Deler_In => Deler_In, Reset => Reset, Deler_Out => s1);
T1 : Teller port map (Clk => s1, Reset => Reset, Teller_Out => Teller_Out);
end Behavioral;
Als ik dit dus implanteer werkt het naar behoren.. Het enkele probleem is dat hij pas begint te tellen na 500ms.
Als ik zoals in de code de deler laat delen door 100*10^6-1 dan begint hij pas vanaf 0 en na 1 sec begint hij te tellen maar dan telt hij maar om de 2 sec..
Dus weet iemand wat ik fout doe
Mvg,
Levi.
"Small minds discuss persons. Average minds discuss events. Great minds discuss ideas. Really great minds discuss mathematics."