Flip-fl0p 4 4 сентября, 2017 Опубликовано 4 сентября, 2017 · Жалоба use IEEE.STD_LOGIC_UNSIGNED.ALL; Уберите её, она лишняя. И не является стандартом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 5 сентября, 2017 Опубликовано 5 сентября, 2017 · Жалоба (year mod 100 /= 0) or (year mod 400 = 0) Хотелось бы узнать, во что это вылилось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 5 сентября, 2017 Опубликовано 5 сентября, 2017 · Жалоба Хотелось бы узнать, во что это вылилось. не знаю. еще не тестировал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 5 сентября, 2017 Опубликовано 5 сентября, 2017 · Жалоба use IEEE.STD_LOGIC_UNSIGNED.ALL; Уберите её, она лишняя. И не является стандартом. Без неё у меня векторы не складываются. library ieee; use ieee.std_logic_1164.all; --use ieee.STD_LOGIC_UNSIGNED.all; use ieee.NUMERIC_STD.all; ................................... signal cnt : STD_LOGIC_VECTOR(7 downto 0); begin process(Clk,rst) is if (RISING_EDGE(Clk)) then cnt <= cnt+1; ................... # Error: COMP96_0071: TestBench/modulator_TB.vhd : (182, 42): Operator "+" is not defined for such operands. А с ней всё o`k. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 5 сентября, 2017 Опубликовано 5 сентября, 2017 · Жалоба Так а вы счетчик объявите как тип UNSIGNED и тогда можно будет записать так: USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.NUMERIC_STD.ALL; --................................... SIGNAL CNT : UNSIGNED(7 DOWNTO 0); BEGIN PROCESS(CLK,RST) IS IF (RISING_EDGE(CLK)) THEN CNT <= CNT + "1"; --................... Или сразу преобразовывайте типы : USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.NUMERIC_STD.ALL; --................................... SIGNAL CNT : STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN PROCESS(CLK,RST) IS IF (RISING_EDGE(CLK)) THEN CNT := STD_LOGIC_VECTOR(UNSIGNED(CNT) + 1); А потом конвертируйте тип UNSIGNED в STD_LOGIC_VECTOR. Но это можно делать не всегда. Или объявите счетчик как INTEGER а потом преобразуйте INTEGER в STD_LOGIC_VECTOR средствами библиотеки NUMERIC_STD. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 5 сентября, 2017 Опубликовано 5 сентября, 2017 · Жалоба Но это можно делать не всегда. В том то и дело... Или объявите счетчик как INTEGER а потом преобразуйте INTEGER в STD_LOGIC_VECTOR средствами библиотеки NUMERIC_STD. А смысл? Имхо, проще подключить библиотеку и не париться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 5 сентября, 2017 Опубликовано 5 сентября, 2017 · Жалоба В том то и дело... А смысл? Имхо, проще подключить библиотеку и не париться. Смысл в том, что библиотека NUMERIC_STD является стандартизированной библиотекой. А библиотека STD_LOGIC_UNSIGNED -это не стандартизированная библиотека. Я например не могу дать гарантию того что это библиотека будет работать всегда одинаково в любой версии САПР, в следствии чего я не могу дать гарантии того, что мои ранее написанные проекты будут работать так, как они задумывались. Если САПР не менять и не обновлять (фиг его знает, что поменяют обновления), то вроде и не страшно... Но поскольку я начал изучать VHDL когда уже была разработана библиотека NUMERIC_STD то я сразу начал применять только её. Я всегда за строгое соблюдение стандарта, были прецеденты на прошлой работе когда отклонения от ГОСТ приводили к достаточно дорогим ошибкам.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 5 сентября, 2017 Опубликовано 5 сентября, 2017 · Жалоба Смысл в том, что библиотека NUMERIC_STD является стандартизированной библиотекой. Да знаю я об этом. Просто за 20 лет работы с FPGA указанная выше тройка библиотек успешно применялась во всех моих проектах. Следовательно, та ситуация о которой Вы говорите имеет очень низкую вероятность возникновения. Я не навязываю своего мнения, что ,мол, все должны так делать, но когда речь идёт о больших проектах у меня не дрогнет рука применить эту библиотеку, позволяющую избавиться от лишних преобразований типов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 5 сентября, 2017 Опубликовано 5 сентября, 2017 · Жалоба То-же верно. Я уже привык к NUMERIC_STD и не особо чувствую дискомфорта. Я считаю что главное понимать когда и зачем нужно применять ту или иную библиотеку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 5 сентября, 2017 Опубликовано 5 сентября, 2017 · Жалоба А потом конвертируйте тип UNSIGNED в STD_LOGIC_VECTOR. Но это можно делать не всегда.Когда нельзя? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 5 сентября, 2017 Опубликовано 5 сентября, 2017 · Жалоба Когда нельзя? Например, когда лень в каждой строчке лепить преобразование... Я считаю что главное понимать когда и зачем нужно применять ту или иную библиотеку. Спорить с этим невозможно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 5 сентября, 2017 Опубликовано 5 сентября, 2017 · Жалоба Когда нельзя? Один из вариантов когда значение выводится на выходной порт. И для модуля создается шапка Testbench средствами Quartus. Тогда в модуле к примеру выходной порт будет типом UNSIGNED, а Quartus создаст в Testbench порт как STD_LOGIC_VECTOR. И придётся где-то вносить изменения, чтобы заработало. Так-же если придется выдать значения типа UNSIGNED типу STD_LOGIC_VECTOR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tausinov 0 5 сентября, 2017 Опубликовано 5 сентября, 2017 · Жалоба А зачем преобразования делать в каждой строке? Делаем все необходимые внутренние сигналы - signed/unsigned, а порты - std_logic_vector. Остается лишь в конце сделать out_port <= std_logic_vector(internal_signed);. Единственное, что иногда раздражает - то, что вместо коротеньких SXT/EXT надо лепить resize с кучей преобразований, но это дело привычки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 5 сентября, 2017 Опубликовано 5 сентября, 2017 · Жалоба А зачем преобразования делать в каждой строке? Делаем все необходимые внутренние сигналы - signed/unsigned, а порты - std_logic_vector. Остается лишь в конце сделать out_port <= std_logic_vector(internal_signed);. Ну да, так и делаю когда имею дело с шиной данных в блоках DSP. Но для банального счётчика считаю это лишним. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 8 сентября, 2017 Опубликовано 8 сентября, 2017 · Жалоба Ну да, так и делаю когда имею дело с шиной данных в блоках DSP. Но для банального счётчика считаю это лишним. А я вообще счетчики в отдельных модулях держу. Один раз описал его, отладил и больше к нему не возвращаюсь. Только в параметрах указываю значение максимального счета. Лично я так меньше ошибаюсь при написании проектов [code]LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.NUMERIC_STD.ALL; ENTITY COUNTER_ENA IS GENERIC ( MAX_VALUE : INTEGER := 126 -- До скольки считает счетчик(от нуля до MAX_VALUE) ); PORT ( CLK : IN STD_LOGIC; ENA : IN STD_LOGIC; DATA_OUT : OUT INTEGER RANGE 0 TO MAX_VALUE ); END ENTITY; ARCHITECTURE RTL OF COUNTER_ENA IS FUNCTION LOG2 (MAX_VALUE : INTEGER) RETURN INTEGER IS -- Функция вычесления логарифма по основанию 2 для определения разрядности VARIABLE CNT : INTEGER := 0; -- Счетчик для подсчета количества делений на 2 VARIABLE TEMP : INTEGER := MAX_VALUE + 1; -- Делимое - максимальное количество состояний счетчика BEGIN WHILE (TEMP > 1) LOOP -- Пока делимое больше 1 совершаем цикл деления на 2 CNT := CNT + 1; -- Считаем количество циклов деления TEMP := TEMP/2; -- Делим число на 2 каждый цикл END LOOP; RETURN CNT; -- Значение счетчика и есть логарифм END LOG2; SIGNAL COUNTER_INTEGER : INTEGER RANGE 0 TO MAX_VALUE := 0; -- Счетчик обнуляемый условием максимального счета SIGNAL COUNTER_UNSIGNED : UNSIGNED(LOG2(MAX_VALUE)-1 DOWNTO 0) := (OTHERS => '0'); -- Счетчик с автоматическом обнулени при переполнении BEGIN --================================================================================ ========================== -- Если максимальное значение счетчика переведенное в двоичное число не состоит из одних только единиц -- Значит у нас счетчик обнуляется значением максимального счета т.е до наступления переполнения разрядов --================================================================================ ========================== GEN_RST_COND : IF ( TO_UNSIGNED(MAX_VALUE,LOG2(MAX_VALUE) ) /= ( LOG2(MAX_VALUE)-1 DOWNTO 0 => '1' ) ) GENERATE CNT_PROC : PROCESS ( CLK ) BEGIN IF (RISING_EDGE(CLK)) THEN IF (ENA = '1') THEN -- Сигнал разрешения работы счетчика IF (COUNTER_INTEGER = MAX_VALUE) THEN -- При наступлении максимального значения счетчика COUNTER_INTEGER <= 0; -- Обнулим его ELSE COUNTER_INTEGER <= COUNTER_INTEGER + 1; -- Иначе будем его инкрементировать END IF; END IF; END IF; END PROCESS; DATA_OUT <= COUNTER_INTEGER; END GENERATE; --================================================================================ ========================== -- Если максимальное значение счетчика это (2**N - 1) -- Значит у нас полный счетчик, который обнуляется переполнением разрядов --================================================================================ ========================== GEN : FOR I IN 0 TO 30 GENERATE OVERFLOW : IF (2**I-1 = MAX_VALUE) GENERATE CNT_PROC : PROCESS ( CLK ) BEGIN IF (RISING_EDGE(CLK)) THEN IF (ENA = '1') THEN -- Сигнал разрешения работы счетчика COUNTER_UNSIGNED <= COUNTER_UNSIGNED + "1"; -- Инкрементируем его каждый такт END IF; END IF; END PROCESS; DATA_OUT <= TO_INTEGER(COUNTER_UNSIGNED); END GENERATE; END GENERATE; END ARCHITECTURE; [/code] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться