Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как посмотреть диаграмму работы при больших задержках от начала работы?
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Гвоздик
Хочу посмотреть на диаграмме работы значения сигналов, а значения счетчика тактов при этом довольно большие, отсчитывая от начального нуля (подачи питания) - на экране не помещаются такие значения. Что вы делаете в таком случае?
Привожу отрывок кода, чтобы было понятней:
Код
process(reset,clk_counter)
    begin
        if (reset = '0') then
            lcd_rs_sig <= '0';
            lcd_rw_sig <= '0';
            lcd_e_sig <= '0';
            lcd_data_sig <= X"00";
        else
            case clk_counter(31 downto 0) is
            -- clear screen command (3 times sequentially)
            -- 15 ms is gone after reset
                when X"000F1B30" =>
                    lcd_rs_sig <= '0';
                    lcd_rw_sig <= '0';
                    lcd_e_sig <= '0';
                    lcd_data_sig <= X"30";
            -- 1 us is gone after data setting                    
                when X"000F1B72" =>
                    lcd_rs_sig <= '0';
                    lcd_rw_sig <= '0';
                    lcd_e_sig <= '1';
                    lcd_data_sig <= X"30";
            -- 2 us for data latching
                when X"000F1BF6" =>
                    lcd_rs_sig <= '0';
                    lcd_rw_sig <= '0';
                    lcd_e_sig <= '0';
                    lcd_data_sig <= X"30";
            -- 5 ms delay after each clear screen command
                when X"00142506" =>
                    lcd_rs_sig <= '0';
                    lcd_rw_sig <= '0';
                    lcd_e_sig <= '1';
                    lcd_data_sig <= X"30";
            end case;    
        end if;
    end process;
iosifk
Цитата(Гвоздик @ May 23 2006, 17:19) *
Хочу посмотреть на диаграмме работы значения сигналов, а значения счетчика тактов при этом довольно большие, отсчитывая от начального нуля (подачи питания) - на экране не помещаются такие значения. Что вы делаете в таком случае?
Привожу отрывок кода, чтобы было понятней:
Код
process(reset,clk_counter)
    begin
        if (reset = '0') then
            lcd_rs_sig <= '0';
            lcd_rw_sig <= '0';
            lcd_e_sig <= '0';
            lcd_data_sig <= X"00";
        else
            case clk_counter(31 downto 0) is
            -- clear screen command (3 times sequentially)
            -- 15 ms is gone after reset
                when X"000F1B30" =>
                    lcd_rs_sig <= '0';
                    lcd_rw_sig <= '0';
                    lcd_e_sig <= '0';
                    lcd_data_sig <= X"30";
            -- 1 us is gone after data setting                    
                when X"000F1B72" =>
                    lcd_rs_sig <= '0';
                    lcd_rw_sig <= '0';
                    lcd_e_sig <= '1';
                    lcd_data_sig <= X"30";
            -- 2 us for data latching
                when X"000F1BF6" =>
                    lcd_rs_sig <= '0';
                    lcd_rw_sig <= '0';
                    lcd_e_sig <= '0';
                    lcd_data_sig <= X"30";
            -- 5 ms delay after each clear screen command
                when X"00142506" =>
                    lcd_rs_sig <= '0';
                    lcd_rw_sig <= '0';
                    lcd_e_sig <= '1';
                    lcd_data_sig <= X"30";
            end case;    
        end if;
    end process;


Не вдаваясь в детали:
Написать в тест-бенче, что после такого-то времени, такие-то сигналы, например старшие разряды счетчика "зафорсены" в 1. Соответственно после "зафорсивания" счетчик отсчитает только то, что останется до переполнения.
К сожалению, не могу привести пример, это есть только на той машие, которая дома. Но поищете force
Удачи!
des00
Самопроверяющийся тест бенч, спасет отца руской демократии!!!!!!!!!
TailWind
Цитата
Хочу посмотреть на диаграмме работы значения сигналов, а значения счетчика тактов при этом довольно большие, отсчитывая от начального нуля (подачи питания) - на экране не помещаются такие значения. Что вы делаете в таком случае?
Привожу отрывок кода, чтобы было понятней:


Если не помещается на экране можно использовать zoom.

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

