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

 
 
3 страниц V  < 1 2 3  
Closed TopicStart new topic
> Устройство мигания светодиодов (VHDL)
lyzifer
сообщение Jul 17 2017, 14:20
Сообщение #31


Участник
*

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



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

Видимо,я пока слишком туп((
Код
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_ce    : std_logic                    := '0'; --сигнал при нажатии кнопки
  signal led_reg   : std_logic_vector(7 downto 0) := (0 => '1', others => '0');
begin

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
  
btn_control: process(clk) -- нажатия кнопки
  begin
   if (btn_ce = '1') then
       btn_ce <= not(btn_ce)
       phase <= (others => '0');
       else
       phase <= '1';
   end if;
  end process;
  
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;


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


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

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



Как-то так, например.
Тестбенч :
Код
library ieee;
   use ieee.std_logic_1164.all;

entity test_led_tb is
   generic (
      p_TD    : time := 1 ns;
      p_CLK_T : time := 4 ns
   );
end test_led_tb;

architecture behav of test_led_tb is
   signal clk : std_logic                    := '0';
   signal sw  : std_logic                    := '0';
   signal led : std_logic_vector(3 downto 0);

   component test_led is
     generic (
       p_TD      : time    := 1 ns;
       p_CNT_LIM : integer := 1000 - 1
     );
     port (
       clk : in  std_logic;
       sw  : in  std_logic;
       led : out std_logic_vector(3 downto 0)
     );
   end component;
begin
  clk_gen_p : process
  begin
    clk <= not(clk);
    wait for p_CLK_T / 2;
  end process;

  sw <= '1' after 100 us, '0' after 101 us, '1' after 200 us;

  UUT : test_led
    generic map (
      p_TD => p_TD
    )
    port map (
      clk => clk,
      sw  => sw,
      led => led
    );

end behav;

Дизайн:
Код
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 := 32768 - 1
  );
  port (
    clk : in  std_logic;
    sw  : in  std_logic;
    led : out std_logic_vector(3 downto 0)
  );
end test_led;

architecture rtl of test_led is
  type on_off_state is (OFF, ONN);
  signal led_state  : on_off_state                 := OFF;

  signal div_cnt_u  : unsigned(31 downto 0)        := (others => '0');

  signal phase      : std_logic                    := '1';
  signal sw_sync_re : std_logic                    := '0';
  signal sw_reg     : std_logic_vector(2 downto 0);
  signal led_reg    : std_logic_vector(3 downto 0) := (0 => '1', others => '0');
begin

  resync_sw_p : process(clk)
  begin
    if (rising_edge(clk)) then
      sw_reg(0)          <= sw                 after p_TD;
      sw_reg(2 downto 1) <= sw_reg(1 downto 0) after p_TD;
    else
      NULL;
    end if;
  end process; --resync_sw_p

  sw_sync_re <= sw_reg(1) and not(sw_reg(2));

  scheme_state_control_p : process(clk)
  begin
    if (rising_edge(clk)) then
      if (sw_sync_re = '1') then
        if (led_state = ONN) then
          led_state <= OFF after p_TD;
        else
          led_state <= ONN after p_TD;
        end if;
      else
        NULL;
      end if;
    else
      NULL;
    end if;
  end process; --scheme_state_control_p

  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
        if (phase = '0') then
          if (led_state = ONN) then
            phase <= '1' after p_TD;
          else
            phase <= '0' after p_TD;
          end if;
        else
          phase <= '0' after p_TD;
        end if;
      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(2 downto 0) & led_reg(3) after p_TD;
        else
          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;


Пы.Сы ONN вместо ON, потому что ON - зарезервированное слово.

Пы.Пы.Сы. Научите код под спойлер убирать(

Сообщение отредактировал Tausinov - Jul 17 2017, 15:01
Go to the top of the page
 
+Quote Post
lyzifer
сообщение Jul 18 2017, 13:52
Сообщение #33


Участник
*

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



Цитата(Tausinov @ Jul 17 2017, 17:59) *

Блин,я наверное,уже задолбал, (( crying.gif
но походу "замораживать фазу" не лучшая идея,т.к моделирование показывает вообще не тот результат.

ПРИ ТАКИХ ПАРАМЕТРАХ:
Код
sw <= '0' after 0 ms, '1' after 3000  ms, '0' after 6000 ms, '1'after 10000 ms;



а вот так должна выглядеть времянка. т.е. до 3 сек. кнопка не нажата и светодиоды не мигают. на 3 секунде я нажал кнопку и светодиодымигают до 6 сек. потом я опять нажал кнопку и светодиоды потухли. И Т.Д.





Go to the top of the page
 
+Quote Post
iosifk
сообщение Jul 18 2017, 13:59
Сообщение #34


Гуру
******

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



Цитата(lyzifer @ Jul 18 2017, 16:52) *
Блин,я наверное,уже задолбал, (( crying.gif


И не лень Вам упираться рогом??? Как говорил классик: "Не тем путем идете, товарищ"!
Два раза уже объяснил как делать проще.
Предлагал свою помощь... А Вам видно лень переделывать... Или может цель в том, чтобы троллить? Кто бы другой уже давно бы включил скайп...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
lyzifer
сообщение Jul 18 2017, 14:04
Сообщение #35


Участник
*

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



Цитата(iosifk @ Jul 18 2017, 16:59) *
Два раза уже объяснил как делать проще.
Предлагал свою помощь... А Вам видно лень переделывать... Или может цель в том, чтобы троллить? Кто бы другой уже давно бы включил скайп...

Я ПОНИМАЮ,ВЫГЛЯДИТ ОЧЕНЬ ТУПО. wacko.gif
прост,я хочу этот проект,так сказать, модифицировать.Я VHDL изучаю всего месяц от силы.
но троллинга тут нет НИКАКОГО.просто я действительно до такой степень тупой (надеюсь это временно)
Go to the top of the page
 
+Quote Post
Tausinov
сообщение Jul 18 2017, 15:53
Сообщение #36


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

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



Один из диодов в начале горит, т.к. регистр инициализирован 1. Это все можно поправить. А по поводу моментов моргания...
Цитата
но теперь к ней нужно добавить кнопку так, чтобы когда нажал один раз,светодиоды загорались и тухли ,как и в предыдущем проекте, а при повторном нажатии светодиоды должны прекратить светиться до тех пор, пока я опять не нажму кнопку

Go to the top of the page
 
+Quote Post
lyzifer
сообщение Jul 18 2017, 18:50
Сообщение #37


Участник
*

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



Цитата(Tausinov @ Jul 18 2017, 18:53) *
Один из диодов в начале горит, т.к. регистр инициализирован 1. Это все можно поправить.

т.е если я буду инициализировать регистр в 0, то ,по идее, система должна заработать как надо?
Go to the top of the page
 
+Quote Post
AVR
сообщение Jul 18 2017, 19:56
Сообщение #38


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

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



Я не выдержал, моё решение (сам модуль примерно 25 не пустых строк):
Код
`timescale 1ns / 1ps

//----- top module

module led_blink(
input clock,
input sw,
output reg [3:0] led
);

initial led = 0;
reg [3:0] state;
initial state = 4'b1000;

reg on1off0;
initial on1off0 = 1;

reg [23:0] divider;
initial divider = 0;
always @(posedge clock) begin
    if(divider < 499999) divider <= divider + 1;
    else begin
        divider <= 0;
        if(sw) begin
            on1off0 <= !on1off0;
            if(on1off0) begin
                state <= {state[0], state[3:1]};
                led <= state;
            end else led <= 0;
        end else begin
            on1off0 <= 1;
            led <= 0;
        end
    end
end

endmodule

//----- testbench

module testbench();

    reg clock1m; // 1 MHz
    initial clock1m = 0;
    always clock1m = #500 !clock1m;

    reg sw;
    wire [3:0] leds;

    led_blink uut(
    .clock(clock1m),
    .led(leds),
    .sw(sw));
    
    initial begin
        sw = 0;
        
        #999999000;
        #1000000000;
        #1000000000;
        
        sw = 1;
        
        #1000000000;
        #1000000000;
        #1000000000;
        
        sw = 0;
        
        #1000000000;
        #1000000000;
        #1000000000;
        #1000000000;
        
        sw = 1;
        
        #1000000000;
        #1000000000;
        #1000000000;
        #1000000000;
        #1000000000;
        
        sw = 0;
        
        #1000000000;
        #1000000000;
        #1000000000;
        
        $stop;
    end

endmodule


Прикрепленное изображение


--------------------
Go to the top of the page
 
+Quote Post
lyzifer
сообщение Jul 19 2017, 07:08
Сообщение #39


Участник
*

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



Цитата(AVR @ Jul 18 2017, 22:56) *
Я не выдержал, моё решение (сам модуль примерно 25 не пустых строк):

Спасибо,конечно))но принципиально важно реализовать этот проект на VHDL. (так от меня требуют)
Go to the top of the page
 
+Quote Post
Tausinov
сообщение Jul 19 2017, 08:39
Сообщение #40


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

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



Так осталось просто тоже самое переписать на VHDL. Тут каких-то принципиально отличных конструкций нет, переносится без проблем.
Go to the top of the page
 
+Quote Post
lyzifer
сообщение Jul 19 2017, 08:45
Сообщение #41


Участник
*

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



Цитата(Tausinov @ Jul 19 2017, 11:39) *
Так осталось просто тоже самое переписать на VHDL. Тут каких-то принципиально отличных конструкций нет, переносится без проблем.

ага, для меня Верилог это вообще набор иероглифов biggrin.gif
Go to the top of the page
 
+Quote Post
Tausinov
сообщение Jul 19 2017, 09:31
Сообщение #42


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

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



Код
library ieee;
  use ieee.std_logic_1164.all;
  use ieee.numeric_std.all;

entity led_blink is
  port (
    clk : in  std_logic;
    sw  : in  std_logic;
    led : out std_logic_vector(3 downto 0)
  );
end led_blink;

architecture rtl of led_blink is
  signal on1off0 : std_logic                    := '1';
  signal state   : std_logic_vector(3 downto 0) := "0001";
  signal divider : unsigned(23 downto 0)        := (others => '0');
begin
  main_p : process(clk)
  begin
    if (rising_edge(clk)) then
      if (divider < 200) then
        divider <= divider + 1;
      else
        divider <= (others => '0');
        if (sw = '1') then
          on1off0 <= not(on1off0);
          if (on1off0 = '1') then
            state <= state(2 downto 0) & state(3);
            led   <= state;
          else
            led   <= (others => '0');
          end if;
        else
          on1off0 <= '1';
          led     <= (others => '0');
        end if;
      end if;
    end if;
  end process;
end rtl;


Тоже самое на vhdl, больше лишь на пару строк.
Все же, если будет запуск на реальном железе, нужны анти-дребезг и перетактирование сигнала с кнопки.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th August 2017 - 15:13
Рейтинг@Mail.ru


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