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

Объявление переменных

День добрый. Делаю первые шаги на VHDL

 

Подскажите как объявить, а еще лучше в каком месте глобальную переменную типа integer.

Я так понял:

entity led_blink is

Port (

LED : out std_logic;

CLK : in std_logic;

LEDS: out std_logic_vector(15 downto 0)

);

shared variable countLEDs: integer range 0 to 65535:=0;

end led_blink;

 

Но синтезатор ругается java script:emoticon(':smile3046:')

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


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

воспользуйся signal

 

да хочеться именно научиться использовать переменные

ИМХО, насколько я понял ВХДЛ переменная должна быть объявленна в процессе, и если она используеться перед тем как ей будет присвоено новое значение то синтезиться тригер/защелка, иначе обычная комбинаторная логика

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


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

Вот какая стоит проблемы

 

используя исходник из быстрого старта (светодиодик мегает с заданной частатой) сделать счетчик этих самих "миганий" и результат вывести на порт LEDS (на нем висит 16 светодиодиков).

 

Я думаю так--- переменная countLEDs будет содержать кол-во "мигов".

 

 

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

 

-- Uncomment the following lines to use the declarations that are

-- provided for instantiating Xilinx primitive components.

--library UNISIM;

--use UNISIM.VComponents.all;

 

entity led_blink is

Port (

LED : out std_logic;

CLK : in std_logic;

LEDS: out std_logic_vector(15 downto 0)

);

--shared variable countLEDs: integer range 0 to 65535:=0;

end led_blink;

 

architecture RTL of led_blink is

signal countL : std_logic_vector(25 downto 0);

 

begin

increment: process (CLK) begin

