VHDL problème de simulation

VHDL problème de simulation - Divers - Programmation

Marsh Posté le 14-01-2006 à 16:30:35    

Salut !
J'ai écrit un programme simulant un registre à décalage programmable. Le tout compile mais lorsque je lance la simulation je n'ai aucun signal qui s'affiche. Je ne trouve pas d'où ca pourrait venir et je déséspère un peu. Si quelqu'un pourrait m'aider ca serait super ^_^. Je vous file le code. (J'utilise Sonata comme éditeur)
 
package pack is
 type commande is (LOAD, SHLL, SHRL, SHLA, SHRA, ROTL, ROTR);
end package pack;
 
 
-- les 7 commandes
-- LOAD chargement de DIN dans le registre
-- SHLL décalage logique à gauche
-- SHRL décalage logique à droite
-- SHLA décalage arithmétique à gauche
-- SHRA décalage arithmétique à droite
-- ROTL rotation à gauche
-- ROTR rotation à droite
 
-- importation du package
use work.pack.all;
 
 
entity regprog is
 
generic(
 N : natural := 8; -- nb de bits donc nb de registre
 TP : time := 0 ns -- temps de propagation dans le registre
);
port(
 signal CLK   : in bit; -- horloge
 signal RST_B : in bit; -- reset actif au niveau bas
 signal CMD   : in commande; -- type d'opération
 signal NSR   : in natural; -- nb de bit affecté par une opération => nb de bit qui va tourner,... par coup d'horloge
 signal DIN   : in bit_vector(N-1 downto 0);  -- entrée, bus de N bit
 signal DOUT  : out bit_vector(N-1 downto 0) -- sortie, bus de N bit
);
end entity regprog;
 
 
 
architecture bhv of regprog is
 
 shared variable reg_vect: bit_vector(N-1 downto 0) := (others => '0');  -- vecteur contenant les bits (contenu) du registre initialisé à 0
begin
 
process (CLK, RST_B, CMD, NSR, DIN)
 
 -- procédure pour définir les opération p81 cours
 
 procedure pshll is  -- décalage logique à gauche
 begin
  for i in 1 to NSR loop -- p16 VHDL instant
   reg_vect := reg_vect(N-2 downto 0) & '0';   -- p36 cours  équivalent à: reg_vect sll NSR
  end loop;
 end procedure pshll;
 
 procedure pshrl is
 begin
  for i in 1 to NSR loop  
   reg_vect := '0' & reg_vect(N-1 downto 1);  -- décalage logique à droite
  end loop;
 end procedure pshrl;
 
 procedure pshla is
 begin
  for i in 1 to NSR loop
   reg_vect := reg_vect(N-2 downto 0) & reg_vect(0); -- décalage arithm. à gauche
  end loop;
 end procedure pshla;
 
 procedure pshra is
 begin
  for i in 1 to NSR loop
   reg_vect := reg_vect(N-1) & reg_vect(N-1 downto 1); -- décalage arithm. à droite
  end loop;
 end procedure pshra;
 
 procedure protl is
 begin
  for i in 1 to NSR loop
   reg_vect := reg_vect(N-2 downto 0) & reg_vect(N-1);  -- rotation à gauche
  end loop;
 end procedure protl;
 
 procedure protr is
 begin
  for i in 1 to NSR loop
   reg_vect := reg_vect(0) & reg_vect(N-1 downto 1);  -- rotation à droite
  end loop;
 end procedure protr;
 
 
 
 
 
begin
 if RST_B = '0' then
  reg_vect := (others => '0');  -- si reset on met les registres à 0
 elsif CLK = '1' and CLK'event then   -- vérifie d'avoir un flanc montant
  case CMD is    -- p33 cours
   when LOAD => reg_vect := DIN;  -- chargement de DIN ds les registres
   -- effectue les procédures
   when SHLL => pshll;
   when SHRL => pshrl;
   when SHLA => pshla;
   when SHRA => pshra;
   when ROTL => protl;
   when ROTR => protr;
  end case;
 end if;
 
 DOUT <= reg_vect after TP;   -- affecte les valeur du registre à la sortie
end process;
 
end architecture bhv;
 
 
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.pack.all;
 
entity tb_regprog is
end entity tb_regprog;
 
 
architecture bench of tb_regprog is
 
 constant N_tb: positive:=8;  -- nb de bascule par défaut
 constant TP_tb: time:= 0 ns; -- retard
 constant duree: time:= 2 ns;    -- durée de la période de CLK à choix
 
 signal CLK_tb: bit := '0'; -- initialise l'horloge à 0
 signal RST_B_tb: bit := '1'; --  "  le reset à 1
 signal CMD_tb: commande;
 signal NSR_tb: natural := 2;  -- nb de décalage, à choix
 signal DIN_tb: bit_vector(N_tb-1 downto 0) := "10010110";  -- affecte une valeur à l'entrée pour le test
 signal DOUT_tb: bit_vector(N_tb-1 downto 0);
 shared variable reg_vect_tb: bit_vector(N_tb-1 downto 0);
begin
 UUT: entity work.regprog(bhv)
 generic map (N => N_tb)
 port map
 (
  CLK => CLK_tb, RST_B => RST_B_tb, CMD => CMD_tb,
  NSR => NSR_tb, DIN => DIN_tb, DOUT => DOUT_tb
 );
 
 horloge : process(CLK_tb)
 begin
  CLK_tb <= not CLK_tb after duree;
 end process horloge;
 
 --CLK_tb <= not CLK_tb after duree; -- horloge
 RST_B_tb <= '1', '0' after 2*duree, '1' after 8*duree;  -- test le reset
 
 
test: process  -- vérification des opération
begin
 -- vérifie le load
 if CLK_tb= '0' and CLK_tb'event then     -- affecte l'entrée dans les registre au flanc descendant
  CMD_tb <= LOAD;                              
  reg_vect_tb := DIN_tb; wait for 3*duree;  
  if RST_B_tb = '1' then                 -- vérifie qu'on ne fasse pas reset (pas forcément nécessaire)
   assert DOUT_tb = reg_vect_tb report "erreur sur LOAD" severity ERROR; -- p 57 cours
  end if;       -- si DOUT_tb est diff de reg_vect_tb on signal une erreur
 end if;
 
 -- vérifie le shll
 if CLK_tb= '0' and CLK_tb'event then
  CMD_tb <= SHLL;
  reg_vect_tb := DOUT_tb; wait for 3*duree;
  if RST_B_tb = '1' then
   assert DOUT_tb = reg_vect_tb sll NSR_tb report "erreur sur SHLL" severity ERROR;
  end if;
 end if;
 
 if CLK_tb= '0' and CLK_tb'event then
  CMD_tb <= SHRL;
  reg_vect_tb := DOUT_tb; wait for 3*duree;
  if RST_B_tb = '1' then
   assert DOUT_tb = reg_vect_tb srl NSR_tb report "erreur sur SHRL" severity ERROR;
  end if;
 end if;
 
 if CLK_tb= '0' and CLK_tb'event then
  CMD_tb <= SHLA;
  reg_vect_tb := DOUT_tb; wait for 3*duree;
  if RST_B_tb = '1' then
   assert DOUT_tb = reg_vect_tb sla NSR_tb report "erreur sur SHLA" severity ERROR;
  end if;
 end if;
 
 if CLK_tb= '0' and CLK_tb'event then
  CMD_tb <= SHRA;
  reg_vect_tb := DOUT_tb; wait for 3*duree;
  if RST_B_tb = '1' then
   assert DOUT_tb = reg_vect_tb sra NSR_tb report "erreur sur SHRA" severity ERROR;
  end if;
 end if;
 
 if CLK_tb= '0' and CLK_tb'event then
  CMD_tb <= ROTL;
  reg_vect_tb := DOUT_tb; wait for 3*duree;
  if RST_B_tb = '1' then
   assert DOUT_tb = reg_vect_tb rol NSR_tb report "erreur sur ROTL" severity ERROR;
  end if;
 end if;
 
 if CLK_tb= '0' and CLK_tb'event then
  CMD_tb <= ROTR;
  reg_vect_tb := DOUT_tb; wait for 3*duree;
  if RST_B_tb = '1' then
   assert DOUT_tb = reg_vect_tb ror NSR_tb report "erreur sur ROTR" severity ERROR;
  end if;
 end if;
 
end process test;
 
 
 NSR_test : process  -- teste diff valeur de NSR
 begin
  wait for 2*duree; NSR_tb <= 2;
  wait for 4*duree; NSR_tb <= 1;
 end process NSR_test;
 
end architecture bench;
 
 
Voilà j'espère que c'est compréhensible...
 
Merci !
 
 

Reply

Marsh Posté le 14-01-2006 à 16:30:35   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed