Jump to content
    

Посоветуйте - как сделать цепочку из 2х делителей клока на 10 на verilog

10 часов назад, andrew_b сказал:

С первого взгляда не понять.

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

9 часов назад, Mty сказал:

логика все равно не успевает

Да, в общем случае используют синхронный перенос:

reg [2:0] count_reg10M;		// 3 bit = 8   /счет до 4
reg [3:0] count_reg1M;		// 4 bit = 16  /счет до 9
reg c10M, c1M;			// триггеры синхронных переносов

wire clock_10MHz, c10Maux;

assign c10Maux = & count_reg10M[1:0];	// 1 в случае b011 = будет в случае b100 в следующем такте
assign clock_10MHz = count_reg1M[0];	// у Вас был лишний триггер

always @(posedge clock_main)
	begin
		c10M <= c10Maux;
		c1M <= & {c10Maux, count_reg1M[3], count_reg1M[0]};	// оба счётчика до упора?

		if (c10M)
			begin
				count_reg10M <= 3'b0;
			end else begin
				count_reg10M <= count_reg10M + 1'b1;
		end

		if (c1M)
			begin
				count_reg1M <= 4'b0;
				clock_1MHz <= ~clock_1MHz;
			end else begin
				count_reg1M <= count_reg1M + c10M;
		end
	end

Share this post


Link to post
Share on other sites

14 часов назад, Mty сказал:

 

Нужно 2 дополнительных клока на Altera maxV - в ней нет PLL

Тем более, если нет pll, только одноклоковая синхронизация позволит сделать качественный проект.

 

Share this post


Link to post
Share on other sites

5 часов назад, blackfin сказал:

достаточно одного клока на 100MHz и двух стробирующих импульсов с частотой 1/10 и 1/100

Может автор энергию экономит, а если всё же нет, то примерно вот так:

reg [3:0] count_reg10M;		// 4 bit = 16  /счет до 9
reg [3:0] count_reg1M;		// 4 bit = 16  /счет до 9
reg c10M, c1M;			// триггеры синхронных переносов, они же и стробы

wire c10Maux;

assign c10Maux = & {count_reg10M[3], ~count_reg10M[2], ~count_reg10M[1], ~count_reg10M[0]};

always @(posedge clock_main)
	begin
		c10M <=    c10Maux;
		c1M  <= & {c10Maux, count_reg1M[3], count_reg1M[0]};

		count_reg10M <= (c10M) ? 4'b0 : count_reg10M + 1'b1;
		count_reg1M  <= (c1M)  ? 4'b0 : count_reg1M + c10M;
	end

Share this post


Link to post
Share on other sites

21 минуту назад, Plain сказал:
assign c10Maux = & {count_reg10M[3], ~count_reg10M[2], ~count_reg10M[1], ~count_reg10M[0]};

Последний "~" вроде лишний, не?

И зачем так писать, разве так не нагляднее?

assign c10Maux = (count_reg10M == 4'd9)

Share this post


Link to post
Share on other sites

10 минут назад, Freibier сказал:

разве так не нагляднее?

А чем будет реализовано это сравнение? Явное описание логики намекает реализовать её на одной LUT.

"9" будет лишь в следующем такте, поэтому надо "8".

Share this post


Link to post
Share on other sites

2 часа назад, Plain сказал:

Явное описание логики намекает реализовать её на одной LUT.

Намекает или обязывает?

Что, у этих двух записей разная вероятность реализации их на одной LUT?

r <= & {c[3], ~c[2], ~c[1], ~c[0]};

r <= c == 4'b1000;

 

Share this post


Link to post
Share on other sites

10 hours ago, blackfin said:

Вопрос в том, для чего вам нужны эти "2 дополнительных клока на Altera maxV" ?

Что вы собираетесь с ними делать?

Может статься, что достаточно одного клока на 100MHz и двух стробирующих импульсов с частотой 1/10 и 1/100 от основного клока.

Вполне возможно, а то с этими клоками я запутался. А стробирующие импульсы - это просто выделенные из клока 10й и 100й импульсы?

- Нужно запустить одновибратор генерящий паузу на 40мс. Если импульс запуска приходит в течении паузы повторно - выдается строб ошибки.

- нужен детектор наличия 1мгц от внешнего тактового источника. Если есть сигнал 1МГц в течении 2-3 периодов - выдается строб готовности. (duty cycle сигнала 10%)

- нужен модуль, который генерит сигнал сброса от CPU. Пока сделал модуль, который ждет 8 импульсов от CPU в течении 100us, чтобы исключить ложное срабатывание. (не настаиваю на такой схеме, лучше пока не придумал)

 

 

Share this post


Link to post
Share on other sites

On 3/23/2025 at 2:51 PM, Mty said:

- Нужно запустить одновибратор генерящий паузу на 40мс. Если импульс запуска приходит в течении паузы повторно - выдается строб ошибки.

- нужен детектор наличия 1мгц от внешнего тактового источника. Если есть сигнал 1МГц в течении 2-3 периодов - выдается строб готовности. (duty cycle сигнала 10%)

- нужен модуль, который генерит сигнал сброса от CPU. Пока сделал модуль, который ждет 8 импульсов от CPU в течении 100us, чтобы исключить ложное срабатывание. (не настаиваю на такой схеме, лучше пока не придумал)

Это всё легко можно сделать в одном клоковом домене - 100МГц.

 

On 3/23/2025 at 2:51 PM, Mty said:

А стробирующие импульсы - это просто выделенные из клока 10й и 100й импульсы?

Не совсем.. Это импульсы с длительностью 10 нс со скважностью 10 и 100 передний и задний фронт которых совпадает с передним фронтом клока 100МГц.

Share this post


Link to post
Share on other sites

1 час назад, Freibier сказал:

у этих двух записей разная вероятность реализации их на одной LUT?

Я не в курсе про поведение САПР в таких случаях, но LUT у данной ПЛИС 4-входовая, поэтому вероятность реализации на одной высокая.

Share this post


Link to post
Share on other sites

5 hours ago, Plain said:

Может автор энергию экономит, а если всё же нет, то примерно вот так:

reg [3:0] count_reg10M;		// 4 bit = 16  /счет до 9
reg [3:0] count_reg1M;		// 4 bit = 16  /счет до 9
reg c10M, c1M;			// триггеры синхронных переносов, они же и стробы

wire c10Maux;

assign c10Maux = & {count_reg10M[3], ~count_reg10M[2], ~count_reg10M[1], ~count_reg10M[0]};

always @(posedge clock_main)
	begin
		c10M <=    c10Maux;
		c1M  <= & {c10Maux, count_reg1M[3], count_reg1M[0]};

		count_reg10M <= (c10M) ? 4'b0 : count_reg10M + 1'b1;
		count_reg1M  <= (c1M)  ? 4'b0 : count_reg1M + c10M;
	end

Здорово, прям очень здорово! Идею понял. Готовим флажки в предыдущем такте, а в текущем на них реагируем.

Спасибо!

// c1M  <= & {c10Maux, count_reg1M[3], count_reg1M[0]};

// А такая запись полностью эквивалентна?
c1M  <= c10Maux & count_reg1M[3] & count_reg1M[0]};

