2015-03-12 7 views
-5

Я не знаю, почему его отображение ошибки, хотя синтаксис кажется правильным.Здравствуйте, я новичок в программировании VHDL, пожалуйста, помогите мне с этими ошибками.

Я занимаюсь программированием sramctl, где адрес added_in является адресом ввода и адресом вывода sram_adds. Я просто сопоставляю адрес и не рассматриваю шину данных.

library IEEE; 
use IEEE.std_logic_1164.all; 

entity sramctrl is 
port(clk,adsn,blastn,lwdrn,lhold:in std_logic; 
adds_in :in std_logic_vector(9 downto 2);   

adds_4msb:in std_logic_vector(31 downto 28); 
readyn,btermn,sramcsn,sramoen,lholda :out std_logic; 
sram_adds:out std_logic_vector(9 downto 2)); 
end sramctrl; 
architecture behavioral of sramctrl is 
type state_type is(s0,s1,s2); 
signal state:state_type; 
begin 
process(clk,adsn,blastn,lwdrn,lhold,adds_in,adds_4msb) 
begin 
    variable sa:std_logic:='0'; 
    variable a31_a28 :std_logic_vector(3 downto 0):="0000"; 
    variable temp:std_logic_vector(9 downto 2):="00000000"; 
    if(rising_edge(clk))then 
     if ((not adsn) and (adds_4msb="0000"))then   
     a31_28 := adds_4msb; 
     end if; 
     if (lhold='1')then 
      lholda<='1'; 
     else 
      lholda<='0'; 
     end if; 
     sa:=lhold and lholda ; 
     case state is 
      when s0=>sramoen<='1'; 
        sramcsn<='1'; 
        readyn<='1'; 
        btermn<='1'; 
        if((not adsn) and (not adds_4msb) and sa)then 
         temp:=adds_in; 
          if(lwdrn='1')then 
           state<=s1; 
           ready<='0'; 
          else 
           state<=s2; 
          end if; 
        else 
         state<=s0; 
        end if; 
       when s1=>sramoen<='1'; 
         sramcsn<='0'; 
         if(lwdrn and (not blastn) and sa)then 
          sram_adds<=temp; 
          readyn<='1'; 
          btermn<='1'; 
          state<=s0; 
         elsif(lwdrn and blastn and sa)then 
          if(temp=X"fe")then 
           sram_adds<=temp; 
           temp:=temp+1; 
           btermn<='0'; 
           readyn<='0'; 
           state<=s1; 
          elsif(temp=X"ff")then 
           sram_adds<=temp; 
           btermn<='1'; 
           readyn<='1'; 
           state<=s0; 
          else 
           sram_adds<=temp; 
           temp:=temp+1; 
           btermn<='1'; 
           readyn<='0'; 
           state<=s1; 
          end if; 
         else 
          state<=s2; 
         end if; 
      when s2=>sramoen<='0'; 
         sramcsn<='0'; 
        if((not lwdrn) and (not blastn) and sa)then 
         sram_adds<=temp; 
         readyn<='1'; 
         btermn<='1'; 
         state<=s0; 
        elsif((not lwdrn) and blastn and sa)then 
         if(temp=X"fe")then 
          sram_adds<=temp; 
          temp:=temp+1; 
          btermn<='0'; 
          readyn<='0'; 
          state<=s2; 
         elsif(temp=X"ff")then 
          sram_adds<=temp; 
          btermn<='1'; 
          readyn<='1'; 
          state<=s0; 
         else 
          sram_adds<=temp; 
          temp:=temp+1; 
          btermn<='1'; 
          readyn<='0'; 
          state<=s2; 
         end if; 
        else 
        state<=s2; 
        end if; 
     when others =>state<=s0; 
     end case; 
     end if; 
     end process; 
     end behavioral ; 

Не удалось найти решение, пожалуйста, помогите мне. Ошибки она выдвинулась:

