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

use IEEE.STD_LOGIC_UNSIGNED.ALL;

Уберите её, она лишняя. И не является стандартом.

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


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

(year mod 100 /= 0) or (year mod 400 = 0)

Хотелось бы узнать, во что это вылилось.

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


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

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.

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


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

 

Так а вы счетчик объявите как тип 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.

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


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

Но это можно делать не всегда.

В том то и дело...

Или объявите счетчик как INTEGER а потом преобразуйте INTEGER в STD_LOGIC_VECTOR средствами библиотеки NUMERIC_STD.

А смысл? Имхо, проще подключить библиотеку и не париться.

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


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

В том то и дело...

 

А смысл? Имхо, проще подключить библиотеку и не париться.

Смысл в том, что библиотека NUMERIC_STD является стандартизированной библиотекой.

А библиотека STD_LOGIC_UNSIGNED -это не стандартизированная библиотека.

Я например не могу дать гарантию того что это библиотека будет работать всегда одинаково в любой версии САПР, в следствии чего я не могу дать гарантии того, что мои ранее написанные проекты будут работать так, как они задумывались. Если САПР не менять и не обновлять (фиг его знает, что поменяют обновления), то вроде и не страшно...

Но поскольку я начал изучать VHDL когда уже была разработана библиотека NUMERIC_STD то я сразу начал применять только её.

Я всегда за строгое соблюдение стандарта, были прецеденты на прошлой работе когда отклонения от ГОСТ приводили к достаточно дорогим ошибкам....

 

 

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


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

Смысл в том, что библиотека NUMERIC_STD является стандартизированной библиотекой.

Да знаю я об этом. Просто за 20 лет работы с FPGA указанная выше тройка библиотек успешно применялась во всех моих проектах. Следовательно, та ситуация о которой Вы говорите имеет очень низкую вероятность возникновения. Я не навязываю своего мнения, что ,мол, все должны так делать, но когда речь идёт о больших проектах у меня не дрогнет рука применить эту библиотеку, позволяющую избавиться от лишних преобразований типов.

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


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

То-же верно.

Я уже привык к NUMERIC_STD и не особо чувствую дискомфорта.

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

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


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

А потом конвертируйте тип UNSIGNED в STD_LOGIC_VECTOR. Но это можно делать не всегда.
Когда нельзя?

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


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

Когда нельзя?

Например, когда лень в каждой строчке лепить преобразование...

 

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

Спорить с этим невозможно.

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


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

Когда нельзя?

Один из вариантов когда значение выводится на выходной порт. И для модуля создается шапка Testbench средствами Quartus. Тогда в модуле к примеру выходной порт будет типом UNSIGNED, а Quartus создаст в Testbench порт как STD_LOGIC_VECTOR. И придётся где-то вносить изменения, чтобы заработало.

Так-же если придется выдать значения типа UNSIGNED типу STD_LOGIC_VECTOR

 

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


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

А зачем преобразования делать в каждой строке? Делаем все необходимые внутренние сигналы - signed/unsigned, а порты - std_logic_vector. Остается лишь в конце сделать out_port <= std_logic_vector(internal_signed);. Единственное, что иногда раздражает - то, что вместо коротеньких SXT/EXT надо лепить resize с кучей преобразований, но это дело привычки.

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


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

А зачем преобразования делать в каждой строке? Делаем все необходимые внутренние сигналы - signed/unsigned, а порты - std_logic_vector. Остается лишь в конце сделать out_port <= std_logic_vector(internal_signed);.

Ну да, так и делаю когда имею дело с шиной данных в блоках DSP. Но для банального счётчика считаю это лишним.

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


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

Ну да, так и делаю когда имею дело с шиной данных в блоках 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]

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


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

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

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

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

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

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

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

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

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

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