VHDL - проблема с std_logic_vector - PullRequest
       14

VHDL - проблема с std_logic_vector

2 голосов
/ 01 декабря 2009

Я кодирую 4-битный двоичный сумматор с аккумулятором:

library ieee;
use ieee.std_logic_1164.all;

entity binadder is
    port(n,clk,sh:in bit;
        x,y:inout std_logic_vector(3 downto 0);
        co:inout bit;
        done:out bit);
end binadder;

architecture binadder of binadder is
    signal state: integer range 0 to 3;
    signal sum,cin:bit;
begin
    sum<= (x(0) xor y(0)) xor cin;
    co<= (x(0) and y(0)) or (y(0) and cin) or (x(0) and cin);

    process
    begin
        wait until clk='0';
        case state is
            when 0=>
                if(n='1') then
                    state<=1;
                end if;
            when 1|2|3=>
                if(sh='1') then
                    x<= sum & x(3 downto 1);
                    y<= y(0) & y(3 downto 1);
                    cin<=co;
                end if;
                if(state=3) then
                    state<=0;
                end if;
        end case;
    end process;

    done<='1' when state=3 else '0';
end binadder;

Выход:

- Компиляция архитектуры binadder из binadder

** Ошибка: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (15):

Нет возможных записей для инфиксного оператора "Исключающее".

** Ошибка: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (15):

Ошибка при разрешении инфиксного выражения "xor" как тип std.standard.bit.

** Ошибка: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (16):

Нет возможных записей для инфиксного оператора "И".

** Ошибка: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (16):

Плохое выражение в правом операнде инфиксное выражение "или".

** Ошибка: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (16):

Нет возможных записей для инфиксного оператора "И".

** Ошибка: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (16):

Плохое выражение в левом операнде инфиксное выражение "или".

** Ошибка: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (16):

Плохое выражение в правом операнде инфиксное выражение "или".

** Ошибка: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (16):

Ошибка при разрешении инфиксного выражения "или" как тип std.standard.bit.

** Ошибка: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (28):

Нет возможных записей для инфиксного оператора "&".

** Ошибка: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (28):

Ошибка при разрешении инфиксного выражения "&" как тип ieee.std_logic_1164.std_logic_vector.

** Ошибка: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (39):

Компилятор VHDL выходит из

Полагаю, я не правильно обращаюсь с std_logic_vector. Подскажите пожалуйста как? (

Ответы [ 2 ]

7 голосов
/ 01 декабря 2009

Одной из особенностей VHDL является то, что в самом базовом языке предоставляется очень мало функциональных возможностей. Большая часть этого обеспечивается с помощью пакетов. Вторая строка вашего кода является примером этого (используйте ieee.std_logic_1164.all). Это означает, что вы используете весь пакет std_logic_1164. См. здесь для определения этого пакета.

Когда вы пишете код, вы обычно хотите хранить свои сигналы либо в std_logic, либо в std_logic_vector. Для этого есть две причины. Во-первых, std_logic может также представлять значения, отличные от «0» или «1». Он также может представлять «Z» или «X», например. Во-вторых, симуляторы (например, модели, которые вы используете) оптимизированы для ускорения работы с std_logic.

Как правило, рекомендуется всегда делать входные и выходные данные вашей сущности std_logic или std_logic_vector.

Конкретная проблема, с которой вы столкнулись, заключается в том, что вы используете бит типа (который является одним из очень немногих типов, определенных в стандарте VHDL) с xor.

Самое простое решение - изменить вывод co в вашем объекте на тип std_logic и изменить объявление для sum и cin на тип std_logic.

entity binadder is
    port(n,clk,sh:in bit;
         x,y:inout std_logic_vector(3 downto 0);
         co:inout std_logic;
         done:out bit);
end binadder;

    signal sum,cin:std_logic;

Еще один комментарий заключается в том, что, как правило, вводить порты в действие является плохой практикой, если только у вас нет для этого веской причины, поскольку это устраняет некоторые строгие проверки типов, встроенные в язык. Лучшее решение - создать сигнал внутри самого объекта и назначить сигнал непосредственно на выход.

entity binadder is
    port(n,clk,sh:in bit;
         x,y:inout std_logic_vector(3 downto 0);
         co:out std_logic;
         done:out bit);
end binadder;

    signal co_int:std_logic;
 begin
    co_int<= (x(0) and y(0)) or (y(0) and cin) or (x(0) and cin);
    co <= co_int;

Последний комментарий: если значение состояния равно 1, каким оно станет 2 или 3?

0 голосов
/ 05 июня 2010

Посмотрите на ваши логические и физические отображения библиотеки.

Убедитесь, что в физической библиотеке фактически сброшены пакеты.

Убедитесь, что вы не используете другую версию скомпилированного заголовка с другой версией симулятора.

Если ничего не работает, просто сделайте локальную копию ieee, скомпилируйте в нее пакеты std_logic_1164, перейдите в рабочую библиотеку и затем скомпилируйте ваш дизайн. Это имеет для работы.

...