up / down counter gris

H

heastone

Guest
Comment puis-je mettre en œuvre le haut / bas compteur gris par VHDL?
sauf compteur binaire à counnter gris

 
Voir ce (en Verilog, vous pouvez convertir en VHDL avec X-HDL):
http://klabs.org/richcontent/software_content/ip/ip.htm

Vous pouvez utiliser Etat approche machine si la largeur compteur est petit

 
Verilog fichier à partir de:
http://klabs.org/richcontent/software_content/ip/dane/gray_updown.v

***
`1ns/100ps calendrier
module gray_updown (clk, ACLR, l'ENA, en haut, gray_code);
paramètre size = 22;
entrée CLK, ACLR, l'ENA, en hausse;
sortie [size-1: 0] gray_code;
reg [size-1: 0] gray_code, TOG;
integer i, j, k;
always @ (CLK posedge ou ACLR negedge)
if (ACLR == 1'b0) commencent
gray_code <= 0;
fin
else begin / / mise à jour séquentielle
if (ENA == 1'b1) begin / / activé
tog = 0;
for (i = 0; i <= size-1; i = i 1) begin / / i boucle
/ /
/ / Toggle bits si le nombre de bits dans [size-1: i] est encore
/ / Binaire actuel XNOR jusqu'à bits MSB pour le comte Up, et
/ / XOR pour Count Down
/ /
for (j = i; j <= size-1; j = j 1) tog = tog ^ gray_code [j];
if (place == 1'b1) tog =! tog ;
/ /
/ / Désactiver tog Si un peu plus bas est basculer
/ /
for (int k = 0; k <= i-1, k = k 1) tog = tog & &! tog [k];
end / / boucle i
/ /
/ / Toggle MSB si aucune bits inférieurs set (couvre Caisse wrap code)
/ /
if (Tog [size-2: 0] == 0) tog [size-1] = 1;
/ /
/ / Appliquer le masque à bascule
/ /
gray_code <= gray_code ^ tog;
end / / activé
/ fin d'appel / mise à jour séquentielle
endmodule
***

Transleted to VHDL avec la bibliothèque de l'ajout et SIZE = 4

***
Bibliothèque IEEE;
utilisation IEEE.std_logic_1164.all;
utilisation IEEE.std_logic_unsigned.all;
utilisation IEEE.STD_LOGIC_ARITH.ALL;

ENTITY gray_updown EST
Générique (
TAILLE: integer: = 4);
PORT (
clk: IN std_logic;
ACLR: IN std_logic;
ENA: IN std_logic;
Up: std_logic;
gray_code: OUT std_logic_vector (taille - 1 downto 0));
Entité finale gray_updown;

ARCHITECTURE DE traduit gray_updown ESTSIGNAL TOG: std_logic_vector (taille - 1 downto 0);
SIGNAL i: integer;
SIGNAL j: integer;
SIGNAL k: integer;
SIGNAL gray_code_xhdl1: std_logic_vector (taille - 1 downto 0);

BEGIN
gray_code <= gray_code_xhdl1;

PROCESS (clk, ACLR)
VARIABLE tog_xhdl2: std_logic_vector (taille - 1 downto 0);
BEGIN
IF (ACLR = '0 ') THEN
gray_code_xhdl1 <= (OTHERS => '0 ');
Elsif (clk'EVENT et CLK = '1 ') THEN
IF (ENA = '1 ') THEN
tog_xhdl2: = (OTHERS => '0 ');
FOR i IN 0 TO taille - 1 LOOP
FOR j IN I DE TAILLE - 1 boucle
tog_xhdl2 (i): = tog_xhdl2 (i) XOR gray_code_xhdl1 (j);
END LOOP;
IF (up = '1 ') THEN
tog_xhdl2 (i): = pas tog_xhdl2 (i);
END IF;
FOR k dans 0 à i - 1 boucle
tog_xhdl2 (i): = tog_xhdl2 (i) et tog_xhdl2 (k);
END LOOP;
END LOOP;
IF (tog_xhdl2 (taille - 2 downto 0) = "000000000000000000000") Then
tog_xhdl2 (taille - 1): = '1 ';
END IF;
gray_code_xhdl1 <= gray_code_xhdl1 XOR tog_xhdl2;
END IF;
END IF;
tog <= tog_xhdl2;
Terminer le processus;

END ARCHITECTURE traduite;
***

VHDL -> EDIF (Synplify Pro) -> Compiler, Fitting, Simule (MAX PLUS II)

Horloge à fréquence principale = 158 MHz (EPM3032ALC44-4)

It `s travaillent vraiment

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Cool" border="0" />
 
VHDL File
----------
Ref: http://www.vhdl-online.de/model_lib_patras/vhdl_sources/counters/counters.htm

- ################################################ ############################
- # Projet: Leonardo CBT-noyau #
- # #
- # Nom du fichier: counters.vhd #
- # #
- # Component: gudNlr: N-bit gris / décompteur #
- # Avec charge synchrone et asynchrone reset #
- # #
- # Modèle: RTL #
- # #
- Designer #: Théoharis S., N.Zervas #
- # Institut: VLSI Design Lab., Université de Patras #
- # Date: 01.05.1999 #
- ################################################ ############################

Bibliothèque IEEE;
utilisation IEEE.std_logic_1164.all;
utilisation IEEE.STD_LOGIC_ARITH.ALL;
utilisation work.useful_functions.ALL;

- GudNlr Description de l'entité
gudNlr entité est
generic (N: integer: = 8);
port (
DIN: en non signé (N-1 downto 0);
DOUT: out unsigned (N-1 downto 0);
CLK, DOWN, LOAD, R, UP: en std_ulogic;
COUR: out std_ulogic
);
fin gudNlr;

- GudNlr Description de l'architecture
RTL architecture de gudNlr est
signal istate: unsigned (N-1 downto 0);
signal compte: unsigned (N downto 0);
signal load_value: unsigned (N-1 downto 0);
signal binary_out: unsigned (N downto 0);
commencer
- Conversion d'entrée à la représentation binaire
Grey2Bin (DIN, load_value);
count <= ('0 '& istate) "01" quand ((UP = '1') et (DOWN = '0 ')) else
('0 '& Istate) - "01" quand ((DOWN = '1') et (UP = '0 ')) else
('0 '& Istate);

Count_Process: process (CLK, R)
commencer
if (R = '1 ') then
- Remise à zéro cas
istate <= (OTHERS => '0 ');
elsif (CLK'event et (CLK = '1 ') et (CLK'last_value = '0')) then
if (LOAD = '1 ') then
- Cadencé charger l'événement
istate <= load_value;
elsif (UP = '1 ') ou (DOWN = '1') then
- Comptage cadencé haut / bas événement
istate <= count (N-1 downto 0);
End If;
End If;
Terminer le processus Count_Process;

- Conversion d'entrée à la représentation binaire
Bin2Grey (istate, binary_out);

- Attribuer des valeurs de sortie
DOUT <= binary_out (N-1 downto 0);
Cout <= '0 'lorsque (DOWN = '0' et UP = '0 ')
else '1 'when (DOWN = '1' et UP = '1 ')
else comptent pas (N) lorsque (DOWN = '1 'et UP = '0')
else count (N);
end RTL;

 
Bonjour,

