0% au considerat acest document util (0 voturi)
9 vizualizări7 pagini

Proiectul FPGA

Documentul descrie un ceas cu alarmă proiectat folosind VHDL în Xilinx, care afișează ora pe LED-uri cu șapte segmente. Include un ceas digital de 24 de ore și capacitatea utilizatorului de a seta manual ora prin comutatoare. Designul este implementat cu o diagramă bloc și un cod VHDL care utilizează componente precum un divizor de ceas și un convertor BCD la HEX. Este inclus și un banc de testare pentru a simula funcționalitatea ceasului.

Tradus de

ScribdTranslations
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOCX, PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
9 vizualizări7 pagini

Proiectul FPGA

Documentul descrie un ceas cu alarmă proiectat folosind VHDL în Xilinx, care afișează ora pe LED-uri cu șapte segmente. Include un ceas digital de 24 de ore și capacitatea utilizatorului de a seta manual ora prin comutatoare. Designul este implementat cu o diagramă bloc și un cod VHDL care utilizează componente precum un divizor de ceas și un convertor BCD la HEX. Este inclus și un banc de testare pentru a simula funcționalitatea ceasului.

Tradus de

ScribdTranslations
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOCX, PDF, TXT sau citiți online pe Scribd

Ceas cu alarmă în Xilinx folosind VHDL

Am proiectat un ceas cu alarmă folosind limbajul de programare VHDL în Xilinx. Acest ceas digital este
un ceas reconfigurabil de 24 de ore care afișează ore, minute și secunde pe LED-uri cu șapte segmente. În
plus, utilizatorii pot seta manual ora ceasului digital, inclusiv orele și minutele prin comutatoare.

Implementarea

Diagrama bloc a ceasului cu alarmă


