iosifk 3 24 ноября, 2015 Опубликовано 24 ноября, 2015 · Жалоба читаем "синхронизаторы сигналов, пересекающих клоковый домен (CDC, Clock Domain Cross)" Да тут много еще чего нужно: неблокирующие, устранение дребезга, оформление текта, комментарии... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
woofer46 0 24 ноября, 2015 Опубликовано 24 ноября, 2015 · Жалоба простейший синхронизатор для сигналов 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)" К сожалению не понял пока как мне адаптировать это под мой случай Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 24 ноября, 2015 Опубликовано 24 ноября, 2015 · Жалоба К сожалению не понял пока как мне адаптировать это под мой случай Так если не "прочитали" то, что рекомендовано, то значит и "не понял пока"... Тут удивляться нечего... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
woofer46 0 24 ноября, 2015 Опубликовано 24 ноября, 2015 (изменено) · Жалоба прочитал 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ти битные данные Изменено 24 ноября, 2015 пользователем woofer46 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
likeasm 0 24 ноября, 2015 Опубликовано 24 ноября, 2015 · Жалоба 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) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
woofer46 0 25 ноября, 2015 Опубликовано 25 ноября, 2015 · Жалоба 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 при заполнении выходного регистра. Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
likeasm 0 25 ноября, 2015 Опубликовано 25 ноября, 2015 (изменено) · Жалоба Ваши сигналы ZPR1 и ZPR2 синхронны друг относительно друга, сами сказали, что "Длительность запросов 10мкс Между первым и вторым запросом 64мкс", а относительно CLK сигналы ZPR1 и ZPR2 асинхронны и их надо принять через синхронизатор это первый момент. Второй момент это "иголки", дребезг и ,возможно, затянутый фронт сигналов ZPR, это лечится схемой антидребезга, каких великое множество, в данном случае тупой счетчик. На все это вам намекали выше. Изменено 25 ноября, 2015 пользователем likeasm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
woofer46 0 30 ноября, 2015 Опубликовано 30 ноября, 2015 · Жалоба Здравствуйте! Есть еще такой вопрос. Есть-ли отличия между такими двумя записями (в одном случае все в разных 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
likeasm 0 30 ноября, 2015 Опубликовано 30 ноября, 2015 · Жалоба а вы схемы сравните после синтеза Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться