2012-10-16 2 views
1

J'ai écrit un code VHDL pour le diagramme d'état montré (augh, n'a pas pu poster l'image parce que je suis un nouvel utilisateur). Cependant, quand je compile il dit qu'il y a des erreurs: dans la ligne 16: processus (clk) - erreur de syntaxe détectée au moment de l'analyse ligne 21: else - erreur de syntaxe détectée au moment de l'analyse ligne 23 : fin si; - erreur de syntaxe détectée au moment de l'analyse.Erreur dans mon code VHDL, mais je n'arrive pas à comprendre pourquoi

Ceci est mon code:

library IEEE; 
use IEEE.std_logic_1164.all; 
use IEEE.std_logic_arith.all; 
use IEEE.std_logic_unsigned.ALL; 
entity memory_controller is 
port(clk: in std_logic; 
reset: in std_logic; 
bus_id: in std_logic_vector(7 downto 0); 
read_write, burst: in std_logic; 
oe, we, addr_1, addr_2: out std_logic 
); 
end memory_controller; 
architecture behavioral of memory_controller is 
type statetype is (idle, decision, wr, rd1, rd2, rd3, rd4); 
signal present_state, next_state : statetype; 
process(clk) [LINE 16] 
begin 
if (rising_edge(clk)) then 
    if (reset ='0') then 
     present_state <= next_state; 
    else [LINE 21] 
     present_state <= idle; 
    end if; [LINE 23] 
end if; 
end process; 
process(present_state, read_write, ready, burst) 
begin 
case present_state is 
when idle => 
    oe => '0'; we=> '0'; addr_1=> '0'; addr_2=> '0'; 
if(bus_id = "11110011") then 
    next_state <= decision; 
else 
    next_state <= idle; 
end if; 
when decision => 
    if (read_write = '1') 
     then next_state <= rd1; 
    else next_state <= wr; 
end if; 
when wr => 
we = '1'; 
    if (ready = '1') 
then next_state <= idle; 
else 
next_state <= wr; 
end if; 
when rd1 => 
oe = '1'; 
addr_1 = addr_1 + '1'; 
addr_2 = addr_2 + '1'; 
if(ready = '0') then 
next_state <= rd1; 
if(burst = '0') then 
next_state <= idle; 
else next_state <= rd2; 
end if; 
when rd2 => 
oe = '1'; 
addr_1 = addr_1 + '1'; 
addr_2 = addr_2 + '1'; 
if(ready = '1') then 
next_state => rd3; 
else 
next_state => rd2; 
end if; 
when rd3 => 
oe = '1'; 
addr_1 = addr_1 + '1'; 
addr_2 = addr_2 + '1'; 
if(ready = '1') then 
next_state => rd4; 
else 
next_state => rd3; 
when rd4 => 
oe = '1'; 
addr_1 = addr_1 + '1'; 
addr_2 = addr_2 + '1'; 
if(ready = '1') 
then next_state => idle; 
else next_state => rd4; 
end if; 
end case; 
end process; 
end behavioral; 

La syntaxe est tout à fait raison, je ne comprends pas pourquoi il est une erreur. Quel pourrait être le problème?

En outre, je veux utiliser des instructions assert pour les cas où ready = 0, burst = 0 et ready = 0 et burst = 1, mais je ne suis pas sûr de la façon de les implémenter dans le code principal.

J'ai mis en évidence les lignes 16, 21 et 23.

Toute aide serait grande.

+0

Je pense que vous manquez 'begin' dans votre code. VHDL est le langage strict de la syntaxe. Vous devez utiliser un modèle avant d'écrire un modèle (à partir d'un livre/code source). L'autre moyen est d'utiliser un meilleur éditeur avec aligner et/ou funtion auto-complète. Emacs avec le mode VHDL est le meilleur pour le nouveau type (bien qu'il soit difficile à utiliser). P/S: vous devez ajouter du caractère 'tab' pour l'alignement, il est facile de lire pour tout le monde: D – Khanh

Répondre

4

La forme d'un module VHDL est généralement:

entity MODULENAME is 
    <Port description> 
end MODULENAME; 

architecture behavioral of MODULENAME is 
    <signal declarations and similar> 
begin 
    <synchronous and combinatorial logic statements> 
end architecture behavioral; 

Ce que vous manquiez est le begin après vos déclarations de signal. Autrement dit, le changement

architecture behavioral of memory_controller is 
    type statetype is (idle, decision, wr, rd1, rd2, rd3, rd4); 
    signal present_state, next_state : statetype; 

    process(clk) [LINE 16] 
    begin 
    if (rising_edge(clk)) then 

Pour:

architecture behavioral of memory_controller is 
    type statetype is (idle, decision, wr, rd1, rd2, rd3, rd4); 
    signal present_state, next_state : statetype; 

begin 

    process(clk) [LINE 16] 
    begin 
    if (rising_edge(clk)) then 
+0

Merci! Je l'ai compris et j'ai modifié le code un peu, maintenant j'ai encore quelques erreurs. J'ai déclaré l'adresse comme std_logic_vector (7 downto 0) et lors de l'initialisation, je l'ai donné comme addr_1 <= '00000000' et il dit que c'est une erreur de syntaxe. Je suis perdu maintenant. – Pinkyandthebrain

+0

@Khanh Dang Merci pour les suggestions, j'ai appris VHDL il y a un jour, donc je suis toujours en train de faire le coup, et donc de faire beaucoup d'erreurs ... * embarrassé * – Pinkyandthebrain

3

Comme le souligne SonicWave, vous manque le mot-clé begin avant votre première déclaration.

Il existe plusieurs autres erreurs de syntaxe. affectations des signaux utilisent une flèche pointant vers la gauche:

  • pas oe => '0'; mais oe <= '0';
  • pas we = '1'; mais we <= '1';

Si vous utilisez un éditeur avec des commentaires du compilateur directe, vous vous éviterez beaucoup de temps. enter image description here

+0

Quel éditeur proposeriez-vous? – Pinkyandthebrain

+0

@Pinkyandthebrain La capture d'écran a été prise avec Sigasi gratuitement Starter Edition: http://www.sigasi.com – Philippe

Questions connexes