COMP96 Compile Архитектура "поведенческой" сущностей "sramctrl"
COMP96 ОШИБКА COMP96_0019: "Ключевое слово 'конец' ожидаемого". «design.vhd» 18 9
COMP96 ERROR COMP96_0019: «Ожидается« конец ключевого слова ». «design.vhd» 19 3
COMP96 ERROR COMP96_0016: «Ожидается объявление единицы дизайна». "design.vhd"

+0

Внутри переменных процесса должны быть объявлены перед операцией 'begin'. – Amir

ответ

1

Ваш синтаксис не подходит.

Как отметил Amir:

process(clk,adsn,blastn,lwdrn,lhold,adds_in,adds_4msb) 
begin 
    variable sa:std_logic:='0'; 
    variable a31_a28 :std_logic_vector(3 downto 0):="0000"; 
    variable temp:std_logic_vector(9 downto 2):="00000000"; 

Должно быть:

process(clk,adsn,blastn,lwdrn,lhold,adds_in,adds_4msb) 
    variable sa:std_logic:='0'; 
    variable a31_a28 :std_logic_vector(3 downto 0):="0000"; 
    variable temp:std_logic_vector(9 downto 2):="00000000"; 
begin 

begin отделяет процесс декларативную часть от процесса выписки часть здесь.

Кроме того, здесь:

 if ((not adsn) and (adds_4msb="0000"))then  

Существует не and оператора, Анды в std_logic и логический (результат правильного выражения). not не является оператором логической редукции, он возвращает std_logic в этом случае.

должен быть вдоль линий:

 if adsn = '0' and adds_4msb = "0000" then 

Каких Ands два булевы результатов. Обратите внимание на исправленное правописание adds_4msb.

Следующая строка:

 a31_28 := adds_4msb; 

имеет опечатки, которые должны быть a31_a28.

И здесь ::

 if lhold = '1' then 
      lholda <= '1'; 
     else 
      lholda <= '0'; 
     end if; 
     sa := lhold and lholda ; 

lholda является выходным и в некоторых инструментах не IEEE Std 1076-2008 совместимый не может быть прочитан. Он также производит sa, который просто задерживается одним циклом моделирования дельта (без увеличения времени) и не имеет другого значения, чтобы обрезать дельта-цикл с конца holda для sa или с начала lhold. Если вы рассчитываете на то, что этот дельта-цикл держится за то, что у вас нет дефектного дизайна. Циклы Delta эмулируют параллелизм, а переменные не должны учитываться для временных отношений. Это означало бы, что у вас нет модели, подходящей для синтеза sram_ctl. Синтез видел бы lhold и lholda как одно и то же, и sa как другое имя для того же самого.

Здесь:

       ready<='0'; 

Там нет сигнала ready присутствует в вашем дизайне.

И:

     if(lwdrn and (not blastn) and sa)then 

, а также:

     elsif(lwdrn and blastn and sa)then 

Вы пытаетесь произвести логическое условие с логическими операторами. (Все эти круглые скобки также избыточны) попробуйте условное тестирование двух выражений на значение std_logic.

Эти два условия показывают по два места.

И:

       temp:=temp+1; 

Там не добавляя оператор "+" прямой видимости (два места). Вы должны либо использовать пакет std_logic_unsigned, либо temp должны быть неподписанными, и вы должны использовать пакет numeric_std (требующий преобразования типа при назначении sram_adds).

+0

Любые предложения по ресурсам, связанным с программированием VHDL? – Karthik

+0

«Любые предложения о ресурсах, связанных с программированием VHDL?» Задавать ресурс вне Stackoverflow не является подходящим вопросом. См. [Некоторые вопросы по-прежнему не относятся к теме ...] (http://stackoverflow.com/help/on-topic) о том, какие вопросы я могу задать здесь. Это место, где можно получить конкретные ответы на конкретные вопросы, а не общие ответы на общие вопросы. Попробуйте googling * VHDL cheatsheet *. – user1155120

 Смежные вопросы

  • Нет связанных вопросов^_^