2010-11-13 28 views
-1

Je suis en train d'ajouter « 1 » à un std_logic_vector N-Longueur VHDLajoutant « 1 » à LOGIC_VECTOR en VHDL

Ceci est la première fois que je suis VHDL donc je ne suis pas du tout Bien sûr comment ajouter ceci 1 sans bulding Une addition complète qui semble un peu redondante

Nous ne sommes pas autorisés à utiliser plus de libéraux puis un dans le code.

LIBRARY IEEE ; 
USE IEEE.STD_LOGIC_1164.ALL; 

USE IEEE.STD_LOGIC_UNSIGNED.ALL; 


ENTITY cnt IS 

GENERIC (n: natural :=3); 

PORT(clk: IN std_logic;  -- clock 
    rst: IN std_logic;  -- reset 
    cntNum: IN std_logic_vector(n-1 DOWNTO 0); -- # of counting cycles 
    cntOut: OUT std_logic_vector(n-1 DOWNTO 0) -- count result 
); 
END cnt; 


architecture CntBhvArc OF cnt IS 

    signal counta : std_logic_vector(n-1 DOWNTO 0); 

begin 

process (clk, rst) 

begin 

    if rst='1' then 

     counta<="0"; 

    elsif (clk'event) and (clk='0') then 

     counta<= counta+'1'; 

    end if; 

cntOut<=counta; 

end process; 

END CntBhvArc 

Aussi ... quelqu'un peut-il pointer vers un VDIL totrial pour quelqu'un qui a très peu d'expérience dans la programmation?

Merci

Répondre

0

Vous devez jeter le std_logic_vector à une valeur non signée afin que vous puissiez ajouter un, puis le jeter en arrière de sorte que vous pouvez l'assigner à votre sortie. Cela ressemble à une tâche de devoirs, alors je vais vous laisser imaginer exactement comment faire la mise en œuvre.

+3

Mais ne faites pas - faites un type numérique correct pour commencer –

5

Vous ne devriez pas utiliser la bibliothèque IEEE.STD_LOGIC_UNSIGNED.ALL

Cette bibliothèque est dépréciée (voir VHDL FAQ); utilisez ieee.numeric_std.all à la place.

1

Pour répondre à votre dernier point, ne pensez pas à la programmation. HDL signifie "langage de description du matériel". Vous décrivez le matériel, gardez-le toujours à l'esprit lorsque vous écrivez votre code :)

J'ai également écrit au long about not using STD_LOGIC_UNSIGNED, but using NUMERIC_STD instead. Si c'est le devoir et qu'on vous apprend à utiliser STD_LOGIC_UNSIGNED, alors je désespère des établissements d'enseignement. Cela fait des années que cela a du sens.

VHDL est fortement typé, donc si le nombre représente un nombre (et avec un nom comme ça, il vaut mieux être eu :), utilisez soit un vecteur signed ou unsigned, ou un integer. Les entiers ne s'enroulent pas en simulation à moins que vous ne les fassiez (si vous leur ajoutez 1 quand ils sont à leur valeur maximum, le simulateur s'arrêtera). Les types de vecteurs font. Parfois, vous voulez un comportement, parfois l'autre.

Enfin, je viens de remarquer ceci:

elsif (clk'event) and (clk='0') then 

qui est mieux écrit:

elsif falling_edge(clk) then 

encore, cela a été pendant une dizaine d'années ou deux. Aviez-vous l'intention d'utiliser le front descendant - le front montant est plus habituel.