Ещё можно сделать `define TEST
и вот здесь
Цитата
when X"000F1B30"

если TEST поставить число поменьше.
Гвоздик
Возможно я ввел кого-то в заблуждение, никакой тестбенч я не пишу, смотрю диаграммы альтеровском квартусе в меню Tools | Simulator Tool - а там идет моделирование от начала работы, к сожалению, большие периоды времени не моделируются. Вот в чем вопрос-то весь...
ishergin
Цитата(Гвоздик @ May 23 2006, 21:20) *
Возможно я ввел кого-то в заблуждение, никакой тестбенч я не пишу, смотрю диаграммы альтеровском квартусе в меню Tools | Simulator Tool - а там идет моделирование от начала работы, к сожалению, большие периоды времени не моделируются. Вот в чем вопрос-то весь...


Если можете - то попробуйте Active HDL, хороший симулятор и редактор, а для синтеза подключается квартус.
bsp
Тоже использую очень длинные последовательности при симуляции в Квартусе, но проблем не испытываю. Предел времени моделирования устанавливается в меню edit -> end time ( когда выбран файл vwf ). Дальше вопрос быстродействия компьютера, количества часто меняющихся сигналов и терпения. Если все данные моделирования не помещаются в ОЗУ, можно разрешить помещать их на хард. Это сильно замедляет процесс, но отобразить можно очень длинные последовательности. В качестве примера: моделирую устройство работающее с тактовой частотой 8 МГц в течении 6 мсек. Получается около 48 000 периодов, при этом 6 - 8 сигналов большую часть времени переключаются с частотой равной тактовой, еще несколько в 2 -8 раз медленнее.
dxp
Цитата(bsp @ May 24 2006, 01:38) *
Тоже использую очень длинные последовательности при симуляции в Квартусе, но проблем не испытываю. Предел времени моделирования устанавливается в меню edit -> end time ( когда выбран файл vwf ). Дальше вопрос быстродействия компьютера, количества часто меняющихся сигналов и терпения. Если все данные моделирования не помещаются в ОЗУ, можно разрешить помещать их на хард. Это сильно замедляет процесс, но отобразить можно очень длинные последовательности. В качестве примера: моделирую устройство работающее с тактовой частотой 8 МГц в течении 6 мсек. Получается около 48 000 периодов, при этом 6 - 8 сигналов большую часть времени переключаются с частотой равной тактовой, еще несколько в 2 -8 раз медленнее.

Моделирование в квартусном симуляторе сродни мазохизму. Интерфейс не настраивается, зум безобразный, а главное - на больших временах при зуме тормозит безбожно. Для примера, в Active-HDL устройство на 160 МГц, прогон на 80 мс (два полных ТВ кадра). Зум работает вполне сносно. А если смотреть в Accelerated Waveform (в 7.1 появилось, из Ривьеры позаимствовано), то там вообще почти без тормозов вне зависимости от текущей развертки.

В итоге, совет правильный - возьмите более человеческий симулятор и будет щастье. Заодно тестбенчи писать можно, еще один бонус.
sazh
Все правильно. Только не надо обижать Квартус. Это пакет другой ценовой категории.
Гвоздик
To bsp: Спасибо огромное, стало моделироваться, хотя, действительно, тормозит конкретно.
To all: После ваших замечаний склоняюсь к смене симулятора: а что, если заказать в Мегратэке компакт с Моделсимом, а потом его крякнуть? Кто-нибудь пробовал?
Jools
Цитата(Гвоздик @ May 24 2006, 14:56) *
заказать в Мегратэке компакт с Моделсимом, а потом его крякнуть? Кто-нибудь пробовал?

Не переживай особо насчет лекарства. wink.gif
Гвоздик
Тогда еще с компилятором-синтезатором непонятное дело. Ниже приведу код и предупреждение выскакивающее при компиляции. Это у всех так или я что-то не так указал? Предупреждение такое: Warning (10631): VHDL Process Statement warning at lcd_controller.vhd(93): signal or variable "lcd_rs_sig" may not be assigned a new value in every possible path through the Process Statement. Signal or variable "lcd_rs_sig" holds its previous value in every path with no new value assignment, which may create a combinational loop in the current design. И также для lcd_rw_sig, lcd_e_sig, lcd_data. И еще: Warning: Latch lcd_e_sig has unsafe behavior. Warning: Ports D and ENA on the latch are fed by the same signal rtl~0
Код
architecture behavioural of lcd_controller is
signal lcd_rs_sig, lcd_rw_sig, lcd_e_sig : std_logic;
signal lcd_data_sig : std_logic_vector(7 downto 0);
signal clk_counter : std_logic_vector(31 downto 0) := X"00000000";
-- PCI_clk = 66 MHz => T_clk = 15 ns => T_count = 2 * T_clk = 30 ns
constant lcd_state_0 : std_logic_vector(31 downto 0) := X"00000000";
-- plus delay >= 15 ms
constant lcd_state_1 : std_logic_vector(31 downto 0) := X"0007A120";

begin
    process(reset,clk)
    begin
        if (reset = '0') then
            clk_counter <= X"00000000";
        else
            if (clk'event and clk = '1') then
                clk_counter <= clk_counter + X"00000001";
            end if;
        end if;
    end process;
    
    process(reset, clk_counter)
    begin
        if (reset = '0') then
            lcd_rs_sig <= '0';
            lcd_rw_sig <= '0';
            lcd_e_sig <= '0';
            lcd_data_sig <= X"00";
        else
            case clk_counter(31 downto 0) is
                when lcd_state_0 =>                
                    lcd_rs_sig <= '0';
                    lcd_rw_sig <= '0';
                    lcd_e_sig <= '0';
                    lcd_data_sig <= X"00";
-- first clear screen command (3 times sequentially)
                when lcd_state_1 =>                
                    lcd_rs_sig <= '0';
                    lcd_rw_sig <= '0';
                    lcd_e_sig <= '1';
                    lcd_data_sig <= X"30";
            when others =>
            end case;    
        end if;
    end process;
    
    lcd_rs <= lcd_rs_sig;
    lcd_rw <= lcd_rw_sig;
    lcd_e <= lcd_e_sig;
    lcd_data(7 downto 0) <= lcd_data_sig(7 downto 0);
end architecture behavioural;


Убрал из второго процесса reset'овскую часть - тоже самое. Смысл-то простой: по тактам счетчика инициализировать Датавижновский ЖКИ, а синтезатор чего-то не понимает, хотя скорее я не понимаю. В чем может быть дело?
vetal
1. Ввести перед case(...) clk'event and clk = '1'.
или
2. Назначит сигналам значения, принимаемые в случаях отличных от lcd_state_0 и state_1.
3. Не стоит плодить защелки.
ishergin
Цитата(Гвоздик @ May 24 2006, 16:56) *
To bsp: Спасибо огромное, стало моделироваться, хотя, действительно, тормозит конкретно.
To all: После ваших замечаний склоняюсь к смене симулятора: а что, если заказать в Мегратэке компакт с Моделсимом, а потом его крякнуть? Кто-нибудь пробовал?


Я заказывал версию 6.0 под Win32, прислали 2 CD под все ОС smile.gif, но версия была 5.8е. С лекарством проблемы были, пришлось использовать лиценцию, сгенерированную для всех продуктов от Mentor (объем файла составлял 640 кб), из-за этого первый запуск симулятора занимал 5 минут, короче работать было очень плохо smile.gif
Гвоздик
Ух-ты, действительно предупреждения исчезли! Видимо надо всегда привязываться к тактовой частоте, хотя счетчик тактов тоже по ней меняется. А вдруг он еще не успеет измениться, а я уже его обрабатывать начну? Чувствую, что это очень ламерский вопрос, однако спросить больше не у кого, а его понимание разрешит дальнейшие мои недопонимания. Спасибо.
vetal
Цитата
А вдруг он еще не успеет измениться, а я уже его обрабатывать начну?


quartus timing analyzer укажет максимальное значение для частоты clk, в пределах которой ваша система будет работать стабильно.
Гвоздик
Спасибо, это я посмотрел, все в порядке. Однако, меня интересует другое: в первом (начиная сверху) процессе по фронту клока увеличивается счетчик, и во втором процессе мы тоже по фронту клока смотрим значение этого-же счетчика. Весь вопрос-то в том, что получается, что в один и тотже момент времени (фронт клока) мы приращаем и читаем счетчик. Не может ли так получиться, что мы будем читать его именно в момент его приращения (либо до или после)?

Код
architecture behavioural of lcd_controller is
signal lcd_rs_sig, lcd_rw_sig, lcd_e_sig : std_logic;
signal lcd_data_sig : std_logic_vector(7 downto 0);
signal clk_counter : std_logic_vector(31 downto 0) := X"00000000";
constant lcd_state_0 : std_logic_vector(31 downto 0) := X"00000000";
constant lcd_state_1 : std_logic_vector(31 downto 0) := X"0007A120";

begin
    process(reset, clk)
    begin
        if (reset = '0') then
            clk_counter <= X"00000000";
        else
            if (clk'event and clk = '1') then
                clk_counter <= clk_counter + X"00000001";
            end if;
        end if;
    end process;
    
    process(clk, clk_counter)
    begin
        if (clk'event and clk = '1') then
            case clk_counter(31 downto 0) is
                when lcd_state_0 =>                
                when lcd_state_1 =>                
                when others =>
            end case;
        end if;
    end process;
    
    lcd_rs <= lcd_rs_sig;
    lcd_rw <= lcd_rw_sig;
    lcd_e <= lcd_e_sig;
    lcd_data(7 downto 0) <= lcd_data_sig(7 downto 0);
end architecture behavioural;
ishergin
Цитата(Гвоздик @ May 25 2006, 23:24) *
Спасибо, это я посмотрел, все в порядке. Однако, меня интересует другое: в первом (начиная сверху) процессе по фронту клока увеличивается счетчик, и во втором процессе мы тоже по фронту клока смотрим значение этого-же счетчика. Весь вопрос-то в том, что получается, что в один и тотже момент времени (фронт клока) мы приращаем и читаем счетчик. Не может ли так получиться, что мы будем читать его именно в момент его приращения (либо до или после)?

Код
architecture behavioural of lcd_controller is
signal lcd_rs_sig, lcd_rw_sig, lcd_e_sig : std_logic;
signal lcd_data_sig : std_logic_vector(7 downto 0);
signal clk_counter : std_logic_vector(31 downto 0) := X"00000000";
constant lcd_state_0 : std_logic_vector(31 downto 0) := X"00000000";
constant lcd_state_1 : std_logic_vector(31 downto 0) := X"0007A120";

begin
    process(reset, clk)
    begin
        if (reset = '0') then
            clk_counter <= X"00000000";
        else
            if (clk'event and clk = '1') then
                clk_counter <= clk_counter + X"00000001";
            end if;
        end if;
    end process;
    
    process(clk, clk_counter)
    begin
        if (clk'event and clk = '1') then
            case clk_counter(31 downto 0) is
                when lcd_state_0 =>                
                when lcd_state_1 =>                
                when others =>
            end case;
        end if;
    end process;
    
    lcd_rs <= lcd_rs_sig;
    lcd_rw <= lcd_rw_sig;
    lcd_e <= lcd_e_sig;
    lcd_data(7 downto 0) <= lcd_data_sig(7 downto 0);
end architecture behavioural;


Насколько я понимаю такие действия должны конвейеризироваться (тьфу, выговорить не могу huh.gif ), тоесть для второго процесса значение счетчика будет запаздывать на один такт CLK
vetal
Цитата
Насколько я понимаю такие действия должны конвейеризироваться (тьфу, выговорить не могу (IMG:style_emoticons/default/huh.gif) ),

Это и есть конвейер(1 ступень - счетчик, 2 ступень- анализ значения).
Для упрожения восприятия достаточно представить тактовый сигнал периодической последовательностью дельта импульсов.
ishergin
Цитата(vetal @ May 26 2006, 02:07) *
Цитата
Насколько я понимаю такие действия должны конвейеризироваться (тьфу, выговорить не могу (IMG:style_emoticons/default/huh.gif) ),

Это и есть конвейер(1 ступень - счетчик, 2 ступень- анализ значения).
Для упрожения восприятия достаточно представить тактовый сигнал периодической последовательностью дельта импульсов.

Я обычно смотрю RTL схему в Симплифай, достаточно наглядно, правда УГО элементов буржуйское, непривык еще smile.gif
Гвоздик
Спасибо всем большое за науку, теперь все стало ясно и понятно!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.