klop 0 October 25, 2006 Posted October 25, 2006 · Report post В общем вся соль в том что сначала запутали меня, а я потом запутал вас. Уточняю задачу: Изначально мы имеем некоторый тактовый генератор чатота с которого поступает на программируемый делитель частоты с коэфициентом деления от 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. Quote Share this post Link to post Share on other sites More sharing options...
darkniisiis 0 October 25, 2006 Posted October 25, 2006 · Report post :) еще один глупый вопрос - что должно быть на выходе при коэффициенте делителя = 1 ? При коэффициенте делителя=1 на выходе делителя получаем clk без изменений.Возьмём старый пример,изменив только коэффициент делителя частоты на 1,вот что должно быть: 001100110011001100110011001100 clk 001100110011001100110011001100 set 000011001100110011001100110011 out_clk А сделать проще делитель и "сдвиг" совместно. Тогда только счетчиками можно обойтись. Рационализация-вещь хорошая,если она приведёт к хорошим результатам буду только рад :) при этом для справки делитель имеет входы clk,prog_clk,res_clk,set_clk и выход out_clk(вход set для таймера) Quote Share this post Link to post Share on other sites More sharing options...
Victor 0 October 25, 2006 Posted October 25, 2006 · Report post Вот вы опять себе противоречите - в этой диаграмме OUT_CLK сдвинут на половину такта CLK относительно SET... Собственно это уже единственное, что мешает... Quote Share this post Link to post Share on other sites More sharing options...
darkniisiis 0 October 25, 2006 Posted October 25, 2006 · Report post Вот вы опять себе противоречите - в этой диаграмме OUT_CLK сдвинут на половину такта CLK относительно SET... Собственно это уже единственное, что мешает... Извиняюсь,мой косяк,неправильно набрал, вот: При коэффициенте делителя=1 на выходе делителя получаем clk без изменений.Возьмём старый пример,изменив только коэффициент делителя частоты на 1,вот что должно быть: 001100110011001100110011001100 clk 001100110011001100110011001100 set 000000110011001100110011001100 out_clk Quote Share this post Link to post Share on other sites More sharing options...
Victor 0 October 25, 2006 Posted October 25, 2006 · Report post Тогда, собственно останется только с верилога на VHDL переложить... ;) Quote Share this post Link to post Share on other sites More sharing options...
sazh 9 October 25, 2006 Posted October 25, 2006 · Report post При коэффициенте делителя=1 на выходе делителя получаем clk без изменений.Возьмём старый пример,изменив только коэффициент делителя частоты на 1,вот что должно быть: 001100110011001100110011001100 clk 001100110011001100110011001100 set 000000110011001100110011001100 out_clk //////////////////////////////////////// такое Вы никогда не получите в системе, состоящей из двух взаимосвязанных счетчиков. Без базисной подготовки в области схемотехники Вам никакой VHDL не поможет. Я набросал Вам тестовых пример, который покрывает Вашу задачу. Посмотрите, что можно, а что нельзя. Как бы Вы не крутили, из этой колеи никуда не денетесь. И не говорите, что Ваш моделсим не поддерживает верилог. Quote Share this post Link to post Share on other sites More sharing options...
Victor 0 October 25, 2006 Posted October 25, 2006 · Report post По любому нужен двойной клок. Если он есть, то вот вериложный модуль. За сумбурность извините, на коленке написано :) но работать должно :) 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 Quote Share this post Link to post Share on other sites More sharing options...
darkniisiis 0 October 26, 2006 Posted October 26, 2006 · Report post to sazh and Victor Ребята,я вам безмерно благодарен за оказанную помощь, но для меня это сейчас всё равно что заставить собаку читать "Войну и мир". К сожелению верилога я незнаю абсолютно и работать с ним не имею возможности. Вас больше о чём-либо просить совесть не позволяет, но может быть подскажете к кому или куда можно обратиться за переводом ваших текстов в VHDL? Quote Share this post Link to post Share on other sites More sharing options...
klop 0 October 26, 2006 Posted October 26, 2006 (edited) · Report post 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; Edited October 26, 2006 by klop Quote Share this post Link to post Share on other sites More sharing options...
darkniisiis 0 October 30, 2006 Posted October 30, 2006 (edited) · Report post to sazh ///////////////////// такое Вы никогда не получите в системе, состоящей из двух взаимосвязанных счетчиков./////////////////// Остался маленький вопрос-почему?Я схемотехникой не занимаюсь -моё дело описать то что мне дали на VHDL. Схемотехник, давший мне такую конструкцию был удивлён вашим ответом и я теперь в полном тупике. Так всё же почему???? to victor А без двойного клока обойтись никак нельзя? Ну нету у меня его и взять неоткуда,неужели ситуация тупиковая???????????????????? А если поставить ещё один делитель или умножитель частоты вместо второго клока сработает? Edited October 30, 2006 by darkniisiis Quote Share this post Link to post Share on other sites More sharing options...
klop 0 October 30, 2006 Posted October 30, 2006 · Report post Я схемотехникой не занимаюсь -моё дело описать то что мне дали на VHDL. Даа. Беда то какая. Описать алгоритм который не представляешь сам одинаково трудно хоть на С/С++ хоть на VHDL/Verilog хоть на Бейсик. За время этой беседы запросто мможно было кое чему научиться из области схемотехники. Quote Share this post Link to post Share on other sites More sharing options...
andrew_b 23 October 30, 2006 Posted October 30, 2006 · Report post Я схемотехникой не занимаюсь -моё дело описать то что мне дали на VHDL. Вы удивитесь, но вы и не программист. Разработка FPGA --- это между схемотехникой и программингом. ИМХО, доля первой составляющей несколько больше. Quote Share this post Link to post Share on other sites More sharing options...
darkniisiis 0 October 30, 2006 Posted October 30, 2006 · Report post Даа. Беда то какая. Описать алгоритм который не представляешь сам одинаково трудно хоть на С/С++ хоть на VHDL/Verilog хоть на Бейсик. За время этой беседы запросто мможно было кое чему научиться из области схемотехники. Да если бы дело было в алгоритме, меня бы здесь не было. А вот представьте себе человека которому показали VHDL, а что это за хреновина толком не объяснили, но заставили сразу программить. Я конечно понимаю что все люди рождаются сразу гениями и всё знают,но я видимо не из таких,поэтому и пытаюсь задавать вопросы. Вы удивитесь, но вы и не программист. Разработка FPGA --- это между схемотехникой и программингом. ИМХО, доля первой составляющей несколько больше. я не удивлюсь, и с вами полностью согласен, осталось это только в голове уложить по полочкам Quote Share this post Link to post Share on other sites More sharing options...
sazh 9 October 30, 2006 Posted October 30, 2006 · Report post Схемотехник, давший мне такую конструкцию ////// Какую такую конструкцию Вам дал схемотехник. Карандашом от балды времянку нарисовал? Вы у него схему попросите. И переведите ее в VHDL. А лучше спросите у этого схемотехника, почему он свою работу на Вас переложил. Потому что то, что мы сейчас обсуждаем никакого отношения к программированию не имеет. Это не программа. Это описание схемы латинскими буквами. А можно и прямыми линиями в графике описать. Quote Share this post Link to post Share on other sites More sharing options...
darkniisiis 0 October 30, 2006 Posted October 30, 2006 · Report post схема есть, и самое интересное в ней это два квадратика с названием "программмируемый делитель частоты" и "таймер задержки" и временные диаграммы.Вот. А я поначалу не понял что одной логикой не отделаешься, но дороги назад нет. Работу делать надо. Quote Share this post Link to post Share on other sites More sharing options...