cheetah 0 7 июня, 2005 Опубликовано 7 июня, 2005 · Жалоба День добрый. Делаю первые шаги на 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:') Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 7 июня, 2005 Опубликовано 7 июня, 2005 · Жалоба воспользуйся signal Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cheetah 0 7 июня, 2005 Опубликовано 7 июня, 2005 · Жалоба воспользуйся signal <{POST_SNAPBACK}> да хочеться именно научиться использовать переменные Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 7 июня, 2005 Опубликовано 7 июня, 2005 · Жалоба воспользуйся signal <{POST_SNAPBACK}> да хочеться именно научиться использовать переменные <{POST_SNAPBACK}> ИМХО, насколько я понял ВХДЛ переменная должна быть объявленна в процессе, и если она используеться перед тем как ей будет присвоено новое значение то синтезиться тригер/защелка, иначе обычная комбинаторная логика Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cheetah 0 7 июня, 2005 Опубликовано 7 июня, 2005 · Жалоба Вот какая стоит проблемы используя исходник из быстрого старта (светодиодик мегает с заданной частатой) сделать счетчик этих самих "миганий" и результат вывести на порт 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; Я думаю код должен выглядить так. А он не работает и ругается :((( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tocha 0 7 июня, 2005 Опубликовано 7 июня, 2005 · Жалоба День добрый. Делаю первые шаги на 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:') <{POST_SNAPBACK}> Стандарт VHDL допускает определение именно таких (shared variables) в области ENTITY или ARCHITECTURE. Но т.к. синтезаторы поддерживают не весь стандарт, а только его часть, то возможно именно ваш синтезатор просто не пропустит такую переменную. Precision например пропускает, а ваш может нет. Другой вопрос: зачем она вам нужна, если вы делаете первые шаги. IMHO на первых шагах можно спокойно обойтись и без shared variables. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cheetah 0 7 июня, 2005 Опубликовано 7 июня, 2005 · Жалоба День добрый. Делаю первые шаги на 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:') <{POST_SNAPBACK}> Стандарт VHDL допускает определение именно таких (shared variables) в области ENTITY или ARCHITECTURE. Но т.к. синтезаторы поддерживают не весь стандарт, а только его часть, то возможно именно ваш синтезатор просто не пропустит такую переменную. Precision например пропускает, а ваш может нет. Другой вопрос: зачем она вам нужна, если вы делаете первые шаги. IMHO на первых шагах можно спокойно обойтись и без shared variables. <{POST_SNAPBACK}> Я использую Xilinx ISE 6.1. Как я понял там синтезатор называется XST так хочеться же научиться пользоваться этими переменными ..... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vetal 0 7 июня, 2005 Опубликовано 7 июня, 2005 · Жалоба Переменную вставлять тут: 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; -- считаем кол-во миганий", без процесса и тактовых импульсов? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cheetah 0 7 июня, 2005 Опубликовано 7 июня, 2005 · Жалоба Переменную вставлять тут: 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; -- считаем кол-во миганий", без процесса и тактовых импульсов? <{POST_SNAPBACK}> Согласен. Спасибо Это я не туда вставил :))))) 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; -- считаем кол-во миганий", без процесса и тактовых импульсов? <{POST_SNAPBACK}> ну не работает оно так :((( в этом месте LEDS<=countLEDs; Ругается :((( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 8 июня, 2005 Опубликовано 8 июня, 2005 · Жалоба Вам уже совершенно справедливо посоветовали не использовать переменных. Без них всегда можно обойтись. Тем более у вас два обыкновенных счетчика. Почему один из них вы реализовали через сигнал, а другой хотите через переменную? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tocha 0 8 июня, 2005 Опубликовано 8 июня, 2005 · Жалоба ну не работает оно так :((( в этом месте LEDS<=countLEDs; Ругается :((( <{POST_SNAPBACK}> Переменные внутри процесса использовать можно, нужно просто понимать их отличие от сигналов. А на счёт внешних 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 8 июня, 2005 Опубликовано 8 июня, 2005 · Жалоба tocha, не учите начинающего плохому. Не надо использовать абы какие сигналы в качестве тактовых. Тем более для многоразрядных счетчиков. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 8 июня, 2005 Опубликовано 8 июня, 2005 · Жалоба tocha, не учите начинающего плохому. Не надо использовать абы какие сигналы в качестве тактовых. Тем более для многоразрядных счетчиков. <{POST_SNAPBACK}> мало того вот эта строка countLEDs := countLEDs + 1; -- считаем кол-во миганий ситезиться то правильно, но при длительной симуляции вылетит ошибка (на 65535 ом такте счета этого счетчика) :)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
id_gene 0 8 июня, 2005 Опубликовано 8 июня, 2005 · Жалоба обычно доступ к 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 с помощью стандартных функций попробуйте при моделировании пройти пошагово через процесс и посмотреть, в какой момент сигналам и переменным присвоятся значения. для наглядности можно вставить временнЫе задержки. Ну и действительно - проверьте переполнение счетчика. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 8 июня, 2005 Опубликовано 8 июня, 2005 · Жалоба Если вы хотите обмениваться данными с остальными процессами без использования обычных Иными словами, если хочется странного. Сигналы как раз для этой цели и используются. сигналов - тут и появляются 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'ей это может пригодиться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться