Перейти к содержанию
    

Таймер задержки на VHDL

Подскажите эквивалент верилоговскому wire для VHDL

 

signal

 

А про два квадрата ето круто. Напоминет извесный анекдот.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В графическом редакторе какого пакета реализована эта схема. Если это продукт альтеры, готов посмотреть и сказать свое мяу.

Если это XILINX. То пас. iSE у меня нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И по счастливому стечению обстоятельств это именно XILNX и именно ISE 8.2i :)

 

И чем вы думаете я сейчас занимаюсь? Изучаю ВЕРИЛОГ. Кстати он безусловно удобнее VHDL, но его главный минус в том, что он не сертифицирован в России.

 

module abc
(
    input        clk,
    input        clk2x,
    input [15:0] divider_param,
    input [15:0] shifter_param,
    output       set_clk,
    output       out_clk
);                       

wire out;

reg [15:0] r_divider = 0;
reg [15:0] r_divider_counter = 0;

reg [15:0] r_shifter = 0;
reg r_shifter_counter_reset = 0;
reg r_shifter_counter_reset_r0 = 0;
reg [15:0] r_shifter_counter = 0;
reg [15:0] r_shifter_startup_timer = 0;

reg r_out = 0;
reg r_set = 0;
reg r_divider_new = 0;
reg r_shifter_new = 0;

assign set_clk = (divider_param == 0) ? clk : r_set;
assign out_clk = (divider_param == 0) ? clk : out;
assign out     = (shifter_param == 0) ? r_set : r_out;


always @(posedge clk2x)
begin
    if (r_divider != divider_param)
    begin
        r_divider <= divider_param;
        r_divider_new <= 1'b1;
    end
    else
    begin
        r_divider_new <= 1'b0;
    end
end

always @(posedge clk2x)
begin
    if (r_shifter != shifter_param)
    begin
        r_shifter <= shifter_param;
        r_shifter_new <= 1'b1;
    end
    else
    begin
        r_shifter_new <= 1'b0;
    end
end

always @(posedge clk2x)
begin
    if ((r_divider_new == 1'b1) || (r_shifter_new == 1'b1))
    begin
        r_divider_counter <= r_divider;
    end
    else if (r_divider_counter == r_divider)
    begin
        r_divider_counter <= 16'b0;
    end
    else
    begin
        r_divider_counter <= r_divider_counter + 1;
    end
end

always @(posedge clk2x)
begin
    if ((r_shifter_counter_reset == 1'b1) || (r_shifter_counter_reset_r0 == 1'b1))
    begin
        r_shifter_counter <= 17'b0;
    end
    else if (r_shifter_counter == r_divider)
    begin
        r_shifter_counter <= 17'b0;
    end
    else
    begin
        r_shifter_counter <= r_shifter_counter + 1;
    end
end

