2013-10-05 4 views
0

я редактировал эту нить, чтобы обновить весь мой новый проект и сделать его более удобным для чтения:VHDL, если-то-иначе-если заявление

--Propagate & generate team-- 
LIBRARY ieee; 
USE ieee.std_logic_1164.all; 
USE ieee.numeric_std.all; 
ENTITY PG_team_1bit IS 
    PORT(a, b:IN STD_LOGIC; 
     p: OUT STD_LOGIC; 
     g: OUT STD_LOGIC); 
END PG_team_1bit; 
ARCHITECTURE PG_team_1bit_arch OF PG_team_1bit IS 
BEGIN 
    p <= a XOR b; 
    g <= a AND b;  
END PG_team_1bit_arch;  


--Grey Box-- 
LIBRARY ieee; 
USE ieee.std_logic_1164.all; 
USE ieee.numeric_std.all; 
ENTITY Grey_box IS 
    PORT(P, G, Gminus:IN STD_LOGIC; 
     NewG: OUT STD_LOGIC); 
END Grey_box; 
ARCHITECTURE Grey_box_arch OF Grey_box IS 
    SIGNAL temp: STD_LOGIC; 
BEGIN 
    temp <= P AND Gminus; 
    NewG <= G OR temp;  
END Grey_box_arch;  


--Black Box-- 
LIBRARY ieee; 
USE ieee.std_logic_1164.all; 
USE ieee.numeric_std.all; 
ENTITY Black_box IS 
    PORT(P, G, Pminus, Gminus:IN STD_LOGIC; 
     NewP, NewG: OUT STD_LOGIC); 
END Black_box; 
ARCHITECTURE Black_box_arch OF Black_box IS 
    SIGNAL temp: STD_LOGIC; 
BEGIN 
    NewP <= P AND Pminus; 
    temp <= P AND Gminus; 
    NewG <= G or temp;  
END Black_box_arch; 


--Full adder-- 
LIBRARY ieee; 
USE ieee.std_logic_1164.all; 
USE ieee.numeric_std.all; 
ENTITY Full_Adder IS 
    PORT(A, B, Cin:IN STD_LOGIC; 
     S, Cout: OUT STD_LOGIC); 
END Full_Adder; 
ARCHITECTURE Full_Adder_arch OF Full_Adder IS 
    SIGNAL p: STD_LOGIC; 
BEGIN 
    p <= A XOR B; 
    S <= p XOR Cin; 
    Cout <= (A AND B) OR (A AND Cin) OR (B AND Cin);  
END Full_Adder_arch; 



--SKLANSKY SPARSE TREE ADDER 32 bit-- 
LIBRARY ieee; 
USE ieee.std_logic_1164.all; 
USE ieee.numeric_std.all; 
ENTITY SSTA32 IS 
    PORT(A, B:IN STD_LOGIC_VECTOR(31 downto 0); 
     S: OUT STD_LOGIC_VECTOR(32 downto 0)); 
END SSTA32; 
ARCHITECTURE SSTA32_arch of SSTA32 IS 
    SIGNAL con: STD_LOGIC; 
    SIGNAL p: STD_LOGIC_VECTOR(31 downto 0); 
    SIGNAL g: STD_LOGIC_VECTOR(31 downto 0); 
    SIGNAL NewGG: STD_LOGIC_VECTOR(6 downto 0); 
    SIGNAL NewP: STD_LOGIC_VECTOR(6 downto 0); 
    SIGNAL NewBG: STD_LOGIC_VECTOR(6 downto 0); 
    variable j : integer := 0; 
    variable k : integer := 0; 
    variable l : integer := 0; 
    variable m : integer := 0; 
    variable d : integer := 0; 
    variable e : integer := 0; 
COMPONENT PG_team_1bit 
    PORT(a, b:IN STD_LOGIC; 
     p: OUT STD_LOGIC; 
     g: OUT STD_LOGIC); 
END COMPONENT; 
COMPONENT Grey_box IS 
    PORT(P, G, Gminus:IN STD_LOGIC; 
     NewG: OUT STD_LOGIC); 
