Problème d'exécution d'un bus bidirectionnel en VHDL

N

nanisan

Guest
Salut

Je suis en train de coder une interface entre un bus processeur et FPGA via un CPLD.Le transfert de données se fait via un bus bidirectionnel dans lequel les données et les adresses sont mutiplexed.Le processeur écrit un mot de 8 bits de données CPLD registre lorsque l'entrée est activée et un état des signaux 3bit sont renvoyés vers le processeur quand la sortie est active permettent.
Quand je synthétiser le code cependant je reçois un tas de mises en garde sur FF Latch / rognage.Quelqu'un peut me dire ce que je fais mal?Merci!Code:fpga_test entité estport (- Les signaux externes de la LBCLALE: en std_logic;

LCS1n: en std_logic;

LWEn: en std_logic;

Loen: en std_logic;

LCLK: en std_logic;

DAL: std_logic_vector inout (7 downto 0);

LA: en std_logic_vector (4 downto 0);

HRESETn: en std_logic;- CPLD signaux programme du registreFPGA1_CSn: std_logic hors;

FPGA2_CSn: std_logic hors;

FPGA3_CSn: std_logic hors;

FPGA_WRITEn: std_logic hors;

FPGA_PROGRAMn: std_logic hors;

FPGA_DATA: std_logic_vector à (7 downto 0);

FPGA_CCLK: std_logic hors;- Signaux CPLD registre d'entrée

FPGA_BUSY: en std_logic;

FPGA_DONE: en std_logic;

FPGA_INITn: en std_logic);fpga_test fin;COMPORTEMENT fpga_test architecture des SI- Définir les adresses registre (3 au total):pROGRAM_ADDR constante: std_logic_vector (12 downto 0): = "0000000000000";

DATA_ADDR constante: std_logic_vector (12 downto 0): = "0000000000001";

INPUT_ADDR constante: std_logic_vector (12 downto 0): = "0000000000010";- Inscrivez-signaux -program_reg signal: std_logic_vector (4 downto 0);

data_reg signal: std_logic_vector (7 downto 0);

input_reg signal: std_logic_vector (2 downto 0);

outbuff_en signal: std_logic;

inbuff_en signal: std_logic;

reg_address signal: std_logic_vector (12 downto 0);commencer<= Outbuff_en pas Loen et non LCS1n;

<= Inbuff_en pas LWEn et non LCS1n;

reg_address <= DAL et LA;

<= FPGA_CCLK LCLK;processus (HRESETn, LCLK)

commencerif (HRESETn = '0 '), puis

<Program_reg = (autres => '0 ');

DAL <= (autres => '0 ');

<Data_reg = (autres => '0 ');

elsif (LCLK'event et LCLK = '1 ') puisif (inbuff_en = '1 'et Lale = '0' et reg_address = PROGRAM_ADDR) puis

program_reg (4 downto 0) <= DAL (4 downto 0);elsif (inbuff_en = '1 'et Lale = '0' et reg_address = DATA_ADDR) puis

data_reg (7 downto 0) <= DAL (7 downto 0);elsif (outbuff_en = '1 'et Lale = '0' et reg_address = INPUT_ADDR) puisDAL <= («00000» et input_reg);fin si;

fin si;processus de bout;processus (LCLK, HRESETn) - Entrée et données du registre

commencerif (HRESETn = '0 '), puis

<Input_reg = (autres => '0 ');FPGA_DATA <= (autres => '0 ');

elsif (LCLK'event et LCLK = '1 ') puis

program_reg cas (2 downto 0) est

lorsque "011" | "101" | "110" =>

input_reg <= FPGA_BUSY & FPGA_DONE & FPGA_INITn;

FPGA_DATA (7 downto 0) <= data_reg;

quand les autres => null;

Fin de cas;

fin si;

processus de bout;processus (HRESETn, program_reg) - Programme de Registre

commencerif (HRESETn = '0 '), puis

FPGA_WRITEn <= '1 ';

FPGA_PROGRAMn <= '1 ';

FPGA1_CSn <= '1 ';

FPGA2_CSn <= '1 ';

FPGA3_CSn <= '1 ';

d'autre

FPGA_WRITEn <program_reg = (4);

FPGA_PROGRAMn <program_reg = (3);

FPGA1_CSn <program_reg = (2);

FPGA2_CSn <program_reg = (1);

FPGA3_CSn <program_reg = (0);

fin si;processus de bout;COMPORTEMENT fin;

 
Code:

processus (HRESETn, program_reg) - Programme de Registre

commencerif (HRESETn = '0 '), puis

FPGA_WRITEn <= '1 ';

FPGA_PROGRAMn <= '1 ';

FPGA1_CSn <= '1 ';

FPGA2_CSn <= '1 ';

FPGA3_CSn <= '1 ';

d'autre

FPGA_WRITEn <program_reg = (4);

FPGA_PROGRAMn <program_reg = (3);

FPGA1_CSn <program_reg = (2);

FPGA2_CSn <program_reg = (1);

FPGA3_CSn <program_reg = (0);

fin si;processus de bout;Essayez quelque chose comme ceci

FPGA_WRITEn <= '1 'lorsque hreset = '0' program_reg autre (4);

FPGA_PROGRAMn <= '1 'lorsque hreset = '0' program_reg autre (3);

FPGA1_CSn <= '1 'lorsque hreset = '0' program_reg autre (2);

FPGA2_CSn <= '1 'lorsque hreset = '0' program_reg Autres (1);

FPGA3_CSn <= '1 'lorsque hreset = '0' program_reg autre (0);

 
Le FF ajustement est dû au fait que vous êtes toujours émettre un 0 dans quelques-unes des positions de bits dans la DAL.Ceci est un message de l'optimiseur.L'optimiseur est dit que vous n'avez pas besoin de FF pour contenir une valeur constante.Il faudra les FF et il suffit de connecter le signal à 0.Le synthétiseur créé un FF, car la cession du signal a été conditionné par un événement d'horloge.

Ainsi, vous pouvez ignorer les messages qui sont associés avec le registre DAL.S'il ya d'autres signaux à ce problème, voir si vous obtenez la même condition.

 
HI ..ur processeur qui l'aide??Je pense ur utilisant des processeurs Motrola et en utilisant le contrôleur de bus local.J'ai utilisé la même chose pour mon accès PLD.Je peux vous envoyer mon adresse logique de décodage pour les mêmes.Je ne pose aucun problème.laissez-moi savoir si vous le voulez.

Dont vous avez des tampons / Transciever entre PLD et le processeur ou ajouter des données locales (DAL) lignes sont directement liés à la PLD?

 

Welcome to EDABoard.com

Sponsor

Back
Top