Sunteți pe pagina 1din 5

Partea II: VHDL

A.i) Să se implementeze în VHDL un model comportamental pentru circuitul proiectat şi


analizat dinamic în Partea I. În cadrul modelului se vor defini si utiliza constante generice
parametrii dinamici determinaţi prin simulare (timpi de propagare clock→ieşire,
setup_time şi hold_time).

library IEEE;
use IEEE.std_logic_1164.all;
entity mo_SDFFSR is
port( D,SI,SE,CK,SN,RN:in BIT;Q,QN:out BIT);
end SDFFSR;
architecture comportamental of SDFFSR is
signal QINT,QNINT: BIT;
begin
process(D,SI,SE,CK, RN,SN)
begin
if RN='0' then
if SN='0' then
QINT<='1';
QNINT<='0';
elsif SN='1' then
QINT<='0';
QNINT<='1';
end if;
elsif RN='1' then
if SN='0' then
QINT<='1';
QNINT<='0';
elsif SN='1' then
if falling_edge(CK) then
QINT<=QINT;
QNINT<=QNINT;
end if;
if D='1' then
if SE='0' and rising_edge(CK) then
QINT<='1';
QNINT<='0';
end if;
elsif D='0' then
if SE='0' and rising_edge(CK) then
QINT<='0';
QNINT<='1';
end if;
end if;
if SI='1' then
if SE='1' and rising_edge(ck) then
QINT<='1';
QNINT<='0';
end if;
elsif SI='0' then
if SE='1' and rising_edge(CK) then
QINT<='0';
QNINT<='1';
end if;
end if;
end if;
end if;
end process;
Q<=QINT;
QN<=QNINT;
end comportamental;
ii)Să se implementeze o entitate de test şi să se simuleze modelul de lapunctul i)

library IEEE;
use IEEE.std_logic_1164.all;
entity mo_Test_SDFFSR is end;
architecture Test of mo_Test_SDFFSR is
component SDFFSR
port( D,SI,SE,CK,SN,RN:in BIT;Q,QN:out BIT);
end component;
signal SD,SSI,SSE,SCK,SSN,SRN,SQ,SQN: BIT;
for all:SDFFSR use entity work.SDFFSR(comportamental);
begin
UUT: SDFFSR port map (SD,SSI,SSE,SCK,SSN,SRN,SQ,SQN);
Process
Begin
SD<='1','0' after 40 ns;
SSN<='0','1' after 5 ns,'0' after 50 ns,'1' after 55 ns;
SRN<='0','1' after 10 ns,'0' after 60 ns,'1' after 70 ns;
SSI<='0','1' after 20 ns,'0' after 40 ns;
SSE<='0','1' after 15 ns,'0' after 30 ns,'1' after 45 ns;

for i in 1 to 13 loop
SCK<='0','1' after 3 ns;
wait for 6 ns;
end loop;
end process;
end;
B.
Denumirea circuitului:Circuit de incrementare/decrementare
Descriere:Circuitul adună 1 sau scade 1 dintr-un număr de intrare A rezultatul fiind SUM. Selecţia
dintre operaţiile de incrementare/decrementare se face cu semnalul de intrare INC_DEC („0‟
pentru incrementare,‟1‟ pentru decrementare). Dimensiunea semnalului A se declara
generic,width.
În plus, circuitul va mai conţine două porturi:
– un port de ieşire C care semnalizează când rezultatul depăşeşte valoarea maximă,respectiv când
trece la valoare negativă. În ambele situaţii, SUM va lua valoarea 0.
– un port de intrare EN (enable), activ pe „1‟ logic care are rol de activare a circuitului.Dacă
EN=‟0‟, atunci circuitul nu funcţionează iar ieşirile sunt în starea de înaltăimpedanţă.
– un port de intrare CLK (clock). Circuitul va efectua calculul numai după apariţia unui
front negativ al acestui semnal.
– un port de intrare OEB (output enable), activ pe “0” logic, care are rol de activare a porturilor
de ieşire. Dacă OE=‟0‟, atunci la ieşiri pot fi furnizate rezultatele, altfelsemnalele de la ieşire sunt
în starea de înaltă impedanţă.
Cerinţe:
• modelarea comportamentală în VHDL a circuitului.• implementarea operaţiilor de
incrementare/decrementare cu ajutorul a două funcţii(increment şi decrement), declarate într-un
package.
• realizarea unui program de test pentru width=8;.

*bambam
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity is MO_incdec
--generic n: natural :=8;
port ( A,MAX: in std_logic_vector(7 downto 0);
OEB,CK,EN,INC_DEC: in std_logic;
SUM: out std_logic_vector(7 downto 0);C:out std_logic );
end MO_incdec;
architecture comportament of MO_incdec is
signal SSUM:std_logic_vector (7 downto 0);
signal SC:std_logic:='0';
signal i_d:std_logic_vector(7downto 0):="00000001";
begin
SSUM<=A;
process(A,MAX,OEB,CK,EN)
begin
if EN='1' then
if SSUM>MAX then
SC<='1';
SSUM<="00000000";
elsif SSUM<=MAX then
SC<='0';
end if;
if INC_DEC='1' and falling_edge(CK) then
SSUM<=std_logic_vector(unsigned(SSUM)+unsigned(i_d));
elsif INC_DEC='0' and falling_edge(CK) then
SSUM<=std_logic_vector(unsigned(SSUM)-unsigned(i_d));
end if;
if OEB='0' then
SUM<=SSUM;C<=SC;
elsif OEB='1' then
SUM<="ZZZZZZZZ";
C<='Z';
end if;
end if;
end process;
end;

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