|
|
  |
Устройство мигания светодиодов (VHDL) |
|
|
|
Jul 14 2017, 08:57
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 13-07-17
Пользователь №: 98 133

|
Цитата(AVR @ Jul 14 2017, 11:08)  Будет ли Вам интересно увидеть, как я решу эту задачу в разы меньшим по объему текстом на другом HDL-языке?  Не буду назойливым, просто меня шокировал объем кода для такой-то простой задачи... дело в том,что я работаю в Vivado и ISE.поэтому,к сожалению, принципиально важно работать на VHDL. Да,это задание можно выполнить и с меньшим кол-ом програмного кода. но спасибо за интерес)))
Сообщение отредактировал lyzifer - Jul 14 2017, 08:58
|
|
|
|
|
Jul 14 2017, 09:16
|
Частый гость
 
Группа: Участник
Сообщений: 135
Регистрация: 19-10-13
Пользователь №: 78 795

|
Цитата(Flip-fl0p @ Jul 14 2017, 11:44)  А есть ли особый смысл в этих строчках ? Код else NULL; end if; Нет, просто привычка, чтобы задуматься, а не должно ли что-то по else зануляться, например. Несколько раз обжигался на том, что пропускал такие моменты. Цитата(lyzifer @ Jul 14 2017, 11:57)  дело в том,что я работаю в Vivado и ISE.поэтому,к сожалению, принципиально важно работать на VHDL. Да,это задание можно выполнить и с меньшим кол-ом програмного кода. но спасибо за интерес))) Обе среды же прекрасно Верилог поддерживают. Цитата(AVR @ Jul 14 2017, 11:08)  Не буду назойливым, просто меня шокировал объем кода для такой-то простой задачи... На VHDL тоже можно написать компактнее, а на Верилоге даже длиннее. Суть не в языке описания, а в логике работы. Выше предложили, например, красивый вариант с удвоенным сдвиговым регистром и управлением диодиками каждым вторым битом - его еще компактнее можно сделать. Но у автора цель, как я понимаю, разобраться в логике работы, а не в том, чтобы сэкономить пару килобайт на жестком диске)
|
|
|
|
|
Jul 14 2017, 09:59
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 13-07-17
Пользователь №: 98 133

|
Цитата(Tausinov @ Jul 14 2017, 12:16)  Обе среды же прекрасно Верилог поддерживают.
На VHDL тоже можно написать компактнее, а на Верилоге даже длиннее. Суть не в языке описания, а в логике работы. Выше предложили, например, красивый вариант с удвоенным сдвиговым регистром и управлением диодиками каждым вторым битом - его еще компактнее можно сделать. Но у автора цель, как я понимаю, разобраться в логике работы, а не в том, чтобы сэкономить пару килобайт на жестком диске) Я И НЕ ЗНАЛ. Ну да.прост надо уметь оптимизировать код (чего я явно не умею)
|
|
|
|
|
Jul 14 2017, 10:36
|
Частый гость
 
Группа: Участник
Сообщений: 135
Регистрация: 19-10-13
Пользователь №: 78 795

|
Цитата(lyzifer @ Jul 14 2017, 12:59)  Я И НЕ ЗНАЛ. Ну да.прост надо уметь оптимизировать код (чего я явно не умею) Оптимизация все-таки подразумевает уменьшение не кол-ва кода, а кол-ва ресурсов, в которые выльется в итоге этот самый код, само собой с учетом требуемых частот. А код, имхо, в первую очередь должен быть понятным и удобочитаемым. На том же Си, например, можно сделать смену значений в двух переменных так: Код a ^= b ^= a ^= b; Но кто-то со стороны, пробегая ваш код глазами, вряд ли сразу поймет, что тут происходит.
|
|
|
|
|
Jul 14 2017, 10:40
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(lyzifer @ Jul 14 2017, 12:59)  Я И НЕ ЗНАЛ. Ну да.прост надо уметь оптимизировать код (чего я явно не умею) Это неверное суждение. Код не надо оптимизировать. Это сделает компилятор. Надо учиться формализовать задание и превращать написание кода не в "художественные промыслы" как тут большинство Вам советовало, а в "полуавтоматизированную рутину". Потому что цель разработки - это сделать с первого раза и без ошибок. Я для ТС шанс предложил, но пока он не хочет им воспользоваться... Увы...
--------------------
www.iosifk.narod.ru
|
|
|
|
|
Jul 14 2017, 10:47
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Цитата(sonycman @ Jul 14 2017, 13:45)  Не верю  VHDL - это просто жуткое количество совершенно лишнего текста. Verilog же - компактный и красивый язык. Очень прошу, давайте не будем спорить на эту тему. Мои предпочтения очевидны. Моя вина. Я просто хотел показать новичку альтернативу, он сам и только сам должен решать что лучше для него  Лучше просто добавить в тему лаконичную демонстрацию этого факта относительно задачи этой темы.
--------------------
|
|
|
|
|
Jul 15 2017, 02:45
|

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

|
Цитата(sonycman @ Jul 14 2017, 13:45)  ... Verilog же - компактный и красивый язык. Ещё бы заменили begin\end чем нибудь кототеньким...  Тоже огорчает эта устаревшая форма записи. В SV вроде это осталось так же для совместимости. Может кто занимается синтаксической переработкой языка verilog, Какие-либо openSource проекты? (только не превратилось бы это в кучу сахарных языков, как в js) Из известных мне, только MyHDL - "надстройка" над python.
|
|
|
|
|
Jul 15 2017, 04:20
|
Гуру
     
Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588

|
Цитата(iosifk @ Jul 14 2017, 10:40)  цель разработки - это сделать с первого раза и без ошибок цель разработки - сделать, в первую очередь, чтобы без ошибок со второго раза ибо, тот, кто придёт после вас, не будет разбираться в ваших оптимизациях, а станет переписывать - код в ведро Цитата(sonycman @ Jul 14 2017, 10:45)  Ещё бы заменили begin\end чем нибудь кототеньким... эти люди - извращенцы, сначала в паскаль добавили сей, а затем паскаль убрали, но почему-то не весь я никак не могу себе это объяснить или крестик сними, или трусы одень (с)
Сообщение отредактировал Огурцов - Jul 15 2017, 04:21
|
|
|
|
|
Jul 15 2017, 14:11
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(Огурцов @ Jul 15 2017, 07:20)  цель разработки - сделать, в первую очередь, чтобы без ошибок со второго раза ибо, тот, кто придёт после вас, не будет разбираться в ваших оптимизациях, а станет переписывать - код в ведро Давайте я объясню. после меня никто код не переписывает. Для этого есть правила оформления кода. А по сути я бы сделал так. Ввел бы параметры: "Дебаг_релиз" "Импульс_дебаг", "Импульс_релиз" "Пауза_дебаг", "Пауза_релиз" "Число_LED" "Инверсия_LED" Далее - сдвиговый регистр на 2 * "Число_LED". Нечетные на LED напрямую или с инверсией в зависимости от "Инверсия_LED". У этого регистра должно быть 2 входа управления: загрузка и сдвиг. Ну и шина данных для загрузки с кодом "1". Эта единичка и будет сдвигаться по регистру... Теперь далее. Поскольку есть паузы - добавляем программируемый таймер. Его разрядность считаем по формулам от длительности импульса и паузы и выбираем большую. Для этого делаем функцию... Чтобы ни в коем случае не руками... Таймер обычно часто применяемый "кирпич", поэтому с ним проблем вообще нет...  У таймера должно быть 2 входа: загрузка и шина данных, ну и выход готовности. И последний компонент - автомат. 5 состояний. Исходное, когда грузится сдвиговый регистр и 4 рабочих. Загрузка таймера и ожидание готовности таймера для импульса и 2 таких же для паузы... Вот по этим 4-м состояниям он и бегает... В состоянии автомата для загрузки таймера активен сигнал "загрузка таймера", не активен сигнал "сдвиг". Код загрузки берется из параметра. В состоянии ожидания конца счета - наоборот. Активен только "сдвиг". Автомат грузит таймер и ждет окончания счета, потом бежит далее. В состоянии загрузки таймера дается импульс на сдвиг регистра. Вот и весь проект. Для симуляции берем например ИМПУЛЬС = 5, ПАУЗА = 3, ЧИСЛО = 4... Симулируется моментально. Для релиза указываем реальные времена, все разрядности пересчитываются автоматически... Теперь вопрос: ну и где тут ошибаться? Цель такого подхода в том, что каждый отдельно взятый кусок может быть проверен отдельно от всего остального... Да, еще добавлю. Я одновременно веду 3 файла. В Ворде и визио - блок-схема, на верилоге и Срр для тестов...
--------------------
www.iosifk.narod.ru
|
|
|
|
|
Jul 17 2017, 12:08
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 13-07-17
Пользователь №: 98 133

