Flip-fl0p 4 14 июля, 2017 Опубликовано 14 июля, 2017 · Жалоба А есть ли особый смысл в этих строчках ? else NULL; end if; Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lyzifer 0 14 июля, 2017 Опубликовано 14 июля, 2017 (изменено) · Жалоба Будет ли Вам интересно увидеть, как я решу эту задачу в разы меньшим по объему текстом на другом HDL-языке? :) Не буду назойливым, просто меня шокировал объем кода для такой-то простой задачи... дело в том,что я работаю в Vivado и ISE.поэтому,к сожалению, принципиально важно работать на VHDL. Да,это задание можно выполнить и с меньшим кол-ом програмного кода. но спасибо за интерес))) Изменено 14 июля, 2017 пользователем lyzifer Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tausinov 0 14 июля, 2017 Опубликовано 14 июля, 2017 · Жалоба А есть ли особый смысл в этих строчках ? else NULL; end if; Нет, просто привычка, чтобы задуматься, а не должно ли что-то по else зануляться, например. Несколько раз обжигался на том, что пропускал такие моменты. дело в том,что я работаю в Vivado и ISE.поэтому,к сожалению, принципиально важно работать на VHDL. Да,это задание можно выполнить и с меньшим кол-ом програмного кода. но спасибо за интерес))) Обе среды же прекрасно Верилог поддерживают. Не буду назойливым, просто меня шокировал объем кода для такой-то простой задачи... На VHDL тоже можно написать компактнее, а на Верилоге даже длиннее. Суть не в языке описания, а в логике работы. Выше предложили, например, красивый вариант с удвоенным сдвиговым регистром и управлением диодиками каждым вторым битом - его еще компактнее можно сделать. Но у автора цель, как я понимаю, разобраться в логике работы, а не в том, чтобы сэкономить пару килобайт на жестком диске) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lyzifer 0 14 июля, 2017 Опубликовано 14 июля, 2017 · Жалоба Обе среды же прекрасно Верилог поддерживают. На VHDL тоже можно написать компактнее, а на Верилоге даже длиннее. Суть не в языке описания, а в логике работы. Выше предложили, например, красивый вариант с удвоенным сдвиговым регистром и управлением диодиками каждым вторым битом - его еще компактнее можно сделать. Но у автора цель, как я понимаю, разобраться в логике работы, а не в том, чтобы сэкономить пару килобайт на жестком диске) Я И НЕ ЗНАЛ. Ну да.прост надо уметь оптимизировать код (чего я явно не умею) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tausinov 0 14 июля, 2017 Опубликовано 14 июля, 2017 · Жалоба Я И НЕ ЗНАЛ. Ну да.прост надо уметь оптимизировать код (чего я явно не умею) Оптимизация все-таки подразумевает уменьшение не кол-ва кода, а кол-ва ресурсов, в которые выльется в итоге этот самый код, само собой с учетом требуемых частот. А код, имхо, в первую очередь должен быть понятным и удобочитаемым. На том же Си, например, можно сделать смену значений в двух переменных так: a ^= b ^= a ^= b; Но кто-то со стороны, пробегая ваш код глазами, вряд ли сразу поймет, что тут происходит. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 14 июля, 2017 Опубликовано 14 июля, 2017 · Жалоба Я И НЕ ЗНАЛ. Ну да.прост надо уметь оптимизировать код (чего я явно не умею) Это неверное суждение. Код не надо оптимизировать. Это сделает компилятор. Надо учиться формализовать задание и превращать написание кода не в "художественные промыслы" как тут большинство Вам советовало, а в "полуавтоматизированную рутину". Потому что цель разработки - это сделать с первого раза и без ошибок. Я для ТС шанс предложил, но пока он не хочет им воспользоваться... Увы... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 14 июля, 2017 Опубликовано 14 июля, 2017 · Жалоба На VHDL тоже можно написать компактнее, а на Верилоге даже длиннее. Не верю :) VHDL - это просто жуткое количество совершенно лишнего текста. Verilog же - компактный и красивый язык. Ещё бы заменили begin\end чем нибудь кототеньким... :) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 14 июля, 2017 Опубликовано 14 июля, 2017 · Жалоба Не верю :) VHDL - это просто жуткое количество совершенно лишнего текста. Verilog же - компактный и красивый язык. Очень прошу, давайте не будем спорить на эту тему. Мои предпочтения очевидны. Моя вина. Я просто хотел показать новичку альтернативу, он сам и только сам должен решать что лучше для него :) Лучше просто добавить в тему лаконичную демонстрацию этого факта относительно задачи этой темы. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yogggoy 0 15 июля, 2017 Опубликовано 15 июля, 2017 · Жалоба ... Verilog же - компактный и красивый язык. Ещё бы заменили begin\end чем нибудь кототеньким... :) Тоже огорчает эта устаревшая форма записи. В SV вроде это осталось так же для совместимости. Может кто занимается синтаксической переработкой языка verilog, Какие-либо openSource проекты? (только не превратилось бы это в кучу сахарных языков, как в js) Из известных мне, только MyHDL - "надстройка" над python. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VCucumber 0 15 июля, 2017 Опубликовано 15 июля, 2017 (изменено) · Жалоба цель разработки - это сделать с первого раза и без ошибок цель разработки - сделать, в первую очередь, чтобы без ошибок со второго раза ибо, тот, кто придёт после вас, не будет разбираться в ваших оптимизациях, а станет переписывать - код в ведро Ещё бы заменили begin\end чем нибудь кототеньким... эти люди - извращенцы, сначала в паскаль добавили сей, а затем паскаль убрали, но почему-то не весь я никак не могу себе это объяснить или крестик сними, или трусы одень (с) Изменено 15 июля, 2017 пользователем Огурцов Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 15 июля, 2017 Опубликовано 15 июля, 2017 · Жалоба цель разработки - сделать, в первую очередь, чтобы без ошибок со второго раза ибо, тот, кто придёт после вас, не будет разбираться в ваших оптимизациях, а станет переписывать - код в ведро Давайте я объясню. после меня никто код не переписывает. Для этого есть правила оформления кода. А по сути я бы сделал так. Ввел бы параметры: "Дебаг_релиз" "Импульс_дебаг", "Импульс_релиз" "Пауза_дебаг", "Пауза_релиз" "Число_LED" "Инверсия_LED" Далее - сдвиговый регистр на 2 * "Число_LED". Нечетные на LED напрямую или с инверсией в зависимости от "Инверсия_LED". У этого регистра должно быть 2 входа управления: загрузка и сдвиг. Ну и шина данных для загрузки с кодом "1". Эта единичка и будет сдвигаться по регистру... Теперь далее. Поскольку есть паузы - добавляем программируемый таймер. Его разрядность считаем по формулам от длительности импульса и паузы и выбираем большую. Для этого делаем функцию... Чтобы ни в коем случае не руками... Таймер обычно часто применяемый "кирпич", поэтому с ним проблем вообще нет... :) У таймера должно быть 2 входа: загрузка и шина данных, ну и выход готовности. И последний компонент - автомат. 5 состояний. Исходное, когда грузится сдвиговый регистр и 4 рабочих. Загрузка таймера и ожидание готовности таймера для импульса и 2 таких же для паузы... Вот по этим 4-м состояниям он и бегает... В состоянии автомата для загрузки таймера активен сигнал "загрузка таймера", не активен сигнал "сдвиг". Код загрузки берется из параметра. В состоянии ожидания конца счета - наоборот. Активен только "сдвиг". Автомат грузит таймер и ждет окончания счета, потом бежит далее. В состоянии загрузки таймера дается импульс на сдвиг регистра. Вот и весь проект. Для симуляции берем например ИМПУЛЬС = 5, ПАУЗА = 3, ЧИСЛО = 4... Симулируется моментально. Для релиза указываем реальные времена, все разрядности пересчитываются автоматически... Теперь вопрос: ну и где тут ошибаться? Цель такого подхода в том, что каждый отдельно взятый кусок может быть проверен отдельно от всего остального... Да, еще добавлю. Я одновременно веду 3 файла. В Ворде и визио - блок-схема, на верилоге и Срр для тестов... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 16 июля, 2017 Опубликовано 16 июля, 2017 · Жалоба Я просто хотел показать новичку альтернативу, он сам и только сам должен решать что лучше для него :) Вы вняли мои слова :) PS Я просто так говорю, что человек сам должен произвести выбор, без навязывания :) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lyzifer 0 17 июля, 2017 Опубликовано 17 июля, 2017 · Жалоба Ваша программа прекрасно работает,за что ещё раз спасибо))))но теперь к ней нужно добавить кнопку так, чтобы когда нажал один раз,светодиоды загорались и тухли ,как и в предыдущем проекте, а при повторном нажатии светодиоды должны прекратить светиться до тех пор, пока я опять не нажму кнопку)уже 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; Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tausinov 0 17 июля, 2017 Опубликовано 17 июля, 2017 (изменено) · Жалоба Что-то странное вы пытаетесь сделать, если честно. Я имею в виду в коде, а не идею с кнопкой. Все, что нужно - завести дополнительный сигнал, например, signal ce : std_logic := '0'; и по каждому нажатию на кнопку делать ce <= not(ce); А дальше уже много вариантов. Можно, например, phase в нуле "заморозить". А, ну и для железа по-хорошему нужно делать антидребезг и защиту от метастабильности в виде двух-трех регистров. Изменено 17 июля, 2017 пользователем Tausinov Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lyzifer 0 17 июля, 2017 Опубликовано 17 июля, 2017 · Жалоба Что-то странное вы пытаетесь сделать, если честно. Я имею в виду в коде, а не идею с кнопкой. Все, что нужно - завести дополнительный сигнал, например, signal ce : std_logic := '0'; и по каждому нажатию на кнопку делать ce <= not(ce); А дальше уже много вариантов. Можно, например, phase в нуле "заморозить". А, ну и для железа по-хорошему нужно делать антидребезг и защиту от метастабильности в виде двух-трех регистров. хм...по-моему,это очень хорошая идея))сейчас попробую))позже отпишусь)) :rolleyes: Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться