реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Closed TopicStart new topic
> Устройство мигания светодиодов (VHDL)
Flip-fl0p
сообщение Jul 14 2017, 08:44
Сообщение #16


Местный
***

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



А есть ли особый смысл в этих строчках ?
Код
    else
      NULL;
    end if;

Go to the top of the page
 
+Quote Post
lyzifer
сообщение Jul 14 2017, 08:57
Сообщение #17


Участник
*

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



Цитата(AVR @ Jul 14 2017, 11:08) *
Будет ли Вам интересно увидеть, как я решу эту задачу в разы меньшим по объему текстом на другом HDL-языке? sm.gif
Не буду назойливым, просто меня шокировал объем кода для такой-то простой задачи...

дело в том,что я работаю в Vivado и ISE.поэтому,к сожалению, принципиально важно работать на VHDL.
Да,это задание можно выполнить и с меньшим кол-ом програмного кода. но спасибо за интерес)))

Сообщение отредактировал lyzifer - Jul 14 2017, 08:58
Go to the top of the page
 
+Quote Post
Tausinov
сообщение Jul 14 2017, 09:16
Сообщение #18


Частый гость
**

Группа: Участник
Сообщений: 94
Регистрация: 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 тоже можно написать компактнее, а на Верилоге даже длиннее. Суть не в языке описания, а в логике работы. Выше предложили, например, красивый вариант с удвоенным сдвиговым регистром и управлением диодиками каждым вторым битом - его еще компактнее можно сделать. Но у автора цель, как я понимаю, разобраться в логике работы, а не в том, чтобы сэкономить пару килобайт на жестком диске)
Go to the top of the page
 
+Quote Post
lyzifer
сообщение Jul 14 2017, 09:59
Сообщение #19


Участник
*

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



Цитата(Tausinov @ Jul 14 2017, 12:16) *
Обе среды же прекрасно Верилог поддерживают.

На VHDL тоже можно написать компактнее, а на Верилоге даже длиннее. Суть не в языке описания, а в логике работы. Выше предложили, например, красивый вариант с удвоенным сдвиговым регистром и управлением диодиками каждым вторым битом - его еще компактнее можно сделать. Но у автора цель, как я понимаю, разобраться в логике работы, а не в том, чтобы сэкономить пару килобайт на жестком диске)

Я И НЕ ЗНАЛ. Ну да.прост надо уметь оптимизировать код (чего я явно не умею)
Go to the top of the page
 
+Quote Post
Tausinov
сообщение Jul 14 2017, 10:36
Сообщение #20


Частый гость
**

Группа: Участник
Сообщений: 94
Регистрация: 19-10-13
Пользователь №: 78 795



Цитата(lyzifer @ Jul 14 2017, 12:59) *
Я И НЕ ЗНАЛ. Ну да.прост надо уметь оптимизировать код (чего я явно не умею)


Оптимизация все-таки подразумевает уменьшение не кол-ва кода, а кол-ва ресурсов, в которые выльется в итоге этот самый код, само собой с учетом требуемых частот. А код, имхо, в первую очередь должен быть понятным и удобочитаемым. На том же Си, например, можно сделать смену значений в двух переменных так:
Код
    a ^= b ^= a ^= b;

Но кто-то со стороны, пробегая ваш код глазами, вряд ли сразу поймет, что тут происходит.
Go to the top of the page
 
+Quote Post
iosifk
сообщение Jul 14 2017, 10:40
Сообщение #21


Гуру
******

Группа: Модераторы
Сообщений: 3 547
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(lyzifer @ Jul 14 2017, 12:59) *
Я И НЕ ЗНАЛ. Ну да.прост надо уметь оптимизировать код (чего я явно не умею)

Это неверное суждение. Код не надо оптимизировать. Это сделает компилятор.
Надо учиться формализовать задание и превращать написание кода не в "художественные промыслы" как тут большинство Вам советовало, а в "полуавтоматизированную рутину". Потому что цель разработки - это сделать с первого раза и без ошибок.
Я для ТС шанс предложил, но пока он не хочет им воспользоваться... Увы...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jul 14 2017, 10:45
Сообщение #22


Любитель
*****

Группа: Свой
Сообщений: 1 843
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(Tausinov @ Jul 14 2017, 13:16) *
На VHDL тоже можно написать компактнее, а на Верилоге даже длиннее.

Не верю sm.gif

VHDL - это просто жуткое количество совершенно лишнего текста.

Verilog же - компактный и красивый язык.
Ещё бы заменили begin\end чем нибудь кототеньким... sm.gif
Go to the top of the page
 
+Quote Post
AVR
сообщение Jul 14 2017, 10:47
Сообщение #23


фанат Linux'а
*****

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



Цитата(sonycman @ Jul 14 2017, 13:45) *
Не верю sm.gif
VHDL - это просто жуткое количество совершенно лишнего текста.
Verilog же - компактный и красивый язык.

Очень прошу, давайте не будем спорить на эту тему. Мои предпочтения очевидны.
Моя вина. Я просто хотел показать новичку альтернативу, он сам и только сам должен решать что лучше для него sm.gif

Лучше просто добавить в тему лаконичную демонстрацию этого факта относительно задачи этой темы.


--------------------
Go to the top of the page
 
+Quote Post
yoggy
сообщение Jul 15 2017, 02:45
Сообщение #24





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



Цитата(sonycman @ Jul 14 2017, 13:45) *
...
Verilog же - компактный и красивый язык.
Ещё бы заменили begin\end чем нибудь кототеньким... sm.gif


