2015-03-26 1 views
0

Pour une application que je crée je voudrais utiliser un décodeur qui aide à écrire dans l'un des 42 registres. Afin de prendre en compte tous les registres possibles, j'ai besoin d'une entrée de 6 bits puisque le plafond de lg (42) est 6.Comment concevoir un décodeur qui aura des sorties supplémentaires?

Cependant, cela va créer un décodeur de 6 à 64, me laissant avec 12 sorties supplémentaires que je Je ne sais pas comment gérer. Je sais que dans VHDL Je peux écrire une déclaration de cas pour elle:

case input is 
    when "000000" => output <= reg0; 
    when "000001" => output <= reg1; 
    . 
    . 
    . 
    when others => output <= ???; 
end case; 

tout Espérons que le reste sera conçu de telle sorte qu'une entrée> 41 ne se produit pas, mais comment le code doit être écrit pour gérer ce cas? Y at-il un moyen de le gérer sans arrêter l'application d'une certaine manière? Ou, en alternative, existe-t-il un moyen d'écrire un décodeur qui n'a que 42 sorties?

Répondre

3

Un moyen plus facile d'écrire c'est:

type regs_type is array (integer range <>) of std_logic_vector(7 downto 0); 
signal regs : regs_type (0 to 41) := (others => (others => '0')); 

...

output <= regs(to_integer(unsigned(input)); 

En supposant 'entrée' est un std_logic_vector, et que vos registres sont larges de 8 bits.

Ensuite, utilisez le tableau regs pour vos registres 0-41. Je suppose que si vous vouliez être explicite à propos des registres 42+, vous pourriez créer un tableau de taille 64, et laisser les éléments supérieurs non connectés, mais je crois que le code ci-dessus aboutirait à la même chose.

Si vos registres ont effectivement des noms significatifs, non seulement reg0 etc, vous pouvez avoir un bloc séparé de code relié au tableau ci regs, par exemple:

regs(0) <= setup_reg; 
regs(1) <= data_out; 

et ainsi de suite. Si je le faisais de cette façon, je l'aurais constantes définies pour les valeurs de l'indice regs, par exemple:

constant SETUP_REG_ADDRESS : integer := 0; 
constant DATA_OUT_ADDRESS : integer := 1; 

...

regs(SETUP_REG_ADDRESS) <= setup_reg; 
regs(DATA_OUT_ADDRESS) <= data_out; 

Sinon, si vous voulez garder la déclaration case, vous pourrait écrire votre others clause comme

when others => output <= (others => '-'); 

Ce « ne se soucient pas » la valeur permet aux outils pour faire tout ce qui est le plus efficace dans ces CAS es que vous croyez être inaccessible de toute façon. Si vous étiez préoccupé par quelque chose d'indéfini étant affecté à output si input dépassait en quelque sorte 41, vous pouvez toujours remplacer le '-' par un '0'.

+0

J'aime cette idée. A l'origine, la structure était conçue de telle sorte que le décodeur et le registre étaient des composants séparés, et la sortie du décodeur déterminait le registre à lire, mais cela semble un peu plus propre. En ce qui concerne votre commentaire de sortie: le décodeur a été configuré pour avoir une activation où il sortirait tous les 0 si l'activation était faible. Je suppose que je pourrais aussi juste sortir tous les 0 si la valeur est> 41? – AdamMc331

+1

Si je vous comprends bien, je pense que vous pourriez le faire plus facilement en définissant la taille du tableau 'regs' à 64 dans le premier exemple, ou avec' (others => '0') 'dans la seconde. Pour implémenter un 'enable', je pense que les deux méthodes auraient besoin et' if/then/else' pour définir 'output' à tous les zéros. –