always @(posedge clk2x)
begin
    if ((r_divider_new == 1'b1) || (r_shifter_new == 1'b1))
    begin
        r_set <= 1'b0;
    end
    else if (r_divider_counter == 16'b0)
    begin
        r_set <= ~r_set;
    end
end

always @(posedge clk)
begin
    if ((r_divider_new == 1'b1) || (r_shifter_new == 1'b1))
    begin
        r_shifter_counter_reset <= 1'b1;
        r_shifter_startup_timer <= 16'd1;
    end
    else if (r_shifter_startup_timer != r_shifter)
    begin
        r_shifter_startup_timer <= r_shifter_startup_timer + 1;
    end
    else if (r_shifter_startup_timer == r_shifter)
    begin
        r_shifter_counter_reset <= 1'b0;
    end
end

always @(posedge clk2x)
begin
    r_shifter_counter_reset_r0 <= r_shifter_counter_reset;
end

always @(posedge clk2x)
begin
    if ((r_divider_new == 1'b1) || (r_shifter_new == 1'b1))
    begin
        r_out <= 1'b0;
    end
    else if (r_shifter_counter == 0)
    begin
        r_out <= ~r_out;
    end
end

endmodule

 

люди добрые, проверьте меня пожалуста, перевод удался?

 

verilog2VHDL

 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity PEREVOD_VERILOG is
    Port ( clk : in  STD_LOGIC;
           clk2x : in  STD_LOGIC;
           divider_param : in  STD_LOGIC_VECTOR (15 downto 0);
           shifter_param : in  STD_LOGIC_VECTOR (15 downto 0);
           set_clk : out  STD_LOGIC;
           out_clk : out  STD_LOGIC);
end PEREVOD_VERILOG;

architecture Behavioral of PEREVOD_VERILOG is
signal out1 : STD_LOGIC;
signal  r_divider : STD_LOGIC_VECTOR (15 downto 0):= "0000000000000000";
signal r_divider_counter : STD_LOGIC_VECTOR (15 downto 0):= "0000000000000000";

signal r_shifter : STD_LOGIC_VECTOR (15 downto 0):= "0000000000000000";
signal r_shifter_counter_reset : STD_LOGIC:= '0';
signal r_shifter_counter_reset_r0 : STD_LOGIC:= '0';
signal r_shifter_counter : STD_LOGIC_VECTOR (15 downto 0):= "0000000000000000";
signal r_shifter_startup_timer : STD_LOGIC_VECTOR (15 downto 0):= "0000000000000000";

signal r_out : STD_LOGIC:= '0';
signal r_set : STD_LOGIC:= '0';
signal r_divider_new : STD_LOGIC:= '0';
signal r_shifter_new : STD_LOGIC:= '0';

begin
set_clk <= clk when divider_param = "0000000000000000" else r_set;
out_clk <= clk when divider_param = "0000000000000000" else  out1;
out1 <= r_set when shifter_param = "0000000000000000" else r_out;
process(clk2x)
begin
if(clk2x='1' and clk2x'event)  then
if (r_divider /= divider_param) then
        r_divider <= divider_param;
        r_divider_new <= '1';
    else
        r_divider_new <= '0';
end if;
end if;
end process;
process(clk2x)
begin
if(clk2x='1' and clk2x'event)  then
if (r_shifter /= shifter_param) then
        r_shifter <= shifter_param;
        r_shifter_new <= '1';
    else
        r_shifter_new <= '0';
    end if;
end if;
end process;
process(clk2x)
begin
if(clk2x='1' and clk2x'event)  then
if ((r_divider_new = '1') or (r_shifter_new = '1')) then
           r_divider_counter <= r_divider;
        elsif (r_divider_counter = r_divider) then
        r_divider_counter <= "0000000000000000";
    else
        r_divider_counter <= r_divider_counter + 1;
    end if;
end if;
end process;
process(clk2x)
begin
if(clk2x='1' and clk2x'event)  then
if ((r_shifter_counter_reset = '1') or (r_shifter_counter_reset_r0 = '1')) then 
        r_shifter_counter <= "0000000000000000";
    elsif (r_shifter_counter = r_divider) then 
        r_shifter_counter <= "0000000000000000";
    else
        r_shifter_counter <= r_shifter_counter + 1;
    end if;
end if;
end process;
process(clk2x)
begin
if (clk2x='1' and clk2x'event)  then
if ((r_divider_new = '1') or (r_shifter_new = '1')) then
        r_set <= '1';
    elsif (r_divider_counter = "0000000000000000") then
        r_set <= not r_set;
    end if;
end if;
end process;
process(clk)
begin
if (clk='1' and clk'event)  then
if ((r_divider_new = '1') or (r_shifter_new = '1')) then
        r_shifter_counter_reset <= '1';
        r_shifter_startup_timer <= "1111111111111111";
    elsif (r_shifter_startup_timer /= r_shifter) then
        r_shifter_startup_timer <= r_shifter_startup_timer + 1;
    elsif (r_shifter_startup_timer = r_shifter) then
        r_shifter_counter_reset <= '0';
    end if;
end if;
end process;
process(clk2x)
begin
if (clk2x='1' and clk2x'event)  then
r_shifter_counter_reset_r0 <= r_shifter_counter_reset;
end if;
end process;
process(clk2x)
begin
if (clk2x='1' and clk2x'event)  then
if ((r_divider_new ='1') or (r_shifter_new = '1')) then
        r_out <= '0';
    elsif (r_shifter_counter = 0) then
        r_out <= not r_out;
    end if;
end if;
end process;
end Behavioral;

Изменено пользователем darkniisiis

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не знаю правильно ли я перевёл, но результаты моделирования следующие при коэффициенте делителя 2 и задержке в 3 такта (см post-21468-1162214111_thumb.jpg ). В общем опять не то получилось.

Изменено пользователем darkniisiis

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уважаемый, darkniisiis, пишу это не чтобы лишний раз поглумиться, Боже упаси. Поймите для себя раз и навсегда, что написание синтезируемых конструкций для ПЛИС (в отличие от тестбенчей) на VHDL, Verilog, да и на чем угодно другом, мало имеет общего с программированием. Задача здесь в другом - с помощью набора известных синтаксических конструкций языка составить описание схемы, состоящей из тех же триггеров, счетчиков, автоматов и т.п., причем так, чтобы синтезатор Вас правильно понял и вписал все, что Вы хотите, (и именно так, как Вы хотите) в прокрустово ложе используемой ПЛИС. Плясать всегда нужно от ресурсов, имеющихся в ПЛИС. Пусть Ваш схемотехник, например, ежели он такой умный, попробует разрисовать свои квадратики по предложенной времянке, используя D-триггеры, счетчики, мультиплексоры и другую логику :-). А Вы потом это все опишите на VHDL.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не знаю правильно ли я перевёл, но результаты моделирования следующие при коэффициенте делителя 2 и задержке в 3 такта. В общем опять не то получилось.

 

Хм... но вроде как - то. Прошу прощения, не сказал, что коэфф-т делителя считать от 0. Т.е. 0 = 1/1, 1 = 1/2, 2 = 1/3 и т.д. Так что при коэфф-те 2 как раз так и получится. Единственная странность, что смещение не правильно отрабатывает и CLK смещен на полтакта от переднего фронта...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не знаю правильно ли я перевёл, но результаты моделирования следующие при коэффициенте делителя 2 и задержке в 3 такта ///////

Мне кажется, Вас загнали в логическую ловушку. Ну посудите сами. Делитель на 2. Значит на выходе сигнал с периодом длительностью в 2 периода clk. Спрашивается зачем его задерживать на три периода clk. Ведь при непрерывном формировании этих сигналов это эквивалентно задержке на один период clk. А если задержать на 2 периода, то сигналы на выходе идентичны. А если это все формируется от clk и clk_x2 у Вас нет, то меандр можно получить только на значениях 2 в степени n.

Ну и самое главное, запись других значений

 

Ну и самое главное, запись других значений пересчета. При таком подходе это сбой в функционировании системы.

Все что Вы ходтите укладывается в 2 взаимосвязанных счетчика. Где есть ограничение. Второй функционирует в периоде функционирования первого и перезапись новых значений возможна только после отработки предыдущего полного периода первого счетчика. И этого вполне достаточно, чтобы описать и Вашу систему.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уважаемый sazh, не могли бы вы хотя бы вкраце описать работу вашей схемы, в совсем непонятных местах я поставил знаки --????????????????????--

 

module shim
(
input            clk,
input      [7:0] del_clk,
input      [7:0] prog,
output reg       set,  --????????????????????--
output           shim,  
output reg       ochibka  --????????????????????--
);

reg [7:0] ct_a;
reg [7:0] ct_b;
reg       enable; 
always @(posedge clk)
begin
if (ct_a == 8'd1)            ct_a <= (del_clk == 8'd0) ? 8'd1 : del_clk;
else                         ct_a <= ct_a - 1'b1;
if (ct_a == 8'd1)            ct_b <= (prog == 8'd0 ) ? 8'd1 : prog;
else if (enable)  --????????????????????--           ct_b <= ct_b - 1'b1;
if (ct_a == 8'd1)            enable <= 1'b1;
else  if (ct_b == 8'd1)      enable <= 1'b0;
set <= (ct_b == 8'd1);  --????????????????????--
ochibka <= (del_clk <= prog);  --????????????????????--
end

assign shim = enable;

endmodule

 

я попытался перевести её в VHDL

 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Verilog2VHDL_SHIM is
    Port ( clk : in  STD_LOGIC;
           del_clk : in  STD_LOGIC_VECTOR (15 downto 0);
           prog : in  STD_LOGIC_VECTOR (15 downto 0);
           set : out  STD_LOGIC;
           shim : out  STD_LOGIC;
           ochibka : out  STD_LOGIC);
end Verilog2VHDL_SHIM;

architecture Behavioral of Verilog2VHDL_SHIM is
signal ct_a : STD_LOGIC_VECTOR (15 downto 0);
signal ct_b : STD_LOGIC_VECTOR (15 downto 0);
signal enable :   STD_LOGIC;

begin
process(clk)
begin
if(clk='1' and clk'event)  then
    if (ct_a = "1111111111111111") then
        if del_clk = "0000000000000000" then 
        ct_a <= "1111111111111111";
        else ct_a <= del_clk;
        end if;
    else
    ct_a <= ct_a - 1;
    end if;
if (ct_a = "1111111111111111") then
    if prog = "0000000000000000" then
    ct_b <= "1111111111111111";
    else ct_b <= prog;  
    end if;    
elsif (enable='1')  then
ct_b <= ct_b - 1;
end if;
if (ct_a = "1111111111111111") then
   enable <= '1';
    elsif (ct_b = "1111111111111111")then
    enable <= '0';
end if;
  -- set <= (ct_b ="1111111111111111"); Тут явное несоответствие типов,либо я чего-то не понял
  -- ochibka <= (del_clk <= prog);
end if;
end process;

shim <= enable;

end Behavioral;

Надеюсь я правильно понял Вашу логику? Хотелось бы промоделировать, но необходимо уточнить неясности.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Друзья Вы б про агрегаты в VHDL вспомнили ради прикола

"1111111111111111" описывается как (others => '1') (ну кроме сравнений конечно)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем вся соль в том что сначала запутали меня, а я потом запутал вас. Уточняю задачу:

Изначально мы имеем некоторый тактовый генератор чатота с которого поступает на программируемый делитель частоты с коэфициентом деления от 1 до 65536 и на вход clk таймера задержки, который необходимо описать. С выхода делителя частоты сигналы поступают на вход set таймера задержки,т.е. set равен clk/(1...65536).Количество тактов clk, через которое сигнал set должен появится на выходе таймера задержки pinout задаётся на входе таймера prog от 0 до 65565. Задерживаться должен КАЖДЫЙ сигнал set. Например, при коэффициенте делителя частоты =2 и prog=1 должно получиться следующее:

0011001100110011001100110011001100 clk

0011110000111100001111000011110000 set

0000001111000011110000111100001111 pinout

Вот надеюсь так будет правильнее.

 

Когда может изменяться сигнал prog?

Каким должно быть поведение pinout при изменении сигнала prog?

Что должно случиться, если set изменится не одновременно с положительным фронтом сигнала clk?

Синхронизирован ли сигнал set по отношению к клоку генератора, и каким образом?

 

Знаете ли, это вопросы, которые должен задать программист перед началом решения программистской задачи. Потому как они имеют отношение к полноте спецификаций алгоритма. Вы их не задали. Вывод: Вы и не программист. Какая Ваша основная область деятельности?

 

И, кстати. что должно случиться при изменении коэффициента деления делителя?

 

P.S. Так называемого "схемотехника" нужно гнать в шею. Так как его роль непонятна.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы правильно поняли мою логику.

Так как эта схема имеет ограничение (она не будет работать когда период cta меньше или равно ctb, загрузку 0 я заменил 1 (задержка 0 не имеет смысла. пропускайте сигнал мимо схемы)),

я это вывел ввиде сигнала ошибки. set тоже внутренний сигнал.

ну и моделировать надо с меньшей разрядностью. Счетчики работают на минус. По включению инициализируются в ноль. Пока 64 тысячи отсчитают, чтобы в синхронизм войти.

Загрузка новых значений когда cta досчитает до 1. Получите плавное изменеие времянки.

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

 

entity Verilog2VHDL is

Port ( clk : in STD_LOGIC;

del_clk : in STD_LOGIC_VECTOR (7 downto 0);

prog : in STD_LOGIC_VECTOR (7 downto 0);

shim : out STD_LOGIC);

end Verilog2VHDL;

 

architecture Behavioral of Verilog2VHDL is

signal ct_a : STD_LOGIC_VECTOR (7 downto 0);

signal ct_b : STD_LOGIC_VECTOR (7 downto 0);

signal enable : STD_LOGIC;

 

begin

process(clk)

begin

if(clk='1' and clk'event) then

if (ct_a = 1) then

if del_clk = 0 then

ct_a <= "00000001";

else ct_a <= del_clk;

end if;

else

ct_a <= ct_a - 1;

end if;

if (ct_a = 1) then

if prog = 0 then

ct_b <= "00000001";

else ct_b <= prog;

end if;

elsif (enable='1') then

ct_b <= ct_b - 1;

end if;

if (ct_a = 1) then

enable <= '1';

elsif (ct_b = 1)then

enable <= '0';

end if;

end if;

end process;

 

shim <= enable;

 

end Behavioral;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кому интересно, вот схема которой меня наградили ( в корявом варианте )post-21468-1162284614_thumb.jpg

 

Отвечаю на вопросы

- Когда может изменяться сигнал prog?

- Сигнал prog задаётся только перед началом работы схемы и может измениться только при её перезапуске (сбросе).

- Каким должно быть поведение pinout при изменении сигнала prog?

- Думаю этот вопрос исчерпан

- Что должно случиться, если set изменится не одновременно с положительным фронтом сигнала clk?

- Такого по идее не должно случиться ибо они взаимозависимы (по поводу временных задержек история умалчивает :) ), но в этом не ничего страшного, ибо один такт мы можем позволить себе потерять,это не баг, это фича.

- Синхронизирован ли сигнал set по отношению к клоку генератора, и каким образом?

- Сигнал set является производным через делитель от clk, дополнительно нет никакой синхронизации.

Следовательно минимально реализуемая задержка равна 2 такта,этим можно пока ограничиться (да это следовало упомянуть)

 

- Какая Ваша основная область деятельности?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кому интересно, вот схема которой меня наградили ( в корявом варианте )post-21468-1162284614_thumb.jpg

 

Отвечаю на вопросы

- Когда может изменяться сигнал prog?

- Сигнал prog задаётся только перед началом работы схемы и может измениться только при её перезапуске (сбросе).

- Каким должно быть поведение pinout при изменении сигнала prog?

- Думаю этот вопрос исчерпан

- Что должно случиться, если set изменится не одновременно с положительным фронтом сигнала clk?

- Такого по идее не должно случиться ибо они взаимозависимы (по поводу временных задержек история умалчивает :) ), но в этом не ничего страшного, ибо один такт мы можем позволить себе потерять,это не баг, это фича.

- Синхронизирован ли сигнал set по отношению к клоку генератора, и каким образом?

- Сигнал set является производным через делитель от clk, дополнительно нет никакой синхронизации.

Следовательно минимально реализуемая задержка равна 2 такта,этим можно пока ограничиться (да это следовало упомянуть)

 

- Какая Ваша основная область деятельности?

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

 

Наслаждайтесь

 

library ieee;
use ieee.numeric_bit.all;

entity Timer is
    generic(
        MaxDelay : positive := 65536
    );
    port(
        Clk : in bit;
        ProgDelay : in integer range 2 to MaxDelay;
        Set : in bit;
        SetDelayed : out bit
    );
end Timer;

architecture Behavioral of Timer is
    signal delayLine : bit_vector( 0 to MaxDelay ) := (others => '0');
begin
    process( Clk )
    begin
        if rising_edge( Clk ) then
            delayLine <= Set & delayLine( 0 to MaxDelay - 1 );
        end if;
    end process;

    SetDelayed <= delayLine( ProgDelay );
end Behavioral;

 

Знаете, если серьезно, мне кажется, что Вы не до конца поняли задачу. Или Вам её не до конца объяснили. Так как только пьяному схемотехнику может прийти в голову идея формировать сигнал счетчиком, а потом его задерживать очень длинной лиинией задержки, не важно, как её реализуя.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

in integer range 2 to MaxDelay;

Шутить изволите?

Не боитесь, что потом попросят объяснить, куда делись неиспользуемые разряды порта?

Используйте std_logic и std_logic_vector и ничего кроме них в портах!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...