Перейти к содержанию
    

Конечно есть. Прием широко известный и называется "присвоение значения по умолчанию". Переменной в самом начале процесса присваиваете некое удобное вам по каким-то причинам "значение по умолчанию" (например, самое распространенное присвоение в логике процесса), а в нижеследующих case'ах / if'ах присвоение этой переменной будет только для случаев "девиации" от умолчального значения.

можно попробовать. спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

можно попробовать. спасибо.

 

Лучше это все же делать в секции

 

when others =>

...

 

Так будет нагляднее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Лучше это все же делать в секции

 

when others =>

...

 

Так будет нагляднее.

В секции when others значения по умолчанию в том смысле, в каком это нужно TC, не присвоить - он ведь просто не хочет постоянно задавать значение, которое одинаково для многих секций when, а у when others => другая семантика.

Для наглядности лучше просто отдельный case сделать для этой переменной.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это legacy crap, не используйте это для математики.

 

Используйте только его. Для представления чисел используйте типы signed и unsigned и функции to_integer, to_signed, to_unsigned.

 

Переменные можно использовать только внутри process.

 

Все равно не получается.

entity REG_FILE is
port
(
    REG_ADDR_IN     : in std_logic_vector(15 downto 0);
    -- какой то код    
);
end REG_FILE;

architecture behavior of REG_FILE is

    -- какой то код
    signal mailbox_idx : integer := 0;

process(REG_CLK)
begin
      -- какой то код
     mailbox_idx <= to_integer(to_unsigned(REG_ADDR_IN));
end process;
end behavior;

результат

mailbox_idx <= to_integer(REG_ADDR_IN);
Error (10405): VHDL error at reg_file.vhd(75): can't determine type of object at or near identifier "to_integer" -- found 0 possible types

или так
mailbox_idx <= to_integer(to_unsigned(REG_ADDR_IN));
Error (10476): VHDL error at reg_file.vhd(75): type of identifier "REG_ADDR_IN" does not agree with its usage as "natural" type
Error (10346): VHDL error at reg_file.vhd(75): formal port or parameter "SIZE" must have actual or default value

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все равно не получается.

entity REG_FILE is
port
(
    REG_ADDR_IN     : in std_logic_vector(15 downto 0);
    -- какой то код    
);
end REG_FILE;

architecture behavior of REG_FILE is

    -- какой то код
    signal mailbox_idx : integer := 0;

process(REG_CLK)
begin
      -- какой то код
     mailbox_idx <= to_integer(to_unsigned(REG_ADDR_IN));
end process;
end behavior;

результат

mailbox_idx <= to_integer(REG_ADDR_IN);
Error (10405): VHDL error at reg_file.vhd(75): can't determine type of object at or near identifier "to_integer" -- found 0 possible types

или так
mailbox_idx <= to_integer(to_unsigned(REG_ADDR_IN));
Error (10476): VHDL error at reg_file.vhd(75): type of identifier "REG_ADDR_IN" does not agree with its usage as "natural" type
Error (10346): VHDL error at reg_file.vhd(75): formal port or parameter "SIZE" must have actual or default value

mailbox_idx <= to_integer(to_unsigned(REG_ADDR_IN));

Функция to_unsigned обычно применяется для конвертирования INTEGER ---> UNSIGNED. Обязательно необходимо указывать количество разрядов. т.е to_unsigned(,length)

Вот тут отличная картинка по преобразованиям типов при работе с библиотекой numeric_std: https://www.doulos.com/knowhow/vhdl_designe...de/numeric_std/

Изменено пользователем Flip-fl0p

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

mailbox_idx <= to_integer(to_unsigned(REG_ADDR_IN));

Функция to_unsigned обычно применяется для конвертирования INTEGER ---> UNSIGNED. Обязательно необходимо указывать количество разрядов. т.е to_unsigned(,length)

Вот тут отличная картинка по преобразованиям типов при работе с библиотекой numeric_std: https://www.doulos.com/knowhow/vhdl_designe...de/numeric_std/

делал и так

mailbox_idx <= to_integer(TO_unsigned(REG_ADDR_IN,16));

все равно ругается.

Error (10476): VHDL error at reg_file.vhd(78): type of identifier "REG_ADDR_IN" does not agree with its usage as "natural" type

 

 

mailbox_idx <= to_integer(unsigned(REG_ADDR_IN));

ругается.

Error (10621): VHDL Use Clause error at reg_file.vhd(78): more than one Use Clause imports a declaration of simple name "unsigned" -- none of the declarations are directly visible

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

делал и так

mailbox_idx <= to_integer(TO_unsigned(REG_ADDR_IN,16));

все равно ругается.

Error (10476): VHDL error at reg_file.vhd(78): type of identifier "REG_ADDR_IN" does not agree with its usage as "natural" type

 

 

 

ругается.

Error (10621): VHDL Use Clause error at reg_file.vhd(78): more than one Use Clause imports a declaration of simple name "unsigned" -- none of the declarations are directly visible

А не затруднит ли Вас выложить полный текст модуля, на который ругается Quartus. То, что Вы выложили не содержит REG_ADDR_IN

Изменено пользователем Flip-fl0p

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А не затруднит ли Вас выложить полный текст модуля, на который ругается Quartus. То, что Вы выложили не содержит REG_ADDR_IN

вот полный файл. REG_ADDR_IN находиться и поиском и подсветкой.

reg_file.vhd

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот полный файл. REG_ADDR_IN находиться и поиском и подсветкой.

Я уже устал повторять: не используйте эти пакеты вместе:

use ieee.numeric_std.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

если вы не понимаете, что вы делаете.

 

Более того,

use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

не используйте вообще никогда. Точка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот полный файл. REG_ADDR_IN находиться и поиском и подсветкой.

1. use ieee.std_logic_arith.all;

use ieee.std_logic_unsigned.all;

Не используйте эти библиотеки.

 

2. STD_LOGIC_VECTOR каждый разряд может принять 9 значений. И когда применяете CASE надо полностью все состояния описать when others =>

Я поправил, вроде компилируется, но правильность я не проверяю. Не умею с Record работать, не было необходимости. :crying:

 

3. Уверены, что вообще Record нужен ?

 

4. А нужен ли асинхронный сброс ? Допустим, сброс вы синхронизировали и REG_DATA_OUT сброситься. А на остальные триггеры этот сигнал будет работать как ENABLE. Это точно то, что вам надо ?

ONE_DFF.vhd

Изменено пользователем Flip-fl0p

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. use ieee.std_logic_arith.all;

use ieee.std_logic_unsigned.all;

Не используйте эти библиотеки.

 

2. STD_LOGIC_VECTOR каждый разряд может принять 9 значений. И когда применяете CASE надо полностью все состояния описать when others =>

Я поправил, вроде компилируется, но правильность я не проверяю. Не умею с Record работать, не было необходимости. :crying:

 

3. Уверены, что вообще Record нужен ?

 

4. А нужен ли асинхронный сброс ? Допустим, сброс вы синхронизировали и REG_DATA_OUT сброситься. А на остальные триггеры этот сигнал будет работать как ENABLE. Это точно то, что вам надо ?

спасибо.

я их не использую. просто искал проблему, пробовал все подряд. оказалось это и есть проблема use ieee.std_logic_arith.all;.

а что вместо рекорд? память?

насчет рисета я еще не уверен. это только заготовка.

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо.

я их не использую. просто искал проблему, пробовал все подряд. оказалось это и есть проблема use ieee.std_logic_arith.all;.

а что вместо рекорд? память?

насчет рисета я еще не уверен. это только заготовка.

А какая задача стоит ? По тексту схемы у меня появилось примерное понимание что необходимо сделать. Но лучше услышать это от Вас.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А какая задача стоит ? По тексту схемы у меня появилось примерное понимание что необходимо сделать. Но лучше услышать это от Вас.

есть 32 пакета по 17 байт. надо в них писать/читать. мне показалоь рекорд удобней.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

есть 32 пакета по 17 байт. надо в них писать/читать. мне показалоь рекорд удобней.

А не проще ли использовать классическую блочную память, которая есть почти во всех FPGA ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...