Bonjour a tous !
Je viens vers vous afin d'avoir un peu d'aide sur un problème que je rencontre. Je dois coder un diviseur en VHDL. Les données imposées:
- utiliser un process qui fait la division en soustrayant et "by shifting" (shift-subtract division)
- utiliser uniquement des vecteurs arithmétiques (e.g. de type UNSIGNED) au lieu du type integer. Utiliser le package std_logic_arith à la place de numeric_std (à cause des limites imposées par l'outil de synthétisation).
J'ai codé mon entity diviseur. On nous demande bien évidemment de faire un testbench pour vérifier que notre diviseur fonctionne correctement. Et c'est là que je rencontre un problème: lorsque je lance la simulation, voila l'erreur qui apparait:
Ca viendrait de la ligne 19 de mon code du diviseur, or cette ligne indique:Fatal: (vsim-3420) Array lengths do not match. Left is 5 (4 downto 0). Right is 1 (4 downto 4).
Je n'arrive pas à déterminer où le souci se situe exactement dans mon code...Code:process(A,B)
Mon entity diviseur:
Mon testbench:Code:library IEEE; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use IEEE.std_logic_arith.all; entity DIVIDER2 is generic( m, n : integer); port( A : in unsigned (m downto 0); B : in unsigned (n downto 0); Q : out unsigned (m downto 0); R : out unsigned (m downto 0) ); end; architecture bhv of DIVIDER2 is begin process(A,B) variable dvd, qt: unsigned(m downto 0):="0"; variable dvsr: unsigned(n downto 0):="0"; variable zero: unsigned (m-n downto 0):="0"; begin dvd := A; dvsr := B&zero; --B&(others=>'0') qt := "0"; for i in 0 to (m-n) loop if (dvd>=dvsr) then dvd := dvd-dvsr; qt := shl(qt, "1")+1; else qt := shl(qt, "1"); end if; dvsr := shr(dvsr,"1"); end loop; Q <= qt; R <= dvd; end process; end bhv;
Merci d'avance à ceux qui auront eu le courage de lire en entier et qui pourront m'expliquer cette erreur que je n'arrive pas à interpréter !Code:--même library que le diviseur entity TB_DIVIDER is end; architecture STRUCT of TB_DIVIDER is signal A1 : unsigned (4 downto 0); signal B1 : unsigned (3 downto 0); signal Q1, R1 : unsigned (4 downto 0); component DIVIDER2 is generic ( m,n : integer); port( A : in unsigned (4 downto 0); B : in unsigned (3 downto 0); Q : out unsigned (4 downto 0); R : out unsigned (4 downto 0) ); end component; begin test_divider : DIVIDER2 generic map (4,3) port map (A1, B1, Q1, R1); process begin A1 <= "1111"; B1 <= "111"; wait for 5 ns; end process; end STRUCT;
-----