if(clk'event and clk = '1') then

countL <= countL + 1;

end if;

end process;

LED <= std_logic(countL(25)); -- мигает светодиодик с заданной частатой

countLEDs:= countLEDs + 1; -- считаем кол-во миганий

LEDS <= countLEDs; -- вывожу на 16 светодиодиков

end RTL;

 

Я думаю код должен выглядить так.

А он не работает и ругается :(((

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


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

День добрый. Делаю первые шаги на VHDL

 

Подскажите как объявить, а еще лучше в каком месте глобальную переменную типа integer.

Я так понял:

entity led_blink is

    Port (

      LED : out std_logic;

          CLK : in std_logic;

  LEDS: out std_logic_vector(15 downto 0)

  );

shared variable countLEDs: integer range 0 to 65535:=0;

end led_blink;

 

Но синтезатор ругается java script:emoticon(':smile3046:')

 

 

 

 

 

 

 

Стандарт VHDL допускает определение именно таких (shared variables) в области ENTITY или ARCHITECTURE. Но т.к. синтезаторы поддерживают не весь стандарт, а только его часть, то возможно именно ваш синтезатор просто не пропустит такую переменную. Precision например пропускает, а ваш может нет.

Другой вопрос: зачем она вам нужна, если вы делаете первые шаги. IMHO на первых шагах можно спокойно обойтись и без shared variables.

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


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

День добрый. Делаю первые шаги на VHDL

 

Подскажите как объявить, а еще лучше в каком месте глобальную переменную типа integer.

Я так понял:

entity led_blink is

    Port (

       LED : out std_logic;

           CLK : in std_logic;

   LEDS: out std_logic_vector(15 downto 0)

   );

shared variable countLEDs: integer range 0 to 65535:=0;

end led_blink;

 

Но синтезатор ругается java script:emoticon(':smile3046:')

 

 

 

 

 

 

 

Стандарт VHDL допускает определение именно таких (shared variables) в области ENTITY или ARCHITECTURE. Но т.к. синтезаторы поддерживают не весь стандарт, а только его часть, то возможно именно ваш синтезатор просто не пропустит такую переменную. Precision например пропускает, а ваш может нет.

Другой вопрос: зачем она вам нужна, если вы делаете первые шаги. IMHO на первых шагах можно спокойно обойтись и без shared variables.

 

 

Я использую Xilinx ISE 6.1. Как я понял там синтезатор называется XST

так хочеться же научиться пользоваться этими переменными .....

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


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

Переменную вставлять тут:

 

num_counter:process(clock)

variable countLEDs: integer range 0 to 65535:=0;

begin

if (clock'event and clock='1') then

if (countL(25)='1') then

countLEDs:=countLEDs+1;

end if;

end if;

LEDS<=countLEDs;

end process;

 

 

А как вы предполагали должна работать конструкция "countLEDs:= countLEDs + 1; -- считаем кол-во миганий", без процесса и тактовых импульсов?

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


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

Переменную вставлять тут:

 

num_counter:process(clock)

variable countLEDs: integer range 0 to 65535:=0;

begin

if (clock'event and clock='1') then

if (countL(25)='1') then

countLEDs:=countLEDs+1;

end if;

end if;

LEDS<=countLEDs;

end process;

 

 

А как вы предполагали должна работать конструкция "countLEDs:= countLEDs + 1; -- считаем кол-во миганий", без процесса и тактовых импульсов?

 

Согласен. Спасибо

Это я не туда вставил :))))) countLEDs:=countLEDs+1;

 

Как значение переменной типа integer вывести в порт LEDs

 

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

 

-- Uncomment the following lines to use the declarations that are

-- provided for instantiating Xilinx primitive components.

--library UNISIM;

--use UNISIM.VComponents.all;

 

entity led_blink is

Port (

LED : out std_logic;

CLK : in std_logic;

LEDS: out std_logic_vector(15 downto 0)

);

end led_blink;

 

architecture RTL of led_blink is

signal countL : std_logic_vector(25 downto 0);

begin

increment: process (CLK)

variable countLEDs: integer range 0 to 65535:=0;

begin

if(clk'event and clk = '1') then

countL <= countL + 1;

countLEDs:=countLEDs + 1;

end if;

LED <= std_logic(countL(25));

LEDS<=countLEDs;????? как теперь вывести значение переменной в порт LEDS

end process;

 

end RTL;

 

Переменную вставлять тут:

 

num_counter:process(clock)

variable countLEDs: integer range 0 to 65535:=0;

begin

if (clock'event and clock='1') then

if (countL(25)='1') then

countLEDs:=countLEDs+1;

end if;

end if;

LEDS<=countLEDs;

end process;

 

 

А как вы предполагали должна работать конструкция "countLEDs:= countLEDs + 1; -- считаем кол-во миганий", без процесса и тактовых импульсов?

 

 

ну не работает оно так :(((

в этом месте LEDS<=countLEDs;

Ругается :(((

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


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

Вам уже совершенно справедливо посоветовали не использовать переменных. Без них всегда можно обойтись.

Тем более у вас два обыкновенных счетчика. Почему один из них вы реализовали через сигнал, а другой хотите через переменную?

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


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

ну не работает оно так :(((

в этом месте LEDS<=countLEDs;

Ругается :(((

 

 

Переменные внутри процесса использовать можно, нужно просто понимать их отличие от сигналов. А на счёт внешних shared variables, IMHO можно спокойно описывать и синтезировать логику и без их использования. Тем более если вы уверены, что синтезатор их не поддерживает.

 

А код ваш может выглядеть примерно так:

 

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

 

 

 

 

entity led_blink is

Port (

LED : out std_logic;

CLK : in std_logic;

LEDS: out std_logic_vector(15 downto 0)

);

--shared variable countLEDs: integer range 0 to 65535:=0;

end led_blink;

 

architecture RTL of led_blink is

--signal countLEDs : integer range 0 to 65535:=0;

signal countL : std_logic_vector(25 downto 0) := (others => '0');

 

begin

 

increment: process (CLK) begin

if(clk'event and clk = '1') then

countL <= countL + 1;

end if;

end process;

 

l_count:

process (countL(25))

Variable countLEDs : integer range 0 to 65535:=0;

begin

if(countL(25)'event and countL(25) = '1') then

countLEDs := countLEDs + 1; -- считаем кол-во миганий

LEDS <= CONV_STD_LOGIC_VECTOR(countLEDs, 16); -- вывожу на 16 светодиодиков

end if;

end process;

 

 

LED <= std_logic(countL(25)); -- мигает светодиодик с заданной частатой

 

--countLEDs <= countLEDs + 1; -- считаем кол-во миганий

 

--LEDS <= CONV_STD_LOGIC_VECTOR(countLEDs, 16); -- вывожу на 16 светодиодиков

end RTL;

 

 

Можете использовать хоть переменную countLEDs внутри процесса, хоть сигнал countLEDs. Разница в том, переменная countLEDs будет видима только внутри процесса и на 1 такт опережать сигнал countLEDs.

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


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

tocha, не учите начинающего плохому. Не надо использовать абы какие сигналы в качестве тактовых. Тем более для многоразрядных счетчиков.

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


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

tocha, не учите начинающего плохому. Не надо использовать абы какие сигналы в качестве тактовых. Тем более для многоразрядных счетчиков.

мало того вот эта строка

 countLEDs := countLEDs + 1; -- считаем кол-во миганий

ситезиться то правильно, но при длительной симуляции вылетит ошибка (на 65535 ом такте счета этого счетчика)

:))

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


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

обычно доступ к variable ограничен текущим процессом. И объявляется она как раз в процессе:

process ( ... )

variable hello_i_am_local_var : integer;

begin -- process

....

end

Значение ей присваивается мгновенно.

 

Если вы хотите обмениваться данными с остальными процессами без использования обычных сигналов - тут и появляются global variable.

Такие переменные поддерживаются не всеми программами синтеза (если вы в дальнейшем планируете использовать код в железе).

Глобальные переменные, объявленные в архитектуре -

architecture behave of var_example is

variable I_AM_GLOBAL_ONE : integer;

begin -- arch begin

....

end -- arch end

 

Такая переменная будет видна в каждом процессе -имхо сомнительное достижение ;)

 

поправьте пример от vetal - преобразовав тип integer в тип std_logic_vector с помощью стандартных функций

 

попробуйте при моделировании пройти пошагово через процесс и посмотреть, в какой момент сигналам и переменным присвоятся значения. для наглядности можно вставить временнЫе задержки. Ну и действительно - проверьте переполнение счетчика.

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


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

Если вы хотите обмениваться данными с остальными процессами без использования обычных

Иными словами, если хочется странного. Сигналы как раз для этой цели и используются.

сигналов - тут и появляются global variable.

Такие переменные поддерживаются не всеми программами синтеза (если вы в дальнейшем планируете использовать код в железе).

Глобальные переменные, объявленные в архитектуре -

  architecture behave of var_example is

        variable I_AM_GLOBAL_ONE : integer;

    begin    -- arch begin

    ....

    end        -- arch end

Только называются они разделяемыми (shared). Давайте использовать верную терминологию.

architecture behave of var_example is 
shared variable I_AM_GLOBAL_ONE : integer;

Вы пропустили слово shared.

Такая переменная будет видна в каждом процессе -имхо сомнительное достижение ;)

В коде, который пойдет в железо --- да, согласен полностью. Однако для написания сложных testbench'ей это может пригодиться.

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


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

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

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

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

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

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

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

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

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

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