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

читаем "синхронизаторы сигналов, пересекающих клоковый домен (CDC, Clock Domain Cross)"

Да тут много еще чего нужно:

неблокирующие,

устранение дребезга,

оформление текта,

комментарии...

 

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


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

простейший синхронизатор для сигналов ZPR1 и ZPR2

module in_out_flag
(
input  in_flag,
input  out_clk,
output ena_out_flag
);

reg          dff_a = 1'b0;
reg [1:0] shift_rg = 2'b00;

always @(posedge out_clk or posedge in_flag)
begin
if(in_flag)            dff_a <= 1'b1;
else                dff_a <= 1'b0;
end

always @(posedge out_clk)
begin
shift_rg <= {shift_rg[0], dff_a};
end

assign ena_out_flag = ~shift_rg[1] && shift_rg[0];

endmodule

 

читаем "синхронизаторы сигналов, пересекающих клоковый домен (CDC, Clock Domain Cross)"

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

 

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


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

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

Так если не "прочитали" то, что рекомендовано, то значит и "не понял пока"... Тут удивляться нечего...

 

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


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

прочитал

http://marsohod.org/verilog/191-synchronizer

http://www.marsohod.org/11-blog/192-buscdc

http://marsohod.org/11-blog/190-meta1

Непонятно что есть ena_out_flag, в случае когда я передаю 10ти битные данные

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

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


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

module top(
input ZPR1,
input ZPR2,
input CLK,
output reg [9:0] D_OUT = 0
   );

reg [1:0] sync_reg_1;
reg [1:0] sync_reg_2;
reg [1:0] deb_cnt_1 = 0;
reg [1:0] deb_cnt_2 = 0;
reg ZPR1_RTL = 0;
reg ZPR2_RTL = 0;

always @(posedge CLK)
begin
sync_reg_1[1:0] <= {sync_reg_1[0],ZPR1};
sync_reg_2[1:0] <= {sync_reg_2[0],ZPR2};
end

