реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Модуль RTC.
Flip-fl0p
сообщение Sep 4 2017, 16:41
Сообщение #16


Местный
***

Группа: Участник
Сообщений: 395
Регистрация: 11-06-13
Пользователь №: 77 140



Код
use IEEE.STD_LOGIC_UNSIGNED.ALL;

Уберите её, она лишняя. И не является стандартом.
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Sep 5 2017, 05:26
Сообщение #17


Профессионал
*****

Группа: Свой
Сообщений: 1 800
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(Jenya7 @ Sep 4 2017, 18:42) *
Код
(year mod 100 /= 0) or (year mod 400 = 0)
Хотелось бы узнать, во что это вылилось.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 5 2017, 06:21
Сообщение #18


Профессионал
*****

Группа: Участник
Сообщений: 1 255
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(andrew_b @ Sep 5 2017, 11:26) *
Хотелось бы узнать, во что это вылилось.

не знаю. еще не тестировал.
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Sep 5 2017, 08:20
Сообщение #19


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 403
Регистрация: 15-07-06
Из: г.Донецк
Пользователь №: 18 832



Цитата(Flip-fl0p @ Sep 4 2017, 19:41) *
Код
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.
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Sep 5 2017, 08:43
Сообщение #20


Местный
***

Группа: Участник
Сообщений: 395
Регистрация: 11-06-13
Пользователь №: 77 140




Так а вы счетчик объявите как тип 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.
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Sep 5 2017, 08:50
Сообщение #21


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 403
Регистрация: 15-07-06
Из: г.Донецк
Пользователь №: 18 832



Цитата(Flip-fl0p @ Sep 5 2017, 11:43) *
Но это можно делать не всегда.

В том то и дело...
Цитата(Flip-fl0p @ Sep 5 2017, 11:43) *
Или объявите счетчик как INTEGER а потом преобразуйте INTEGER в STD_LOGIC_VECTOR средствами библиотеки NUMERIC_STD.

А смысл? Имхо, проще подключить библиотеку и не париться.
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Sep 5 2017, 09:03
Сообщение #22


Местный
***

Группа: Участник
Сообщений: 395
Регистрация: 11-06-13
Пользователь №: 77 140



Цитата(_Anatoliy @ Sep 5 2017, 11:50) *
В том то и дело...

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

Смысл в том, что библиотека NUMERIC_STD является стандартизированной библиотекой.
А библиотека STD_LOGIC_UNSIGNED -это не стандартизированная библиотека.
Я например не могу дать гарантию того что это библиотека будет работать всегда одинаково в любой версии САПР, в следствии чего я не могу дать гарантии того, что мои ранее написанные проекты будут работать так, как они задумывались. Если САПР не менять и не обновлять (фиг его знает, что поменяют обновления), то вроде и не страшно...
Но поскольку я начал изучать VHDL когда уже была разработана библиотека NUMERIC_STD то я сразу начал применять только её.
Я всегда за строгое соблюдение стандарта, были прецеденты на прошлой работе когда отклонения от ГОСТ приводили к достаточно дорогим ошибкам....

Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Sep 5 2017, 09:25
Сообщение #23


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 403
Регистрация: 15-07-06
Из: г.Донецк
Пользователь №: 18 832



Цитата(Flip-fl0p @ Sep 5 2017, 12:03) *
Смысл в том, что библиотека NUMERIC_STD является стандартизированной библиотекой.

Да знаю я об этом. Просто за 20 лет работы с FPGA указанная выше тройка библиотек успешно применялась во всех моих проектах. Следовательно, та ситуация о которой Вы говорите имеет очень низкую вероятность возникновения. Я не навязываю своего мнения, что ,мол, все должны так делать, но когда речь идёт о больших проектах у меня не дрогнет рука применить эту библиотеку, позволяющую избавиться от лишних преобразований типов.
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Sep 5 2017, 09:42
Сообщение #24


Местный
***

Группа: Участник
Сообщений: 395
Регистрация: 11-06-13
Пользователь №: 77 140



Цитата(_Anatoliy @ Sep 5 2017, 12:25) *

То-же верно.
Я уже привык к NUMERIC_STD и не особо чувствую дискомфорта.
Я считаю что главное понимать когда и зачем нужно применять ту или иную библиотеку.
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Sep 5 2017, 09:55
Сообщение #25


Профессионал
*****

Группа: Свой
Сообщений: 1 800
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(Flip-fl0p @ Sep 5 2017, 11:43) *
А потом конвертируйте тип UNSIGNED в STD_LOGIC_VECTOR. Но это можно делать не всегда.
Когда нельзя?
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Sep 5 2017, 10:00
Сообщение #26


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 403
Регистрация: 15-07-06
Из: г.Донецк
Пользователь №: 18 832



Цитата(andrew_b @ Sep 5 2017, 12:55) *
Когда нельзя?

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

Цитата(Flip-fl0p @ Sep 5 2017, 12:42) *
Я считаю что главное понимать когда и зачем нужно применять ту или иную библиотеку.

Спорить с этим невозможно.
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Sep 5 2017, 10:12
Сообщение #27


Местный
***

Группа: Участник
Сообщений: 395
Регистрация: 11-06-13
Пользователь №: 77 140



Цитата(andrew_b @ Sep 5 2017, 12:55) *
Когда нельзя?

Один из вариантов когда значение выводится на выходной порт. И для модуля создается шапка Testbench средствами Quartus. Тогда в модуле к примеру выходной порт будет типом UNSIGNED, а Quartus создаст в Testbench порт как STD_LOGIC_VECTOR. И придётся где-то вносить изменения, чтобы заработало.
Так-же если придется выдать значения типа UNSIGNED типу STD_LOGIC_VECTOR
Go to the top of the page
 
+Quote Post
Tausinov
сообщение Sep 5 2017, 10:13
Сообщение #28


Частый гость
**

Группа: Участник
Сообщений: 112
Регистрация: 19-10-13
Пользователь №: 78 795



А зачем преобразования делать в каждой строке? Делаем все необходимые внутренние сигналы - signed/unsigned, а порты - std_logic_vector. Остается лишь в конце сделать out_port <= std_logic_vector(internal_signed);. Единственное, что иногда раздражает - то, что вместо коротеньких SXT/EXT надо лепить resize с кучей преобразований, но это дело привычки.
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Sep 5 2017, 12:46
Сообщение #29


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 403
Регистрация: 15-07-06
Из: г.Донецк
Пользователь №: 18 832



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

Ну да, так и делаю когда имею дело с шиной данных в блоках DSP. Но для банального счётчика считаю это лишним.
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Sep 8 2017, 10:41
Сообщение #30


Местный
***

Группа: Участник
Сообщений: 395
Регистрация: 11-06-13
Пользователь №: 77 140



Цитата(_Anatoliy @ Sep 5 2017, 15:46) *
Ну да, так и делаю когда имею дело с шиной данных в блоках 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;
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th September 2017 - 03:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01444 секунд с 7
ELECTRONIX ©2004-2016