END COMPONENT; 
COMPONENT Black_box IS 
    PORT(P, G, Pminus, Gminus:IN STD_LOGIC; 
     NewP, NewG: OUT STD_LOGIC); 
END COMPONENT; 
COMPONENT Full_Adder IS 
    PORT(A, B, Cin:IN STD_LOGIC; 
     S, Cout: OUT STD_LOGIC); 
END COMPONENT; 
BEGIN 
    con <= '1'; 
    GENERATE_LABEL_1: 
    FOR i IN 0 TO 31 GENERATE 
     PG_team_1bit_i: PG_team_1bit PORT MAP(a(i), b(i), p(i), g(i)); 
    END GENERATE GENERATE_LABEL_1; 
    GENERATE_LABEL_2: 
    FOR i IN 0 TO 31 GENERATE 
     BEGIN 
      F0 : IF ((i=1) OR (i=5) OR (i=9) OR (i=13) OR (i=17) OR (i=21) OR (i=25) OR (i=29)) GENERATE 
      BEGIN Grey_box_i: Grey_box PORT MAP(p(i), g(i), g(i-1), NewGG(j));-- 
      j := j+1; 
      END GENERATE F0; 
      F1 : IF ((i/=1) AND (i/=5) AND (i/=9) AND (i/=13) AND (i/=17) AND (i/=21) AND (i/=25) AND (i/=29)) GENERATE 
      BEGIN Black_box_i: Black_box PORT MAP(p(i), g(i), p(i-1), g(i-1), NewP(k), NewBG(k)); 
      k := k+1; 
      END GENERATE F1; 
     END GENERATE GENERATE_LABEL_2; 
    GENERATE_LABEL_3: 
    FOR i IN 0 TO 31 GENERATE 
     BEGIN 
     F2 : IF (i=3) GENERATE 
      BEGIN Grey_box_i: Grey_box PORT MAP(NewP(m), NewBG(m), NewGG(m), DNewG); 
      m := m+1; 
      END GENERATE F2; 
     F3 : IF ((i=7) OR (i=11) OR (i=15) OR (i=19) OR (i=23) OR (i=27) OR (i=31)) GENERATE 
      BEGIN Black_box_i: Black_box PORT MAP(NewP(m), NewBG(m), con, NewBG(m), TNewP(l), TNewBG(l)); 
      l := l+1; 
      END GENERATE F3; 
     END GENERATE GENERATE_LABEL_3; 
    GENERATE_LABEL_4: 
    FOR i IN 0 TO 31 GENERATE 
     BEGIN 
     F4 : IF (i=3) GENERATE 
      BEGIN C(d) <= '0'; 
      d := d+1; 
      C(d) <= NOT DNewG; 
      d := d+1; 
      END GENERATE F4; 
     F5 : IF (i=7) GENERATE 
      BEGIN Grey_box_i: Grey_box PORT MAP(TNewP(e), TNewBG(e), DNewG, DNewG2); 
      C(d) <= NOT DNewG2; 
      d := d+1; 
      e := e+1; 
      END GENERATE F5; 
     F6 : IF (i=11) GENERATE 
      BEGIN Grey_box_i: Grey_box PORT MAP(NOT TNewP(e), NOT TNewBG(e), DNewG2, C(d)); 
      d := d+1; 
      e := e+1; 
      END GENERATE F6; 
     F7 : IF (i=15) GENERATE 
      BEGIN Black_box_i: Black_box PORT MAP(TNewP(e), TNewBG(e), TNewP(e-1), TNewBG(e-1), QNewP, QNewBG); 
      Grey_box_i: Grey_box PORT MAP(QNewP, QNewBG, DNewG2, DNewG3); 
      C(d) <= DNewG3; 
      d := d+1; 
      e := e+1; 
      END GENERATE F7; 
     F8 : IF (i=19) GENERATE 
      BEGIN Grey_box_i: Grey_box PORT MAP(NOT TNewP(e), NOT TNewBG(e), DNewG3, C(d)); 
      d := d+1; 
      e := e+1; 
      END GENERATE F8; 
     F9 : IF (i=23) GENERATE 
      BEGIN Black_box_i: Black_box PORT MAP(TNewP(e), TNewBG(e), TNewP(e-1), TNewBG(e-1), PNewP, PNewBG); 
      Grey_box_i: Grey_box PORT MAP(PNewP, PNewBG, DNewG3, C(d)); 
      d <= d+1; 
      e <= e+1; 
      END GENERATE F9; 
     F10 : IF (i=27) GENERATE 
      BEGIN Black_box_i: Black_box PORT MAP(NOT TNewP(e), NOT TNewBG(e), PNewP, PNewBG, HNewP, HNewBG); 
      Grey_box_i: Grey_box PORT MAP(HNewP, HNewBG, DNewG3, C(d)); 
      END GENERATE F10; 
     END GENERATE GENERATE_LABEL_4; 
    d := 0; 
    GENERATE_LABEL_5: 
    FOR i IN 0 TO 31 GENERATE 
     BEGIN 
     F11 : IF ((i=0) AND (d=0)) GENERATE 
      BEGIN Cin <= C(d); 
      d := d+1; 
      END GENERATE F11; 
     F12 : IF ((i=4) AND (d=1)) GENERATE 
      BEGIN Cin <= C(d); 
      d := d+1; 
      END GENERATE F12; 
     F13 : IF ((i=8) AND (d=2)) GENERATE 
      BEGIN Cin <= C(d); 
      d := d+1; 
      END GENERATE F13; 
     F14 : IF ((i=12) AND (d=3)) GENERATE 
      BEGIN Cin <= C(d); 
      d := d+1; 
      END GENERATE F14; 
     F15 : IF ((i=16) AND (d=4)) GENERATE 
      BEGIN Cin <= C(d); 
      d := d+1; 
      END GENERATE F15; 
     F16 : IF ((i=20) AND (d=5)) GENERATE 
      BEGIN Cin <= C(d); 
      d := d+1; 
      END GENERATE F16; 
     F17 : IF ((i=24) AND (d=6)) GENERATE 
      BEGIN Cin <= C(d); 
      d := d+1; 
      END GENERATE F17; 
     F18 : IF ((i=28) AND (d=7)) GENERATE 
      BEGIN Cin <= C(d); 
      d := d+1; 
      END GENERATE F18; 
     Full_Adder_i: Full_Adder PORT MAP(a(i), b(i), Cin, S(i), Cout); 
     Cin <= Cout; 
     F19 : IF (i=31) GENERATE 
      BEGIN S(32) <= Cout; 
      END GENERATE F19; 
     END GENERATE GENERATE_LABEL_5; 
END SSTA32_arch; 

Ошибки, которые я получаю, являются следующим: -не статического сигнала имена для почти всех сигналов, которые я использую. -Variable Декларация не допускается, где я это сделал. -Неизвестные идентификаторы. -Необходимая цель для назначения сигнала и -Согласно сопутствующее заявление.

Любые советы по их устранению? Также я могу сгенерировать, если теперь правильно? Я изменил это, чтобы избежать процессов. заблаговременно

ответ

0

Отступ, основанный на структуре, часто обнаруживает проблемы синтаксиса, поэтому я взял свободу, чтобы украсить ваш код. Как вы можете видеть в последней части, многие операторы if не имеют надлежащих закрывающих операторов end if. Ошибка синтаксиса должна быть исправлена, и вы можете использовать elsif для обоюдного исключения .

Что касается ваших вопросов:

  1. То, что я должен положить в списке чувствительности: Для процесса, который описывает флип-флоп (ы), чувствительность должны должны часы и любые асинхронный сброс сигнал (ы). Для процесса, который описывает комбинаторную логику, список чувствительности должен содержать все сигналы источника, которые используются в комбинаторной логике. В общем, любой процесс, который вы пишете, должен быть одним из двух, поэтому либо , описывающим триггер (-ы), либо описывающий комбинаторную логику. Процесс после вопросов не является одним из двух и имеет несколько проблем: не разрешено создавать экземпляры модулей, Grey_box и Black_box внутри процесса, , и в общем случае вы не можете использовать k как переменную, с := Назначить, без , объявив его в процессе.

  2. Как сделать p и g глобальным; что я сделал недостаточно? p и g доступны с момента объявления в архитектуре, поэтому проблема связана с попыткой создания экземпляра модуля i процесса, как я заметил выше.

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

Хорошее место для начала - Wikipedia VHDL page, где вы можете посмотреть под Further reading. Чтобы получить хороший опыт VHDL, я предлагаю вам заручиться некоторыми из ресурсов, чтобы узнать основные понятия.

+0

Большое спасибо за быстрый answer.I получил эти вопросы: 1. "Для процесса, который описывает комбинаторной логики, список чувствительности должен содержать все исходные сигналы, используются в комбинаторной логике ». Поскольку моя логика i (целое число) по сравнению с чем-то, как я могу это сделать? Потому что я попытался поместить целое число в круглую скобку, и он говорит, что я не могу этого сделать. 2. «попытка создания экземпляра модуля i процесса» Я читал, что при поиске. Можете ли вы объяснить это, я не понимаю, что это значит. Спасибо заранее. –

+0

1: Проблема не связана с типом (целое число), но элемент в списке чувствительности должен быть сигналом, поэтому должен быть объявлен в архитектуре. –

+0

1: Проблема не связана с типом (целое число), но элемент в списке чувствительности должен быть сигналом. 2: Отличная статья Брайана Драммондс описывает «два домена», а модули помещаются в неправильный домен, поскольку вы не можете помещать модули внутри процесса. Я бы предположил, что вы тратите некоторое время на ознакомление с общими принципами VHDL и сами пишете небольшие примеры, поскольку это не похоже на другие языки программирования, где вы можете использовать все заявления во всем коде. VHDL - это язык описания оборудования (HDL), где текст описывает аппаратное обеспечение, поэтому ваш код должен быть аппаратным. –

1

Шаг назад немного; ясно, что вы еще не привыкли к VHDL; он немного отличается от других языков, и различия откровенно (ИМО) не очень хорошо преподаются во многих (большинстве?) книгах.

Исправление ошибок синтаксиса не поможет вам в этом; научитесь видеть за собой концептуальные ошибки.

В некоторых текстах подчеркивается, что VHDL - это язык описания аппаратного обеспечения, а не язык программирования: хотя это правда, это не особенно полезно и может привести к плохой практике проектирования на низком уровне. Вот другое представление ...

VHDL - это фактически два разных языка в одном: последовательный язык, такой как Pascal или C, и язык параллельной обработки, такой как ... Я не могу придумать хороший пример, но, возможно, функциональный язык программирования, такой как ML или Haskell (медведь со мной на этом бите ...), где все происходит параллельно, а не в каком-либо конкретном порядке: реальная сила VHDL заключается в том, что она делает это safely!

В рамках процесса вы может обрабатывать его как последовательный язык, с функциями, процедурами (функции void для программистов C!), переменными, циклами, если/then/else и знакомой последовательной семантикой - с одним исключением: Signals have different semantics, потому что они являются средством связи между (обычно разные) processe s. (Типичная программа C - это единственный процесс: если вы пишете многопоточные программы на C, вы знаете, что для них вам нужна совсем другая дисциплина и дополнительная поддержка, например, библиотека потоков).

Другой аспект VHDL - это параллельный аспект, в котором вы создаете несколько блоков - по существу, все процессы, работающие независимо друг от друга, обмениваются данными посредством сигналов. Вне процесса у вас есть другой набор инструментов программирования:

  • Объекты/архитектуры - это обертки вокруг группы процессов.

  • Компоненты - это то же самое, потому что они просто сопоставляются объектам (через конфигурации, позволяющие выбирать разные объекты или архитектуры ). Если вам не нужно переназначать их, вы можете исключить компоненты и напрямую создавать объекты в дизайне.

  • Простые назначения сигналов, такие как p <= A XOR B; вне процесса являются сокращением для полного процесса, завершающего это одно назначение.

  • Предусмотрены также условные назначения сигналов и выбранные назначения сигналов, например.

    p <= A when B = '1' else C; Это еще раз сокращения процессов.

  • Проводка нескольких параллельных процессов становится утомительной: операторы Generate являются инструментами для автоматизации этой работы.