Je étude sur Feri (http://www.feri.uni-mb.si/) univirsity électronique.

Je dois construire un comptoir avec PAL, qui comptera dans le code de Gray de 0 à 9.Counter doit avoir deux inputes, charge les numéros (entrée LOAD) et "Start" ou "ON" (EN entrée).Lorsque le compteur va dans interdits État (9 à 15), le compteur doit réinitialiser.

Je l'aide d'un programme d'ABEL et je simuler le programme avec des données *. jed ...

J'ai trouvé ceci: http://www.asic-world.com/examples/verilog/gray.html mais sa ne marche pas dans mon programme ...

J'ai fait un compteur normal, mais je ne sais pas comment le construire dans le code Gray.Mon programme:

MODULE CNT
gor SteveC title '/ dol »
D3 .. D0, URA, RST, cnten, LD, broches u_d;
D = [D3, D2, D1, D0];
Q3 .. Q0 istype'reg pin ";

Q = [Q3, Q2, Q1, Q0];
X =. X.;
MODE = [cnten, LD, u_d, rst];
LOAD = (mode == [X, 1, X, X]);
Maintenir = (mode == [0,0, X, 0]);
UP = (mode == [1,0,1,0]);
DOWN = (mode == [1,0,0,0]);
RESET = (mode == [X, 0, X, 1]);
équations
Q.clk = URA;
WHEN (CHARGE) alors (WHEN (D> 9) THEN Q: = 9 ELSE Q: = D;)
Autrement, si (HOLD) THEN Q: = Q;
Autrement, si () (ensuite WHEN (Q == 9) THEN Q: = 0;
ELSE Q: = (Q 1);)
Autrement, si (DOWN) alors (WHEN (Q == 0) THEN Q: = 9;
ELSE Q: = (Q-1);)
Autrement, si (RESET) THEN Q: = 0;

TEST_VECTORS
([u_d, RST, LD, cnten, URA, D3, D2
, D1, D0] -> [Q3, Q2, Q1, Q0])
[X, 0,1, X,. C., 0,1,1,1] -> [0,1,1,1]; / / NALO I 7
[1,0,0,1,. Ch, X, X, X, X] -> [1,0,0,0]; / / TEJ GOR 7NA 8
[1,0,0,1,. Ch, X, X, X, X] -> [1,0,0,1]; / / TEJ GOR 8NA 9
[1,0,0,1,. Ch, X, X, X, X] -> [0,0,0,0]; / / TEJ GOR 9NA 0
[1,0,0,1,. Ch, X, X, X, X] -> [0,0,0,1]; / / TEJ GOR 0NA 1
[X, 1,0, X,. Ch, X, X, X, X] -> [0,0,0,0]; / / Reset
[X, 0,1, X,. C., 1,1,1,1] -> [1,0,0,1]; / / NALO I 15 EN SPREMENI 9 V
[X, 0,1, X,. C., 0,1,1,0] -> [0,1,1,0]; / / NALO I 6
[0,0,0,1,. Ch, X, X, X, X] -> [0,1,0,1]; / / TEJ DOL IZ 6 NA 5
[X, 0,1, X,. C., 0,0,0,0] -> [0,0,0,0]; / / NALO I 0
[0,0,0,1,. Ch, X, X, X, X] -> [1,0,0,1]; / / TEJ DOL IZ 0 NA 9
[X, 0,0,0,. Ch, X, X, X, X] -> [1,0,0,1]; / / HOLD
FIN

* SteveC gor / dol = counter haut / bas
* TEJ GOR 7 nd 8 = compter jusqu'à 7 à 8
* TEJ DOL IZ 6 na 5 = compte à rebours de 6 à 5

J'ai juste besoin de compteur en gris et seulement pour compter jusqu'à ...Je vous remercie de votre aide!

Simon

 
Il n'existe aucun code VHDL ici - mais il vous donnera le principe.
Partie I:
http://asicdigitaldesign.wordpress.com/2007/05/10/counting-in-gray/

Partie II:
http://asicdigitaldesign.wordpress.com/2007/05/13/counting-in-gray-part-ii-observations/

Partie III:
http://asicdigitaldesign.wordpress.com/2007/05/14/counting-in-gray-part-iii-putting-everything-together/

Hope this helps:

Key.
http://asicdigitaldesign.wordpress.com/

 

Welcome to EDABoard.com

Sponsor

Back
Top