Προς το περιεχόμενο

απορια στη vhdl


process19

Προτεινόμενες αναρτήσεις

Δημοσ.

καλησπερα εχω μια εργασια εχω κανει κωδικα αλλα μαλλον χρειαζεται καποιες διορθωσεις,

οποιος θελει ας μ πει να του στειλω π.μ αυτα που εχω κανει.

Δημοσ.

καλησπερα εχω μια εργασια εχω κανει κωδικα αλλα μαλλον χρειαζεται καποιες διορθωσεις,

οποιος θελει ας μ πει να του στειλω π.μ αυτα που εχω κανει.

 

Αν θες κάνε post τα σημεία που έχεις πρόβλημα για να βοηθήσουμε.

Δημοσ.

οκ,λοιπον πρεπει να υλοποιησω μια στοιβα που κανει clear τα στοιχεια της αν το επιλεξω,και μπορω να εισαγω αριθμους μεχρι να γεμισει(15 θεσεις),καθε φορα που κανω εισαγωγη πρεπει να μου εμφανιζεται ο αριθμος που εκανα εισαγωγη αλλα και ποσα στοιχεια εχω βαλει μεχρι τοτε στη στοιβα.εχω δημιουργησει την μνημη,εχω κανει ενα καταχωρητη για την αποθηκευση του αποτελεσματος και παρακατω ειναι ο κωδικας της στοιβας(που δεν ξερω κατα ποσο σωστο ειναι)

>

entity stack is
   Port ( push : in  STD_LOGIC;
          clear : in  STD_LOGIC;
          add : in  STD_LOGIC;
          clk : in  STD_LOGIC;
          N_In : in  STD_LOGIC_VECTOR (7 downto 0);
          N_out : out  STD_LOGIC_VECTOR (7 downto 0));
end stack;

architecture Behavioral of stack is

component MEMORY is

port(
clka  :in std_logic;
wea   :in std_logic_vector(0 downto 0);
addra :in std_logic_vector(3 downto 0);
dina  :in std_logic_vector(7 downto 0);
dout  :out std_logic_vector(7 downto 0)
);
end component;

component register8 is
port(
rst_n	: in  STD_LOGIC;
clk   : in  STD_LOGIC;
enable: in 	STD_LOGIC;
din 	: in  STD_LOGIC_VECTOR ( 7 DOWNTO 0 );
dout	: out STD_LOGIC_VECTOR ( 7 DOWNTO 0 )

);
end component;

component adder is
port(
A:in std_logic_vector(7 downto 0);
B:in std_logic_vector(7 downto 0);
Cin : in std_logic;
sum_s:out std_logic_vector(7 downto 0);
Cout:out std_logic
);
end component;

component debounce is
port(
clk        : in std_logic;
reset      : in std_logic;
button_in  : in std_logic; 
button_out : out std_logic 
);
end component;

signal write_en    :std_logic_vector(0 downto 0);
signal address     :std_logic_vector(3 downto 0);
signal reset       :std_logic;
signal en          :std_logic;
signal stack_empty :std_logic;
signal stack_full  :std_logic;
signal tmp_out     :std_logic_vector(7 downto 0);
signal tmp_out1    :std_logic_vector(7 downto 0);
signal ptr         :std_logic(3 downto 0);
signal cinin       :std_logic;
signal sum_signal  :std_logic_vector(7 downto 0);
signal coutout     :std_logic;
signal addout      :std_logic_vector(7 downto 0);
signal debounceadd_out:std_logic;
signal debounceclear_out:std_logic;
begin

mem:MEMORY
port map(
clk,
write_en,
address,
N_In,
tmp_out1
);

debadd:debounce
port map(
clk,
reset,
add,
debounceadd_out
);
debclear:debounce
port map(
clk,
reset,
clear,
debounceclear_out
);

process
begin
----arxika eksetazw an i stiva mas einai gemati i adeia
     if address="0000" then
         stack_empty<='1';
		   stack_full<='0';
	elsif address="1111" then
	        stack_full<='1';
		     stack_empty<='0';
   else 
      stack_empty<='0';
      stack_full<='0';
  end if;
 case push is
       	     when '0'=>
	           Number_out<=(others=>'0');
	           when '1'=>
	           Number_out<=tmp_out1;
				  address<=address + 1;--auksanei tin dieuthnsi kata 1
         when others =>
            Number_out<=(others=>'0');
         end case;

end process;
ptr<=address;--deiktis pou deixnei stin korufi tis stoivas

------adeiasma tis listas
process
begin
if clear='1' and clk='1' and clk'event then
address<=(others=>'0');
N_out<=(others=>'0');
ptr<=(others=>'0');
else
N_out<=tmp_out1;
address<=address;
ptr<=ptr;
end if;
end process;

--------prosthesi twn 2 prwtwn stoixeiwn tis stivas

add:adder
port map(
N_out(address),
N_out(address-"0001"),
cinin,
sum_signal,
coutout
);
regFile:register8
port map(
reset,
clk,
en,
sum_signal,
addout
);


end Behavioral;

Δημοσ.

Φαντάζομαι αυτό που θες να υλοποιήσεις είναι σύγχρονο κύκλωμα και όχι ασύγχρονο!

 

>process
begin
if clear='1' and clk='1' and clk'event then

 

Αυτό που κάνεις παραπάνω είναι ασύγχρονη λογική και πρέπει να αποφεύγεται διότι δημιουργεί gated clocks.

 

Οπότε για σύγχρονο clear:

 

>process(clk)
begin
if rising_edge(clk) then
...
 if clear='1' then
 ...
 end if;
end if;
end process

 

ή για ασύγχρονο clear

 

>process(aclear,clk)
begin
if aclear='1' then
...
elseif rising_edge(clk) then
...
end if;
end process

 

επίσης το πρώτο process που έχεις δεν έχει sensitivity list! Έτσι όπως το έχεις υλοποιήσει είναι combinational και όχι sequential. Γενικά αποφάσισε τη θες να είναι και φτιάξε το sensitivity list του.

  • 1 μήνα μετά...

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...