А такая запись полностью эквивалентна?

28 minutes ago, blackfin said:

Не совсем.. Это импульсы с длительностью 10 нс со скважностью 10 и 100 передний и задний фронт которых совпадает с передним фронтом клока 100МГц.

Спасибо за интересную идею. Я так понимаю тут фишка в том, что строб чуть "растянут" по сравнению с импульсом клока, и дает более надежное срабатывание?

Видимо строб не используется как клок, а используется как флажок при работе со штатным клоком? Еще раз спасибо за идею, обдумаю это.

PS: Посмотрю ссылочку с часами, видимо там есть про это.

Share this post


Link to post
Share on other sites

48 минут назад, Mty сказал:

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

Нет, строб не "растянут", а просто равен одному периоду системной частоты, далее пишете все модули только на ней, в которых используете нужные стробы так же, как показано выше, т.е. (х) и далее.

52 минуты назад, Mty сказал:

такая запись полностью эквивалентна?

Строго говоря, нет, но результат тот же.

Share this post


Link to post
Share on other sites

56 минут назад, Mty сказал:

Я так понимаю тут фишка в том, что строб чуть "растянут" по сравнению с импульсом клока, и дает более надежное срабатывание?

Нет, фишка абсолютно не в этом.

56 минут назад, Mty сказал:

Видимо строб не используется как клок

Да, не используется.

Хотя почему бы и нет, кто же нам сможет запретить )

58 минут назад, Mty сказал:

а используется как флажок при работе со штатным клоком?

Верно.

Если хотите иметь полностью синхронный проект, то все эти стробы должны поступать на входы разрешения CE регистров.

Share this post


Link to post
Share on other sites

1 hour ago, Plain said:

Я не в курсе про поведение САПР в таких случаях, но LUT у данной ПЛИС 4-входовая, поэтому вероятность реализации на одной высокая.

Не надо соревноваться с оптимизирующим синтезатором. В 99,(9)% случаев он сделает лучше, чем человек, особенно в таких тривиальных. Пишите код, понятный человеку, а синтезатор справится.

Share this post


Link to post
Share on other sites

On 3/23/2025 at 2:51 PM, Mty said:

- Нужно запустить одновибратор генерящий паузу на 40мс. Если импульс запуска приходит в течении паузы повторно - выдается строб ошибки.

- нужен детектор наличия 1мгц от внешнего тактового источника. Если есть сигнал 1МГц в течении 2-3 периодов - выдается строб готовности. (duty cycle сигнала 10%)

- нужен модуль, который генерит сигнал сброса от CPU. Пока сделал модуль, который ждет 8 импульсов от CPU в течении 100us, чтобы исключить ложное срабатывание. (не настаиваю на такой схеме, лучше пока не придумал)

Вот, держите:

one_shot_pulse.txt
detect_clock.txt
rst_pulse.txt

PS. В симуляторе не проверял, возможно, где-то ошибся.. Сами проверите..
PPS. Красоту не наводил.. Сами наведёте.. ))

On 3/23/2025 at 2:51 PM, Mty said:

(не настаиваю на такой схеме, лучше пока не придумал)

Вообще, довольно мутно сформулирована задача. Возможно, я её не так понял..

Share this post


Link to post
Share on other sites

Присоединяюсь к мнениям, что:

  1. такое нужно делать в одном тактовом домене, это и проще, и зачастую корректнее, и по таймингам скорее всего лучше получится (разные клоки, даже синхронные, неизбежно имеют перекос (skew), который обычно больше перекоса единого клока по кристаллу);
  2. соревноваться с синтезатором в синтезе логики почти всегда бессмысленная трата времени и сил -- тул справится с этим лучше. Кроме того, и самое главное, описание логики на языке -- это описание функциональности, синтезатор имеет полное право превратить это в совершенно непохожую логическую конструкцию, которая будет функционально эквивалентна. В частности, если логическая функция сводится к 4 логическим переменным (битам), она будет без проблем упакована в 1 LUT4 безотносительно, какое было описание -- в виде явной логики или в виде сравнения переменной с числом. Поэтому да: код надо писать так, чтобы он был читабельным, ясным и выразительным -- так меньше шансов сделать ошибку, больше шансов её найти самому или другому человеку, читающему этот код, это важно во всех случаях, особенно, когда работаешь не один.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...