|
Как посмотреть диаграмму работы при больших задержках от начала работы?, Значение счетчика тактов больше тысячи |
|
|
|
May 23 2006, 13:19
|
Частый гость
 
Группа: Свой
Сообщений: 153
Регистрация: 2-12-04
Из: Чебоксары
Пользователь №: 1 289

|
Хочу посмотреть на диаграмме работы значения сигналов, а значения счетчика тактов при этом довольно большие, отсчитывая от начального нуля (подачи питания) - на экране не помещаются такие значения. Что вы делаете в таком случае? Привожу отрывок кода, чтобы было понятней: Код 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;
|
|
|
|
|
May 23 2006, 13:28
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(Гвоздик @ 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 Удачи!
--------------------
www.iosifk.narod.ru
|
|
|
|
|
May 23 2006, 13:35
|
Частый гость
 
Группа: Свой
Сообщений: 125
Регистрация: 15-11-04
Пользователь №: 1 135

|
Цитата Хочу посмотреть на диаграмме работы значения сигналов, а значения счетчика тактов при этом довольно большие, отсчитывая от начального нуля (подачи питания) - на экране не помещаются такие значения. Что вы делаете в таком случае? Привожу отрывок кода, чтобы было понятней: Если не помещается на экране можно использовать zoom. Если база слишком большая, можно начать писать базу в какой-то нужный момент времени. Ещё можно сделать `define TEST и вот здесь Цитата when X"000F1B30" если TEST поставить число поменьше.
|
|
|
|
|
May 23 2006, 17:29
|
Частый гость
 
Группа: Свой
Сообщений: 130
Регистрация: 16-06-05
Из: Оренбург
Пользователь №: 6 039

|
Цитата(Гвоздик @ May 23 2006, 21:20)  Возможно я ввел кого-то в заблуждение, никакой тестбенч я не пишу, смотрю диаграммы альтеровском квартусе в меню Tools | Simulator Tool - а там идет моделирование от начала работы, к сожалению, большие периоды времени не моделируются. Вот в чем вопрос-то весь... Если можете - то попробуйте Active HDL, хороший симулятор и редактор, а для синтеза подключается квартус.
Сообщение отредактировал ishergin - May 23 2006, 17:30
--------------------
Программа выполнила невыполнимое и допустила недопустимое
|
|
|
|
|
May 24 2006, 04:37
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(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 появилось, из Ривьеры позаимствовано), то там вообще почти без тормозов вне зависимости от текущей развертки. В итоге, совет правильный - возьмите более человеческий симулятор и будет щастье. Заодно тестбенчи писать можно, еще один бонус.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
May 24 2006, 12:03
|
Частый гость
 
Группа: Свой
Сообщений: 153
Регистрация: 2-12-04
Из: Чебоксары
Пользователь №: 1 289

|
Тогда еще с компилятором-синтезатором непонятное дело. Ниже приведу код и предупреждение выскакивающее при компиляции. Это у всех так или я что-то не так указал? Предупреждение такое: 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'овскую часть - тоже самое. Смысл-то простой: по тактам счетчика инициализировать Датавижновский ЖКИ, а синтезатор чего-то не понимает, хотя скорее я не понимаю. В чем может быть дело?
|
|
|
|
|
May 24 2006, 15:24
|
Частый гость
 
Группа: Свой
Сообщений: 130
Регистрация: 16-06-05
Из: Оренбург
Пользователь №: 6 039

|
Цитата(Гвоздик @ May 24 2006, 16:56)  To bsp: Спасибо огромное, стало моделироваться, хотя, действительно, тормозит конкретно. To all: После ваших замечаний склоняюсь к смене симулятора: а что, если заказать в Мегратэке компакт с Моделсимом, а потом его крякнуть? Кто-нибудь пробовал? Я заказывал версию 6.0 под Win32, прислали 2 CD под все ОС  , но версия была 5.8е. С лекарством проблемы были, пришлось использовать лиценцию, сгенерированную для всех продуктов от Mentor (объем файла составлял 640 кб), из-за этого первый запуск симулятора занимал 5 минут, короче работать было очень плохо
--------------------
Программа выполнила невыполнимое и допустила недопустимое
|
|
|
|
|
May 25 2006, 17:24
|
Частый гость
 
Группа: Свой
Сообщений: 153
Регистрация: 2-12-04
Из: Чебоксары
Пользователь №: 1 289

|
Спасибо, это я посмотрел, все в порядке. Однако, меня интересует другое: в первом (начиная сверху) процессе по фронту клока увеличивается счетчик, и во втором процессе мы тоже по фронту клока смотрим значение этого-же счетчика. Весь вопрос-то в том, что получается, что в один и тотже момент времени (фронт клока) мы приращаем и читаем счетчик. Не может ли так получиться, что мы будем читать его именно в момент его приращения (либо до или после)? Код 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;
|
|
|
|
|
May 25 2006, 19:00
|
Частый гость
 
Группа: Свой
Сообщений: 130
Регистрация: 16-06-05
Из: Оренбург
Пользователь №: 6 039

|
Цитата(Гвоздик @ 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; Насколько я понимаю такие действия должны конвейеризироваться (тьфу, выговорить не могу  ), тоесть для второго процесса значение счетчика будет запаздывать на один такт CLK
Сообщение отредактировал ishergin - May 25 2006, 19:01
--------------------
Программа выполнила невыполнимое и допустила недопустимое
|
|
|
|
|
May 25 2006, 20:22
|
Частый гость
 
Группа: Свой
Сообщений: 130
Регистрация: 16-06-05
Из: Оренбург
Пользователь №: 6 039

|
Цитата(vetal @ May 26 2006, 02:07)  Цитата Насколько я понимаю такие действия должны конвейеризироваться (тьфу, выговорить не могу (IMG:style_emoticons/default/huh.gif) ), Это и есть конвейер(1 ступень - счетчик, 2 ступень- анализ значения). Для упрожения восприятия достаточно представить тактовый сигнал периодической последовательностью дельта импульсов. Я обычно смотрю RTL схему в Симплифай, достаточно наглядно, правда УГО элементов буржуйское, непривык еще
--------------------
Программа выполнила невыполнимое и допустила недопустимое
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|