Тоже огорчает эта устаревшая форма записи. В SV вроде это осталось так же для совместимости.
Может кто занимается синтаксической переработкой языка verilog, Какие-либо openSource проекты?
(только не превратилось бы это в кучу сахарных языков, как в js)

Из известных мне, только MyHDL - "надстройка" над python.
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Jul 15 2017, 04:20
Сообщение #25


Гуру
******

Группа: Участник
Сообщений: 3 293
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



Цитата(iosifk @ Jul 14 2017, 10:40) *
цель разработки - это сделать с первого раза и без ошибок

цель разработки - сделать, в первую очередь, чтобы без ошибок со второго раза
ибо, тот, кто придёт после вас, не будет разбираться в ваших оптимизациях, а станет переписывать - код в ведро




Цитата(sonycman @ Jul 14 2017, 10:45) *
Ещё бы заменили begin\end чем нибудь кототеньким...

эти люди - извращенцы, сначала в паскаль добавили сей, а затем паскаль убрали, но почему-то не весь
я никак не могу себе это объяснить
или крестик сними, или трусы одень (с)

Сообщение отредактировал Огурцов - Jul 15 2017, 04:21
Go to the top of the page
 
+Quote Post
iosifk
сообщение Jul 15 2017, 14:11
Сообщение #26


Гуру
******

Группа: Модераторы
Сообщений: 3 547
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Огурцов @ Jul 15 2017, 07:20) *
цель разработки - сделать, в первую очередь, чтобы без ошибок со второго раза
ибо, тот, кто придёт после вас, не будет разбираться в ваших оптимизациях, а станет переписывать - код в ведро


Давайте я объясню.
после меня никто код не переписывает. Для этого есть правила оформления кода.
А по сути я бы сделал так.
Ввел бы параметры:
"Дебаг_релиз"
"Импульс_дебаг", "Импульс_релиз"
"Пауза_дебаг", "Пауза_релиз"
"Число_LED"
"Инверсия_LED"

Далее - сдвиговый регистр на 2 * "Число_LED". Нечетные на LED напрямую или с инверсией в зависимости от "Инверсия_LED".
У этого регистра должно быть 2 входа управления: загрузка и сдвиг. Ну и шина данных для загрузки с кодом "1". Эта единичка и будет сдвигаться по регистру...
Теперь далее. Поскольку есть паузы - добавляем программируемый таймер. Его разрядность считаем по формулам от длительности импульса и паузы и выбираем большую. Для этого делаем функцию... Чтобы ни в коем случае не руками... Таймер обычно часто применяемый "кирпич", поэтому с ним проблем вообще нет... sm.gif
У таймера должно быть 2 входа: загрузка и шина данных, ну и выход готовности.
И последний компонент - автомат. 5 состояний. Исходное, когда грузится сдвиговый регистр и 4 рабочих. Загрузка таймера и ожидание готовности таймера для импульса и 2 таких же для паузы... Вот по этим 4-м состояниям он и бегает...
В состоянии автомата для загрузки таймера активен сигнал "загрузка таймера", не активен сигнал "сдвиг". Код загрузки берется из параметра. В состоянии ожидания конца счета - наоборот. Активен только "сдвиг".
Автомат грузит таймер и ждет окончания счета, потом бежит далее. В состоянии загрузки таймера дается импульс на сдвиг регистра.

Вот и весь проект.
Для симуляции берем например ИМПУЛЬС = 5, ПАУЗА = 3, ЧИСЛО = 4... Симулируется моментально.
Для релиза указываем реальные времена, все разрядности пересчитываются автоматически...
Теперь вопрос: ну и где тут ошибаться? Цель такого подхода в том, что каждый отдельно взятый кусок может быть проверен отдельно от всего остального...
Да, еще добавлю. Я одновременно веду 3 файла. В Ворде и визио - блок-схема, на верилоге и Срр для тестов...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Maverick
сообщение Jul 16 2017, 12:04
Сообщение #27


я только учусь...
******

Группа: Модераторы
Сообщений: 3 325
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(AVR @ Jul 14 2017, 13:47) *
Я просто хотел показать новичку альтернативу, он сам и только сам должен решать что лучше для него sm.gif

Вы вняли мои слова sm.gif
PS Я просто так говорю, что человек сам должен произвести выбор, без навязывания sm.gif


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
lyzifer
сообщение Jul 17 2017, 12:08
Сообщение #28


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 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;
Go to the top of the page
 
+Quote Post
Tausinov
сообщение Jul 17 2017, 12:42
Сообщение #29


Частый гость
**

Группа: Участник
Сообщений: 94
Регистрация: 19-10-13
Пользователь №: 78 795



Что-то странное вы пытаетесь сделать, если честно. Я имею в виду в коде, а не идею с кнопкой. Все, что нужно - завести дополнительный сигнал, например, signal ce : std_logic := '0'; и по каждому нажатию на кнопку делать ce <= not(ce); А дальше уже много вариантов. Можно, например, phase в нуле "заморозить".

А, ну и для железа по-хорошему нужно делать антидребезг и защиту от метастабильности в виде двух-трех регистров.

Сообщение отредактировал Tausinov - Jul 17 2017, 12:43
Go to the top of the page
 
+Quote Post
lyzifer
сообщение Jul 17 2017, 12:45
Сообщение #30


Участник
*

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



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

хм...по-моему,это очень хорошая идея))сейчас попробую))позже отпишусь)) rolleyes.gif
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2017 - 10:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01626 секунд с 7
ELECTRONIX ©2004-2016