Cod sursa
biblioteca IEEE ;
utilizați IEEE.STD_LOGIC_1164.ALL ;
utilizați IEEE.numeric_std.all ;
entitatea digital_clock este
port (
clk : în std_logic ;
-- ceas 50 MHz
rst_n : în std_logic ;
-- Impuls activ de resetare scăzut, pentru a seta ora la ora și minutul de intrare (ca
-- definit de intrările H_in1, H_in0, M_in1 și M_in0) și al doilea la 00.
-- Pentru funcționarea normală, acest pin de intrare ar trebui să fie 1.
H_in1 : în std_logic_vector ( de la 1 la 0 );
-- Intrare pe 2 biți utilizată pentru a seta cea mai semnificativă cifră a orei a ceasului
-- Valorile valide sunt de la 0 la 2.
H_in0 : în std_logic_vector ( 3 până la 0 );
-- Intrare pe 4 biți utilizată pentru a seta cea mai mică cifră semnificativă a orei a ceasului
-- Valorile valide sunt de la 0 la 9.
M_in1 : în std_logic_vector ( 3 până la 0 );
-- Intrare pe 4 biți folosită pentru a seta cea mai semnificativă cifră a minutelor din ceas
-- Valorile valide sunt de la 0 la 9.
M_in0 : în std_logic_vector ( 3 până la 0 );
-- Intrare pe 4 biți utilizată pentru a seta cea mai mică cifră semnificativă a minutei a ceasului
-- Valorile valide sunt de la 0 la 9.
H_out1 : out std_logic_vector ( 6 până la 0 );
-- Cea mai semnificativă cifră a orei. Valorile valide sunt de la 0 la 2 (valoarea hexazecimală pe LED-ul
cu 7 segmente)
H_out0 : out std_logic_vector ( 6 downto 0 );
-- Cea mai semnificativă cifră a orei. Valorile valide sunt de la 0 la 9 (valoare hexazecimală pe LED-ul
cu 7 segmente)
M_out1 : out std_logic_vector ( 6 până la 0 );
-- Cea mai semnificativă cifră a minutei. Valorile valide sunt de la 0 la 9 (valoarea hexazecimală pe
LED-ul cu 7 segmente)
M_out0 : out std_logic_vector ( de la 6 la 0 )
-- Cea mai semnificativă cifră a minutei. Valorile valide sunt de la 0 la 9 (valoare hexazecimală pe LED-
ul cu 7 segmente)
);
end digital_clock ;
arhitectura Comportamentul digital_clock este
componenta bin2hex
port (
Bin : în std_logic_vector ( 3 până la 0 );
Hout : out std_logic_vector ( de la 6 la 0 )
);
componentă de capăt ;
component clk_div
port (
clk_50 : în std_logic ;
clk_1s : out std_logic
);
componentă de capăt ;
-- [Link] Proiecte FPGA, proiecte VHDL, proiecte Verilog
semnal clk_1s : std_logic ; -- Ceas de 1 secundă
semnal counter_hour, counter_minute, counter_second : întreg ;
-- contor folosind pentru crearea timpului
semnal H_out1_bin : std_logic_vector ( 3 până la 0 ); --Cea mai semnificativă cifră a orei
semnal H_out0_bin : std_logic_vector ( 3 downto 0 ); --Cea mai puțin semnificativă cifră a orei
semnal M_out1_bin : std_logic_vector ( 3 până la 0 ); --Cea mai semnificativă cifră a minutei
semnal M_out0_bin : std_logic_vector ( 3 până la 0 ); --Cea mai puțin semnificativă cifră a minutei
ÎNCEPE
-- creează un ceas de 1 s --|
create_1s_clock : hartă port clk_div (clk_50 => clk, clk_1s => clk_1s);
-- funcţionarea ceasului ---|
începe procesul (clk_1s,rst_n).
-- [Link] Proiecte FPGA, proiecte VHDL, proiecte Verilog
dacă (rst_n = '0' ) atunci
counter_hour <= to_integer(unsigned(H_in1)) * 10 + to_integer(unsigned(H_in0));
counter_minute <= to_integer(unsigned(M_in1)) * 10 + to_integer(unsigned(M_in0));
counter_second <= 0 ;
elsif (marginea_crescătoare(clk_1s)) atunci
counter_second <= counter_second + 1 ;
dacă (counter_second >= 59 ) atunci -- secundă > 59 atunci minutul crește
counter_minute <= counter_minute + 1 ;
counter_second <= 0 ;
dacă (counter_minute >= 59 ) atunci -- minute > 59 atunci ora crește
counter_minute <= 0 ;
counter_hour <= counter_hour + 1 ;
if (counter_hour >= 24 ) then -- hour > 24 apoi setați ora la 0
counter_hour <= 0 ;
termina daca ;
termina daca ;
termina daca ;
termina daca ;
sfarsitul procesului ;
----------------------|
-- Timp de conversie ---|
----------------------|
-- Valoare binară H_out1
H_out1_bin <= x"2" când counter_hour >= 20 altfel
x"1" când counter_hour >= 10 altfel
x"0";
-- Afișaj LED cu 7 segmente pentru H_out1
convert_hex_H_out1 : hartă port bin2hex (Bin => H_out1_bin, Hout => H_out1);
-- H_out0 valoare binară
H_out0_bin <= std_logic_vector (to_unsigned((counter_hour - to_integer(unsigned(H_out1_bin)) * 10 ),
4 ));
-- Afișaj LED cu 7 segmente pentru H_out0
convert_hex_H_out0 : hartă port bin2hex (Bin => H_out0_bin, Hout => H_out0);
-- Valoare binară M_out1
M_out1_bin <= x"5" când counter_minute >= 50 altfel
x"4" când counter_minute >= 40 altfel
x"3" când counter_minute >= 30 altfel
x"2" când counter_minute >= 20 altfel
x"1" când counter_minute >= 10 altfel
x"0";
-- Afișaj LED cu 7 segmente pentru M_out1
convert_hex_M_out1 : hartă port bin2hex (Bin => M_out1_bin, Hout => M_out1);
-- Valoare binară M_out0
M_out0_bin <= std_logic_vector (to_unsigned((counter_minute - to_integer(unsigned(M_out1_bin)) *
10 ), 4 ));
-- Afișaj LED cu 7 segmente pentru M_out0
convert_hex_M_out0 : hartă port bin2hex (Bin => M_out0_bin, Hout => M_out0);
sfârşitul comportamental ;
-- Proiect VHDL: cod VHDL pentru ceas digital
-- BCD la HEX Pentru afișaj cu LED-uri cu 7 segmente
biblioteca IEEE ;
utilizați IEEE.STD_LOGIC_1164.ALL ;
entitatea bin2hex este
port (
Bin : în std_logic_vector ( 3 până la 0 );
Hout : out std_logic_vector ( de la 6 la 0 )
);
final bin2hex ;
arhitectura Comportamentul bin2hex este
ÎNCEPE
proces (Bin)
ÎNCEPE
caz (Bin) este
când "0000" => Hout <= "1000000"; --0--
când "0001" => Hout <= "1111001"; --1--
când "0010" => Hout <= "0100100"; --2--
când "0011" => Hout <= "0110000"; --3--
când "0100" => Hout <= "0011001"; --4--
când "0101" => Hout <= "0010010"; --5--
când "0110" => Hout <= "0000010"; --6--
când "0111" => Hout <= "1111000"; --7--
când "1000" => Hout <= "0000000"; --8--
când "1001" => Hout <= "0010000"; --9--
când "1010" => Hout <= "0001000"; --A--
când "1011" => Hout <= "0000011"; --b--
când "1100" => Hout <= "1000110"; --c--
când "1101" => Hout <= "0100001"; --d--
când "1110" => Hout <= "0000110"; --e--
când alții => Hout <= "0001110";
caz final ;
sfarsitul procesului ;
sfârşitul comportamental ;
-- Proiect VHDL: cod VHDL pentru ceas digital
-- Modul de divizare a ceasului pentru a obține un ceas de 1 secundă
biblioteca IEEE ;
utilizați IEEE.STD_LOGIC_1164.ALL ;
UTILIZAȚI IEEE.STD_LOGIC_UNSIGNED.ALL ;
entitatea clk_div este
port (
clk_50 : în std_logic ;
clk_1s : out std_logic
);
end clk_div ;
arhitectura Comportamentul clk_div este
contor de semnal : std_logic_vector ( 27 downto 0 ) := ( others => '0' );
ÎNCEPE
proces (clk_50)
ÎNCEPE
dacă (marginea_crescătoare(clk_50)) atunci
contor <= contor + x"0000001";
dacă (contor >= x"2FAF080") atunci -- pentru rularea pe FPGA -- comentați când rulați simularea
--if(counter_slow>=x"0000001") atunci -- pentru rularea simulării -- comentați când rulați pe FPGA
contor <= x"0000000";
termina daca ;
termina daca ;
sfarsitul procesului ;
clk_1s <= '0' când contorul < x"17D7840" altfel '1' ;
sfârşitul comportamental ;

