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

 
 
 
Reply to this topicStart new topic
> Задержка сигнала на Verilog
sidy
сообщение Jul 9 2018, 05:06
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 275
Регистрация: 2-11-08
Пользователь №: 41 333



Добрый день.

Есть клок с частотой 10 МГц. И есть сигнал с произвольной скважностью, частотой 5 кГц. Необходимо данный сигнал задержать на 5 мкс. Возможно ли это сделать на Verilog? (Сильно не пинайте, Verilog и ПЛИС пока только осваиваю).
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Jul 9 2018, 05:53
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 182
Регистрация: 23-12-04
Пользователь №: 1 643



Приветствую!
Цитата(sidy @ Jul 9 2018, 08:06) *
Есть клок с частотой 10 МГц. И есть сигнал с произвольной скважностью, частотой 5 кГц. Необходимо данный сигнал задержать на 5 мкс. Возможно ли это сделать на Verilog? (Сильно не пинайте, Verilog и ПЛИС пока только осваиваю).
Пинать пока не будем - так слегка похлопывать sm.gif
Вам это для чего нужно ? Для использования в симуляции или для реальной (в возможном будущем) железки? Если для железки то просто кольцевой буфер на 5us/100ns=50 элементов (счетчик и блок памяти). Ну или сдвиговый регистр (для ленивых и нежадных wink.gif )

Удачи! Rob.
Go to the top of the page
 
+Quote Post
sidy
сообщение Jul 9 2018, 06:06
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 275
Регистрация: 2-11-08
Пользователь №: 41 333



Цитата(RobFPGA @ Jul 9 2018, 08:53) *
Приветствую!
Пинать пока не будем - так слегка похлопывать sm.gif
Вам это для чего нужно ? Для использования в симуляции или для реальной (в возможном будущем) железки? Если для железки то просто кольцевой буфер на 5us/100ns=50 элементов (счетчик и блок памяти). Ну или сдвиговый регистр (для ленивых и нежадных wink.gif )

Удачи! Rob.

Мне для реального железа.
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Jul 9 2018, 06:44
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 959
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(RobFPGA @ Jul 9 2018, 08:53) *
кольцевой буфер на 5us/100ns=50 элементов (счетчик и блок памяти). Ну или сдвиговый регистр (для ленивых и нежадных wink.gif )
Квартус, например, сам умеет делать сдвиговый регистр на кольцевом буфере. Это вариант для ленивых и жадных.
Go to the top of the page
 
+Quote Post
blackfin
сообщение Jul 9 2018, 06:51
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 042
Регистрация: 18-04-05
Пользователь №: 4 261



Цитата(andrew_b @ Jul 9 2018, 09:44) *
Квартус, например, сам умеет делать сдвиговый регистр на кольцевом буфере. Это вариант для ленивых и жадных.

Vivado тоже так умеет:
Цитата
SRL_STYLE instructs the synthesis tool on how to infer SRLs that are found in the design. Accepted values are:
...
block: The tool infers the SRL inside a block RAM.
-------
SRL_STYLE Examples (Verilog):

(* srl_style = "block" *) reg [16:0] my_srl;

Go to the top of the page
 
+Quote Post
Maverick
сообщение Jul 11 2018, 05:52
Сообщение #6


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

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



на vhdl

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

entity delay_line is
generic(
  W                 : integer := 8;    -- data width
  L                 : integer := 1200);  -- delay length, shall be > 3
port(
  i_clk             : in  std_logic;
  i_sync_reset      : in  std_logic;
  i_data            : in  std_logic_vector(W-1 downto 0);
  o_data            : out std_logic_vector(W-1 downto 0));
end delay_line;

architecture rtl of delay_line is

type t_ram is array (L-2 downto 0) of std_logic_vector(W-1 downto 0);
signal m_ram : t_ram;

signal r_addr_wr         : integer range 0 to L-2;
signal r_addr_rd         : integer range 0 to L-2;
signal r_enable_read     : std_logic;

begin

p_write : process (i_clk)
begin
  if rising_edge(i_clk) then
    if(i_sync_reset='1') then
      r_addr_wr      <= 0;
      r_enable_read  <= '0';
    else
      m_ram(r_addr_wr) <= i_data;
      if(r_addr_wr<L-2) then
        r_addr_wr      <= r_addr_wr + 1;
      else
        r_addr_wr      <= 0;
        r_enable_read  <= '1';       -- enable reading section
      end if;
    end if;
  end if;
end process p_write;

p_read : process (i_clk)
begin
  if rising_edge(i_clk) then
    if(i_sync_reset='1') then
      r_addr_rd      <= 0;
    else
      if(r_enable_read='1') then
        o_data         <= m_ram(r_addr_rd); -- additional delay
        if(r_addr_rd<L-2) then
          r_addr_rd      <= r_addr_rd + 1;
        else
          r_addr_rd      <= 0;
        end if;
      end if;
    end if;
  end if;
end process p_read;


end rtl;



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

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


Профессионал
*****

Группа: Свой
Сообщений: 1 182
Регистрация: 23-12-04
Пользователь №: 1 643



Приветствую!

Цитата(Maverick @ Jul 11 2018, 08:52) *
...
С учетом того что в большинстве FPGA память позволяет считать старое значение из той же ячейки куда пишешь можно обойтись одним указателем чтения/записи.

Удачи! Rob.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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