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

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

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

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

0011001100110011001100110011001100 clk

0011110000111100001111000011110000 set

0000001111000011110000111100001111 pinout

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

 

Даа. В самом общем случае вам нужнен сдвиговый регистр состоящий всего лишь из 65536 триггеров и небольшой мультиплексор 65536->1.

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


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

:) еще один глупый вопрос - что должно быть на выходе при коэффициенте делителя = 1 ?

При коэффициенте делителя=1 на выходе делителя получаем clk без изменений.Возьмём старый пример,изменив только коэффициент делителя частоты на 1,вот что должно быть:

001100110011001100110011001100 clk

001100110011001100110011001100 set

000011001100110011001100110011 out_clk

А сделать проще делитель и "сдвиг" совместно. Тогда только счетчиками можно обойтись.

Рационализация-вещь хорошая,если она приведёт к хорошим результатам буду только рад :)

при этом для справки делитель имеет входы clk,prog_clk,res_clk,set_clk и выход out_clk(вход set для таймера)

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


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

Вот вы опять себе противоречите - в этой диаграмме OUT_CLK сдвинут на половину такта CLK относительно SET... Собственно это уже единственное, что мешает...

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


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

Вот вы опять себе противоречите - в этой диаграмме OUT_CLK сдвинут на половину такта CLK относительно SET... Собственно это уже единственное, что мешает...

Извиняюсь,мой косяк,неправильно набрал, вот:

При коэффициенте делителя=1 на выходе делителя получаем clk без изменений.Возьмём старый пример,изменив только коэффициент делителя частоты на 1,вот что должно быть:

001100110011001100110011001100 clk

001100110011001100110011001100 set

000000110011001100110011001100 out_clk

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


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

При коэффициенте делителя=1 на выходе делителя получаем clk без изменений.Возьмём старый пример,изменив только коэффициент делителя частоты на 1,вот что должно быть:

001100110011001100110011001100 clk

001100110011001100110011001100 set

000000110011001100110011001100 out_clk

//////////////////////////////////////// такое Вы никогда не получите в системе, состоящей из двух взаимосвязанных счетчиков. Без базисной подготовки в области схемотехники Вам никакой 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

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


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

to sazh and Victor

Ребята,я вам безмерно благодарен за оказанную помощь, но для меня это сейчас всё равно что заставить собаку читать "Войну и мир". К сожелению верилога я незнаю абсолютно и работать с ним не имею возможности. Вас больше о чём-либо просить совесть не позволяет, но может быть подскажете к кому или куда можно обратиться за переводом ваших текстов в VHDL?

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


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

to sazh and Victor

Ребята,я вам безмерно благодарен за оказанную помощь, но для меня это сейчас всё равно что заставить собаку читать "Войну и мир". К сожелению верилога я незнаю абсолютно и работать с ним не имею возможности. Вас больше о чём-либо просить совесть не позволяет, но может быть подскажете к кому или куда можно обратиться за переводом ваших текстов в VHDL?

 

Veriloog

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


VHDL :

process(clk2x)
begin
if(clk2x='1' and clk2x'event)  then  -- posedge clk2x
    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;

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

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


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

to sazh

///////////////////// такое Вы никогда не получите в системе, состоящей из двух взаимосвязанных счетчиков.///////////////////

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

 

to victor

А без двойного клока обойтись никак нельзя? Ну нету у меня его и взять неоткуда,неужели ситуация тупиковая???????????????????? А если поставить ещё один делитель или умножитель частоты вместо второго клока сработает?

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

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


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

Я схемотехникой не занимаюсь -моё дело описать то что мне дали на VHDL.

 

Даа. Беда то какая. Описать алгоритм который не представляешь сам одинаково трудно хоть на С/С++ хоть на VHDL/Verilog хоть на Бейсик. За время этой беседы запросто мможно было кое чему научиться из области схемотехники.

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


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

Я схемотехникой не занимаюсь -моё дело описать то что мне дали на VHDL.

Вы удивитесь, но вы и не программист. Разработка FPGA --- это между схемотехникой и программингом. ИМХО, доля первой составляющей несколько больше.

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


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

Даа. Беда то какая. Описать алгоритм который не представляешь сам одинаково трудно хоть на С/С++ хоть на VHDL/Verilog хоть на Бейсик. За время этой беседы запросто мможно было кое чему научиться из области схемотехники.

Да если бы дело было в алгоритме, меня бы здесь не было. А вот представьте себе человека которому показали VHDL, а что это за хреновина толком не объяснили, но заставили сразу программить. Я конечно понимаю что все люди рождаются сразу гениями и всё знают,но я видимо не из таких,поэтому и пытаюсь задавать вопросы.

 

Вы удивитесь, но вы и не программист. Разработка FPGA --- это между схемотехникой и программингом. ИМХО, доля первой составляющей несколько больше.

я не удивлюсь, и с вами полностью согласен, осталось это только в голове уложить по полочкам

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


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

Схемотехник, давший мне такую конструкцию //////

Какую такую конструкцию Вам дал схемотехник. Карандашом от балды времянку нарисовал?

Вы у него схему попросите. И переведите ее в VHDL.

А лучше спросите у этого схемотехника, почему он свою работу на Вас переложил.

Потому что то, что мы сейчас обсуждаем никакого отношения к программированию не имеет.

Это не программа. Это описание схемы латинскими буквами. А можно и прямыми линиями в графике описать.

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


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

схема есть, и самое интересное в ней это два квадратика с названием "программмируемый делитель частоты" и "таймер задержки" и временные диаграммы.Вот. А я поначалу не понял что одной логикой не отделаешься, но дороги назад нет. Работу делать надо.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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