COD BANCUL DE PROBARE


BIBLIOTECĂ ieee ;
USE ieee.std_logic_1164.ALL ;
-- Proiect VHDL: cod VHDL pentru ceas digital
ENTITY tb_digital_clock IS
END tb_digital_clock ;
Comportamentul ARHITECTURII tb_digital_clock IS
-- Declarația componentelor pentru unitatea testată (UUT)
COMPONENT ceas_digital
PORT (
clk : IN std_logic ;
rst_n : IN std_logic ;
H_in1 : IN std_logic_vector (de la 1 la 0 );
H_in0 : IN std_logic_vector ( 3 până la 0 );
M_in1 : IN std_logic_vector ( 3 până la 0 );
M_in0 : IN std_logic_vector ( 3 până la 0 );
H_out1 : OUT std_logic_vector ( 6 până la 0 );
H_out0 : OUT std_logic_vector ( 6 până la 0 );
M_out1 : OUT std_logic_vector ( 6 până la 0 );
M_out0 : OUT std_logic_vector ( 6 până la 0 )
);
COMPONENT TERMINAL ;
--Intrari
semnal clk : std_logic := '0' ;
semnal rst_n : std_logic := '0' ;
semnal H_in1 : std_logic_vector ( 1 downto 0 ) := ( others => '0' );
semnal H_in0 : std_logic_vector ( 3 downto 0 ) := ( others => '0' );
semnal M_in1 : std_logic_vector ( 3 downto 0 ) := ( others => '0' );
semnal M_in0 : std_logic_vector ( 3 downto 0 ) := ( others => '0' );

--Ieșiri
semnal H_out1 : std_logic_vector ( 6 downto 0 );
semnal H_out0 : std_logic_vector ( 6 downto 0 );
semnal M_out1 : std_logic_vector ( de la 6 la 0 );
semnal M_out0 : std_logic_vector ( 6 downto 0 );
-- Definițiile perioadei de ceas
constant clk_period : timp := 10 ps;
ÎNCEPE
uut : digital_clock PORT MAP (
clk => clk,
rst_n => rst_n,
H_in1 => H_in1,
H_in0 => H_in0,
M_in1 => M_in1,
M_in0 => M_in0,
H_out1 => H_out1,
H_out0 => H_out0,
M_out1 => M_out1,
M_out0 => M_out0
);
-- Definițiile procesului de ceas
clk_process : proces
ÎNCEPE
clk <= '0' ;
așteptați clk_period / 2 ;
clk <= '1' ;
așteptați clk_period / 2 ;
sfarsitul procesului ;
-- Procesul de stimulare
stim_proc : proces
ÎNCEPE
-- mențineți starea de resetare timp de 100 ns.
rst_n <= '0' ;
H_in1 <= "01";
H_in0 <= x"0";
M_in1 <= x"2";
M_in0 <= x"0";
așteptați 100 ns ;
rst_n <= '1' ;
așteptați clk_period * 10 ;
aștepta ;
sfarsitul procesului ;
SFÂRŞIT ;

S-ar putea să vă placă și