Это ошибка, чтобы смешать два домена: например, использование, если/то/другое или переменная назначения a := b; вне процесса или для создания экземпляра компонента или использовать Generate внутри одного. Теперь, в ARCHITECTURE SSTA32_arch of SSTA32, вы можете видеть такие ошибки ...

Я не собираюсь исправлять ваш проект, и я не думаю, что вы хотите меня; но вот несколько указателей:

  • В то время как вы можете использовать переменные и присваивание переменной вне процесса, это обычно ошибка: они известны как «общих переменных» и (в C программист термины) не потокобезопасный и обычно не будет делать то, что вы ожидаете. Использование сигналов (и изучение их семантики) - это путь сюда.

  • В то время как вы не можете использовать if a then b else c; вне процесса, вы можете использовать if a generate b; end generate; if not a generate c; end generate;, и вы можете вставлять операторы генерации.

  • Лучшее форматирование облегчит чтение и ошибки.

  • Я думаю, что вы можете «ELSIF» вместо «еще, если» в местах: что обращается много пропавших без вести «конец, если» проблемы

EDIT: больше указателей на обновленный ответ .. .

  • «Variable декларация не разрешено» в архитектуре еще вопрос ... на первый взгляд, я не мог понять, почему вы не используете сигналы.

  • На второй взгляд:

    F2 : IF i=3 GENERATE 
        BEGIN 
         Grey_box_i: Grey_box PORT MAP(NewP(m), NewBG(m), NewGG(m), DNewG); 
         m := m+1; 
        END GENERATE F2; 
    

Вы не можете использовать переменные в Сформировать заявление подобное (потому что они находятся вне процесса). Я подозреваю, что вы намереваетесь, чтобы их ценность была по существу статичной - детерминированной функцией (i), а не обладателями государства в своем собственном праве.

Компилятор не знает этого - он видит больше состояний, которые могут потенциально меняться во время выполнения (и вы не можете увеличить количество аппаратных средств во время выполнения!), Поэтому он отвергает эту идею. Например, есть без заказа оборудования, произведенного Generate, таким образом генерируя случай «i = 3», последний законен, и у вас есть нет гарантий по значению m. Вам, вероятно, не понравится результат!

Решение прост: исключить m как переменную и make Это функция (i).

function m(x : integer) return integer is 
begin 
    case x is 
     when 3  => return 0; 
     when others => return 1; 
    end case; 
end m; 

... PORT MAP(NewP(m(i)), ... 

Функции принадлежат архитектуре другим декларациям. Поскольку i является фиксированным (статическим) в любом экземпляре инструкции generate, f (i) - здесь m (i) - также является статическим, и хотя я не тестировал этот подход, я ожидаю, что он сработает.

  • Что касается неизвестных идентификаторов, я вижу различные имена, такие как DNEWG в приведенном выше фрагменте кода, для которого я не могу найти декларацию; это тривиально.

  • Вы можете потерять ненужные круглые скобки вокруг if-выражений; они просто оставленные загромождали на прохождение C программист

+0

Привет, спасибо за ответ. 1. «Лучшее форматирование упростит чтение и ошибки, которые легче обнаружить». Вы имеете в виду после того, как if и т. Д., Если я наберу? Я ожидал увидеть, если я получу синтаксическую ошибку, если я не сделал вкладку, поэтому я не исправил это. Некоторые изменили ее для меня. Я исправлю свой проект. 2. О elsif, да, я тоже это исправлю. Я пропустил их. 3.I попытаюсь понять, что вы сказали о конце, генерировать материал и вернуться. Большое спасибо за быструю помощь. –

+0

Если вы можете повторно проверить кодировку сейчас, когда я попытался ее исправить. Спасибо. –

+0

1.Do Мне нужно объявить каждый сигнал, даже если он выходит из PORT MAP компонента в качестве выхода? 2.В решении, которое вы добавили, возвращаемые значения перейдут к переменной x правильно? Так как это связано с «i» в PORT MAP? Кроме того, я не знаю, ясно ли мое кодирование, но я пытался использовать все переменные в качестве индикаторов, а иногда даже, если «i» достигло значения 31, индикатор остановился бы, допустим, на 7, потому что только внутри если заявления его значение повысится. 3. Я исправлю скобки. Большое спасибо за помощь до сих пор. –

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