2015-03-27 1 views
0

J'ai un décodeur 4 à 16 en vhdl. Je veux mettre une entrée d'enable mais je suis nouveau au codage de vhdl. Je veux garder cette structure du code (je ne veux pas d'autres raccourcis, ou code complètement modifié). J'ai essayé d'écrire une entrée e pour l'activation, et j'ai essayé de faire if e = "1" then mais cela ne fonctionne pas.Mise en place d'une entrée de validation sur un décodeur (VHDL)

library IEEE; 
use IEEE.STD_LOGIC_1164.all; 
entity decode4to16 is 
port(
oct : in std_logic_vector(3 downto 0); 
e : in std_logic; 
dec : out std_logic_vector(15 downto 0)); 
end decode4to16; 
architecture arch of decode4to16 is 
begin 
if e = "1" then 
with oct select 
dec <= 
"0000000000000001" when "0000", 
"0000000000000010" when "0001", 
"0000000000000100" when "0010", 
"0000000000001000" when "0011", 
"0000000000010000" when "0100", 
"0000000000100000" when "0101", 
"0000000001000000" when "0110", 
"0000000010000000" when "0111", 
"0000000100000000" when "1000", 
"0000001000000000" when "1001", 
"0000010000000000" when "1010", 
"0000100000000000" when "1011", 
"0001000000000000" when "1100", 
"0010000000000000" when "1101", 
"0100000000000000" when "1110", 
"1000000000000000" when "1111", 
"0000000000000000" when others; 
end if; 
end arch; 

Répondre

2

Veuillez utiliser l'indentation appropriée dans le futur, pour faciliter la lecture.

Une instruction if ne peut être utilisé dans un procédé, et comme @Josh a souligné, e est un std_logic, ce qui nécessite guillemet simple lors de la vérification ou de l'attribuer sa valeur. Les résultats finaux sont quelque chose comme:

DECODER: process(e, oct) -- e and oct are in sensitivity list, which means output the process statements are executed whenever one of these change 
begin 
    if e = '1' then 
     case oct is 
      when "0000" => dec <= X"0001"; 
      when "0001" => dec <= X"0002"; 
      ... 
      when others => dec <= X"0000"; 
     end case; 
    end if; 
end process DECODER; 

Sur une note de côté, cela va créer un verrou , car il y a un comportement implicite que la valeur d'un signal ne changera pas quand il est pas affecté. Dans ce cas, cela se produit lorsque e est '0'; c'est-à-dire qu'il n'y a pas d'autre chose dans votre déclaration. Ce n'est probablement pas ce que vous voulez, et vous devez attribuer une valeur à dec lorsque et est '0'.