|
Цитата(Tausinov @ Jul 14 2017, 13:36)  Ваша программа прекрасно работает,за что ещё раз спасибо))))но теперь к ней нужно добавить кнопку так, чтобы когда нажал один раз,светодиоды загорались и тухли ,как и в предыдущем проекте, а при повторном нажатии светодиоды должны прекратить светиться до тех пор, пока я опять не нажму кнопку)уже 2 дня не получается это правильно реализовать((( я так понимаю надо добавить в проект ещё один входной сигнал кнопки (например btn) и один цикл if,где будет при btn=1 идти сигнал на светодиод,а при btn=0 .НО НИКАК НЕ ПОЛУЧАЕТСЯ. Код library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all;
entity test_led is generic ( p_TD : time := 1 ns; p_CNT_LIM : integer := 5000000-1 ); port ( clk : in std_logic; btn : in std_logic; кнопка led : out std_logic_vector(7 downto 0) ); end test_led;
architecture rtl of test_led is signal div_cnt_u : unsigned(22 downto 0) := (others => '0'); signal phase : std_logic := '1'; signal btn_tu : std_logic : ='1'; -сигнал при нажатии кнопки signal led_reg : std_logic_vector(7 downto 0) := (0 => '1', others => '0'); begin
btn_control: process(clk) begin if rising_edge(clk) then btn_tu <= btn; if btn_tu = '0' and btn = '1' then led_reg <= led_reg + 1; end if; end if; end process;
counter_control_p: process(clk) begin if (rising_edge(clk)) then if (div_cnt_u < p_CNT_LIM) then div_cnt_u <= div_cnt_u + 1 after p_TD; else div_cnt_u <= (others => '0'); end if; else NULL; end if; end process;
phase_control_p: process(clk) begin if (rising_edge(clk)) then if (div_cnt_u = p_CNT_LIM) then phase <= not(phase) after p_TD; else NULL; end if; else NULL; end if; end process; --phase_control_p
led_reg_control_p: process(clk) begin if (rising_edge(clk)) then if (div_cnt_u = p_CNT_LIM) then if (phase = '1') then led_reg <= led_reg(6 downto 0) & led_reg(7) after p_TD; NULL; end if; else NULL; end if; else NULL; end if; end process; --led_reg_control_p
out_form_logic_p: process(phase) begin if (phase = '0') then led <= (others => '0'); else led <= led_reg; end if; end process; --out_form_logic_p
end rtl;
|
|
|
|
|
Jul 17 2017, 12:42
|
Частый гость
 
Группа: Участник
Сообщений: 135
Регистрация: 19-10-13
Пользователь №: 78 795

|
Что-то странное вы пытаетесь сделать, если честно. Я имею в виду в коде, а не идею с кнопкой. Все, что нужно - завести дополнительный сигнал, например, signal ce : std_logic := '0'; и по каждому нажатию на кнопку делать ce <= not(ce); А дальше уже много вариантов. Можно, например, phase в нуле "заморозить".
А, ну и для железа по-хорошему нужно делать антидребезг и защиту от метастабильности в виде двух-трех регистров.
Сообщение отредактировал Tausinov - Jul 17 2017, 12:43
|
|
|
|
|
Jul 17 2017, 12:45
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 13-07-17
Пользователь №: 98 133

|
Цитата(Tausinov @ Jul 17 2017, 15:42)  Что-то странное вы пытаетесь сделать, если честно. Я имею в виду в коде, а не идею с кнопкой. Все, что нужно - завести дополнительный сигнал, например, signal ce : std_logic := '0'; и по каждому нажатию на кнопку делать ce <= not(ce); А дальше уже много вариантов. Можно, например, phase в нуле "заморозить". А, ну и для железа по-хорошему нужно делать антидребезг и защиту от метастабильности в виде двух-трех регистров. хм...по-моему,это очень хорошая идея))сейчас попробую))позже отпишусь))
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|