always @(posedge CLK)
begin
if(sync_reg_1[1]==1 && deb_cnt_1!=2'b11)
	deb_cnt_1 <= deb_cnt_1 + 1'b1;
else if(sync_reg_1[1]==0 && deb_cnt_1!=2'b00)
		deb_cnt_1 <= deb_cnt_1 - 1'b1;
end

always @(posedge CLK)
begin
if(sync_reg_2[1]==1 && deb_cnt_2!=2'b11)
	deb_cnt_2 <= deb_cnt_2 + 1'b1;
else if(sync_reg_2[1]==0 && deb_cnt_2!=2'b00)
		deb_cnt_2 <= deb_cnt_2 - 1'b1;
end

always @(posedge CLK)
begin
if(deb_cnt_1 == 2'b11)
		ZPR1_RTL <= 1;
else if(deb_cnt_1 == 2'b00)	
		ZPR1_RTL <= 0;
end

always @(posedge CLK)
begin
if(deb_cnt_2 == 2'b11)
		ZPR2_RTL <= 1;
else if(deb_cnt_2 == 2'b00)	
		ZPR2_RTL <= 0;
end

always @(posedge CLK)
if(ZPR1_RTL)
	D_OUT <= D_IN_1;
else if(ZPR2_RTL)
			D_OUT <= D_IN_2;
	  else
			D_OUT <= 0;

endmodule

 

смотрите чтобы синтезатор не превратил данные конструкции вместо D триггера (FD):

sync_reg_1[1:0] <= {sync_reg_1[0],ZPR1};

sync_reg_2[1:0] <= {sync_reg_2[0],ZPR2};

 

в сдвиговый регистр (SRLC16)

 

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


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

module top(
input ZPR1,
input ZPR2,
input CLK,
output reg [9:0] D_OUT = 0
   );

reg [1:0] sync_reg_1;
reg [1:0] sync_reg_2;
reg [1:0] deb_cnt_1 = 0;
reg [1:0] deb_cnt_2 = 0;
reg ZPR1_RTL = 0;
reg ZPR2_RTL = 0;

always @(posedge CLK)
begin
sync_reg_1[1:0] <= {sync_reg_1[0],ZPR1};
sync_reg_2[1:0] <= {sync_reg_2[0],ZPR2};
end

always @(posedge CLK)
begin
if(sync_reg_1[1]==1 && deb_cnt_1!=2'b11)
	deb_cnt_1 <= deb_cnt_1 + 1'b1;
else if(sync_reg_1[1]==0 && deb_cnt_1!=2'b00)
		deb_cnt_1 <= deb_cnt_1 - 1'b1;
end

always @(posedge CLK)
begin
if(sync_reg_2[1]==1 && deb_cnt_2!=2'b11)
	deb_cnt_2 <= deb_cnt_2 + 1'b1;
else if(sync_reg_2[1]==0 && deb_cnt_2!=2'b00)
		deb_cnt_2 <= deb_cnt_2 - 1'b1;
end

always @(posedge CLK)
begin
if(deb_cnt_1 == 2'b11)
		ZPR1_RTL <= 1;
else if(deb_cnt_1 == 2'b00)	
		ZPR1_RTL <= 0;
end

always @(posedge CLK)
begin
if(deb_cnt_2 == 2'b11)
		ZPR2_RTL <= 1;
else if(deb_cnt_2 == 2'b00)	
		ZPR2_RTL <= 0;
end

always @(posedge CLK)
if(ZPR1_RTL)
	D_OUT <= D_IN_1;
else if(ZPR2_RTL)
			D_OUT <= D_IN_2;
	  else
			D_OUT <= 0;

endmodule

 

смотрите чтобы синтезатор не превратил данные конструкции вместо D триггера (FD):

sync_reg_1[1:0] <= {sync_reg_1[0],ZPR1};

sync_reg_2[1:0] <= {sync_reg_2[0],ZPR2};

 

в сдвиговый регистр (SRLC16)

 

Большое спасибо!

Данный метод работает, это получается описание синхрорегистра.

Собственно изучаю тему

Не могу разобраться в чем заключалась рассинхронизация между ZPR1 и ZPR2 при заполнении выходного регистра.

Спасибо!

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


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

Ваши сигналы ZPR1 и ZPR2 синхронны друг относительно друга, сами сказали, что "Длительность запросов 10мкс

Между первым и вторым запросом 64мкс", а относительно CLK сигналы ZPR1 и ZPR2 асинхронны и их надо принять через синхронизатор это первый момент. Второй момент это "иголки", дребезг и ,возможно, затянутый фронт сигналов ZPR, это лечится схемой антидребезга, каких великое множество, в данном случае тупой счетчик. На все это вам намекали выше.

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

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


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

Здравствуйте! Есть еще такой вопрос.

Есть-ли отличия между такими двумя записями (в одном случае все в разных always, во втором случае в одном, можно-ли делать как во втором или нет?

1

always @(posedge CLK)
begin
    sync_reg_1[1:0] <= {sync_reg_1[0],ZPR1};
    sync_reg_2[1:0] <= {sync_reg_2[0],ZPR2};
end
always @(posedge CLK)
begin
    if(sync_reg_1[1]==1 && deb_cnt_1!=2'b11)
        deb_cnt_1 <= deb_cnt_1 + 1'b1;
    else if(sync_reg_1[1]==0 && deb_cnt_1!=2'b00)
            deb_cnt_1 <= deb_cnt_1 - 1'b1;
end
always @(posedge CLK)
begin
    if(deb_cnt_1 == 2'b11)
            ZPR1_RTL <= 1;
    else if(deb_cnt_1 == 2'b00)    
            ZPR1_RTL <= 0;
end

 

2

always @(posedge CLK)
begin
    sync_reg_1[1:0] <= {sync_reg_1[0],ZPR1};
    sync_reg_2[1:0] <= {sync_reg_2[0],ZPR2};

    if(sync_reg_1[1]==1 && deb_cnt_1!=2'b11)
        deb_cnt_1 <= deb_cnt_1 + 1'b1;
    else if(sync_reg_1[1]==0 && deb_cnt_1!=2'b00)
            deb_cnt_1 <= deb_cnt_1 - 1'b1;

    if(deb_cnt_1 == 2'b11)
            ZPR1_RTL <= 1;
    else if(deb_cnt_1 == 2'b00)    
            ZPR1_RTL <= 0;
end

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


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

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

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

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

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

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

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

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

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

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