2013-09-09 5 views
1

На самом деле я новичок в VHDL, я пытаюсь присвоить переменную функции переменной, объявленной в области функций. Но я получаю сообщение об ошибке при синтезе. Я использую ISE Project Navigator. Вот мой код.Как использовать переменные функции внутри области действия функции в VHDL?

function moverDerecha(datos : std_logic_vector(2 downto 0)) RETURN std_logic_vector(2 downto 0) IS 
    variable TMP : datos; 
    --TMP := datos; 
    begin 
     TMP(0)<=TMP(2); 
     TMP(1)<=TMP(0); 
     TMP(2)<=TMP(1); 
    return TMP; 
end moverDerecha; 

Надеюсь, вы могли бы мне помочь! Это часть моей домашней работы n.n.

+0

Какая ошибка вы получаете? –

+0

ОШИБКА: HDLCompiler: 60 - «/ home/alberto/Dropbox/Untitled/ESCOM/Sistemas Digitales/Practicas/Practica3RegistroEspecifico/Practica3RegistroEspecifico/RegistroEspecifico.vhd» Строка 32: индексированное имя не является типом –

+0

ОШИБКА: HDLCompiler: 60 - "/ home/alberto/Dropbox/Untitled/ESCOM/Sistemas Digitales/Practicas/Practica3RegistroEspecifico/Practica3RegistroEspecifico/RegistroEspecifico.vhd "Линия 33: datos не является типом –

ответ

1

Вы должны указать тип для переменной (после двоеточия):

variable TMP : std_logic_vector(2 downto 0) := datos; 

Вы также должны использовать := и не <= присвоить переменным:

TMP(0) := TMP(2); 
TMP(1) := TMP(0); 
TMP(2) := TMP(1); 

Я не знаю, будет ли компилятор оптимизировать это, но вы по существу устанавливаете переменную TMP два раза. Сначала скопируйте datos, чтобы выполнить смену. Это было время, так как я работал с VHDL, но я мог бы предложить:

function moverDerecha(datos : std_logic_vector(2 downto 0)) RETURN std_logic_vector(2 downto 0) IS 
    variable TMP : std_logic_vector(2 downto 0); 
begin 
    TMP(2 downto 1) := datos(1 downto 0); 
    TMP(0) := datos(2); 

    return TMP; 
end moverDerecha; 

Также это может быть просто меня, но, похоже, эта функция выполняет сдвиг влево?

+0

Я пробовал, что вы публикуете, но ошибка стал другим. ОШИБКА: HDLCompiler: 866 - "/ главная/альберто/Dropbox/Untitled/ЭСКОМ/Системас Digitales/практиках/Practica3RegistroEspecifico/Practica3RegistroEspecifico/RegistroEspecifico.vhd" Линия 45: Использование: = присвоить переменной TMP –

+0

@ JuanReséndiz I» линия угадывания 45 находится в другой функции? –

+0

На самом деле одна функция перемещает все содержимое внутри вектора влево, а другое перемещает его вправо. Я решил просто опубликовать один из них, оба они похожи. –

0

Я нашел, почему все мои функции не работали.

Я решил использовать пакет и внутри него объявить каждую функцию. Затем добавление

library work; 
use work.my_package.all; 

Окончательно решены все проблемы. Я знаю, что у меня все еще много проблем в VHDL, но я над этим работаю! :) Благодаря lc

1

У меня была такая же проблема. Затем я обнаружил, что тип возвращаемого типа должен быть общим типом i.e, если вы используете std_logic_vector(1 downto 0) для типа возврата, вы должны объявить его как return std_logic_vector is, просто опуская часть (1 downto 0).

+0

Это! Интересно, почему это работает так, почему вы не сможете вернуть конкретный тип. – Piedone