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

Quartus II (simulation и ещё пара вопросов от начинающего)

Пытался спроектировать таймер (отсчитываются N входных сигналов-> на выход подаётся выходной сигнал )

Столкнулся со следующими проблемами:

1) Если не обнулить значение SIG выходного порта, то на временной диаграмме в результате симуляции будет постоянное значение 1. Действительно ли это необходимо делать для всех выходных сигналов?

 

LIBRARY ieee;

USE ieee.std_logic_1164.all;

-- Entity Declaration

ENTITY blok IS

-- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!

PORT

(

CLK : IN STD_LOGIC;

RESET : IN STD_LOGIC;

SIG : OUT STD_LOGIC

);

-- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!

END blok;

-- Architecture Body

ARCHITECTURE blok_architecture OF blok IS

signal COUNT: integer:=0;

 

BEGIN

process(CLK, RESET)

begin

 

if RESET = '1' then

COUNT <= 0;

elsif (CLK'event and CLK='1') then

if (COUNT >=3) then

COUNT <= 0;

SIG <='1';

else

COUNT <= COUNT + 1;

SIG <='0'; -- если не выполнять это действие, на выходе SIG будет постоянная '1'

end if;

end if;

 

end process;

 

END blok_architecture;

 

2) При создании Waveform, для генерации значения сигнала использую инструмент Count Value? При попытке задать время окончания End time больше 2ps, получаю предупреждение "Insert legal end time".

Чем это может быть вызвано, и как можно исправить?

 

Проект для устройства MAX3000A/ EPM3064ALC44-4.

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


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

как то оно у вас всё намучено странно - попробуйте вот так

(элементарный пример)

----------------------------------------------------

 

library ieee ;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

 

----------------------------------------------------

 

entity counter is

 

generic(n: natural :=2);

port( clock: in std_logic;

clear: in std_logic;

count: in std_logic;

Q: out std_logic_vector(n-1 downto 0)

);

end counter;

 

----------------------------------------------------

 

architecture behv of counter is

 

signal Pre_Q: std_logic_vector(n-1 downto 0);

 

begin

 

-- behavior describe the counter

 

process(clock, count, clear,Pre_Q)

begin

if clear = '1' then

Pre_Q <= Pre_Q - Pre_Q;

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

if count = '1' then

Pre_Q <= Pre_Q + 1;

end if;

end if;

end process;

 

-- concurrent assignment statement

Q <= Pre_Q;

 

end behv;

 

-----------------------------------------------------

 

Это по ходу тупо бинарный счётчик - но если посмотреть в квартусе как конвертить в графические юниты а потом с них строить как в максе - чтоб долго не думать - быстренько счётчик - то можно кое чего добиться.

 

Кстати хочу заметить что при компилировании приведённого фрагмента количество занимаемых ячеек 2 штуки , а у вашего фрагмента - 33 - да есчё икакой то лпм-коунтер как под объект типа вылазит...

странно..

 

Хотя меня тож всё же интересует как начинаюсчего - что же это такое

 

Info: Found 1 design units, including 1 entities, in source file ../../70/quartus/libraries/megafunctions/lpm_counter.tdf

Info: Found entity 1: lpm_counter

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


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

1) Если не обнулить значение SIG выходного порта, то на временной диаграмме в результате симуляции будет постоянное значение 1. Действительно ли это необходимо делать для всех выходных сигналов?

А в честь чего ему быть равным '0', если вы нигде его в '0' не устанавливали, а устанавливали только в '1'?

 

Положим, компилятор сгенерирует такой код, что SIG будет равно '0' при начальном включении. Однако когда счетчик досчитает до COUNT >=3 он обязан его установить в '1', и после этого в '0' он никем никогда не установится. Вот компилятор подумал-подумал, и решил: "А нафига этот сигнал иметь в '0' при начальном включении, ведь этого никто не требовал? Поставлю-ка я его навсегда в '1', чего зря бомбить"

 

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
USE ieee.std_logic_unsigned.all;
--  Entity Declaration
ENTITY blok IS
    -- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!
    PORT
    (
        CLK : IN STD_LOGIC;
        RESET : IN STD_LOGIC;
        SIG : OUT STD_LOGIC
    );
    -- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!
END blok;
--  Architecture Body
ARCHITECTURE blok_architecture OF blok IS
signal COUNT : unsigned(1 downto 0);

BEGIN
process(CLK, RESET)
begin
  if RESET = '1' then
    COUNT <= (others => '0');
    SIG <='0'; -- при сбросе '0'
  elsif rising_edge(CLK) then
    SIG <='0'; -- по умолчанию '0'
    COUNT <= COUNT + 1;
    if (to_integer(COUNT) = 3) then
      COUNT <= (others => '0');
      SIG <='1'; -- установить в '1' на один такт
    end if;
  end if;
end process;

END blok_architecture;

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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