SM 9 June 25, 2014 Posted June 25, 2014 · Report post Это уже синхронное изменение от синхронно изменяемых сигналов... как тут может влезть мета стаибльность? Для ответа на этот вопрос надо видеть, что приходит на ВХОДЫ reg_wr и reg_adr, а не то, на что влияют их выходы. Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 June 25, 2014 Posted June 25, 2014 · Report post Так... Вот о чем я подумал... допустим есть какой-то внешний сигнал DataFromOut и сигнал что он изменился DataFromOutChange, меняется он по какому-то левому клоку. есть ли разница с точки зрения защиты от мета стабильности в 2 описаниях 1. reg in1 = 0; reg in2 = 0; reg [10:0] Data = 0; always @(posedge clk) begin in2 <= in1; in1 <= DataFromOutChange; if(in2 == 0) Data <= DataFromOut; end и 2. reg in1 = 0; reg in2 = 0; reg [10:0] Data1 = 0; reg [10:0] Data2 = 0; reg [10:0] Data = 0; always @(posedge clk) begin in2 <= in1; in1 <= DataFromOutChange; Data2 <= Data1; Data1 <= DataFromOut; if(in2 == 0) Data <= Data2; end у меня сделано по первому варианту. По приходу данных у меня появляется флаг что они пришли, это флаг асинхронен моему клоку. Я его протаскиваю через 2 триггера, тем временем пришедшие данные так и лежат в сдвиговом регистре куда они собирались. И когда прошедший через 2 триггера сигнал показывает что данные есть, я защелкиваю данные во входной регистр, который выведен на всю схему. Достаточно ли этого или что-то тут может быть? Надо ли данные тоже тащить через цепочку триггеров? Quote Share this post Link to post Share on other sites More sharing options...
SM 9 June 25, 2014 Posted June 25, 2014 · Report post Данные не надо тащить через цепочку триггеров, так как, как я понял, пока сигнал готовности проходит по цепочке, они измениться уже не могут. Если это не так, то надо вообще в принципе все по-другому делать. А почему "if (in2 == 0)" ? Признак, что данные готовы, это нулевой уровень? Вот тут большое подозрение есть, что какой-то косяк имеется, так как никакой гарантии, что это будет длиться 1 такт, нету. Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 June 25, 2014 Posted June 25, 2014 · Report post косяк в приведенном месте, я опечатался когда пример в форум писал.... В целом сработала китайская (ну или чья он там) мудрость. Трудно найти черную кошку в темной комнате, особенно если ее там нет. Я нашел косяк, и как всегда если что-то происходит крайне странное, то сделано что-то крайне тупое... Когда-то я хотел проверить не будет ли схема быстрее если один модуль будет работать не на 100 МГц, а на 50, для этой проверки сделал тупо reg half_clk; always @(posedge clk) half_clk <= ~ half_clk; и подал на модуль этот half_clk. не знаю, что было потом, может меня отвлекли или еще что-то. Но почему-то оно так и осталось. В итоге этот модуль весь работал не от основного клока, а от этой кривухи, которая конечно же дико сдвинута от обычного клока, а разводясь еще по огромному модулю все усугубляется... Блин сколько же я людей напряг.... простите мне очень стыдно... Я автор мета стабильности которая меня мучала :))), какой я молодец... однако у меня остался еще один вопрос у меня есть констраин NET "clk_pin" TNM_NET = clk_pin; TIMESPEC TS_clk_pin = PERIOD "clk_pin" 20 ns HIGH 50%; это входной клок 50 МГц. Он идет на PLL, где становится 100 МГц, и среда сама сделал констраин TS_DCM_CLK_Inst_clk2x = PERIOD TIMEGRP "DCM_CLK_Inst_clk2x" TS_clk_pin / 2 HIGH 50%; в ходе разводки для этого констраина пишется Minimum period is 9.553ns. я добавил свой констраин NET "glb_clk" TNM_NET = glb_clk; TIMESPEC TS_glb_clk = PERIOD "glb_clk" 10 ns HIGH 50%; это как раз тот клок что выходит с PLL, и для него получилось Minimum period is 3.124ns. вот я чего-то не понимаю, или меня где-то кидают? Что я не так написал в констраинах? Quote Share this post Link to post Share on other sites More sharing options...
SM 9 June 25, 2014 Posted June 25, 2014 · Report post reg half_clk; always @(posedge clk) half_clk <= ~ half_clk; и подал на модуль этот half_clk. Кстати, такое конечно совсем не айс, но и к проблемам не должно приводить. Чтобы оно корректно работало, надо, чтобы было включено по полной программе "automatic hold time correction" - в разных средах опции называются немного по-разному и имеют разные варианты установок, но суть одна, чтобы выдерживала холды на переходах с основного клока не генерированный клок. И следить за рапортом STA в части холдов. Хотя, именно в xilinx, я не уверен, что это есть, там как помнится проблемы с холдами. вот я чего-то не понимаю, или меня где-то кидают? Что я не так написал в констраинах? Скорее что-то меняется в разводке из-за каких то там чего-то там. Например меняется клоковая цепь - разводится глобальной или локальными/региональными. Это надо уже конкретно смотреть отчет STA в обоих случаях по critical path, там и видно будет, кто и где "кидает". Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 June 25, 2014 Posted June 25, 2014 · Report post но и к проблемам не должно приводить. не должно, а приводит:) Думаю что с некоторыми дополнительными телодвижениями оно бы и срослось, но я то их не делал. Ну и опять же частота работы блока в 2 раза меньше стала, тоже могло интересно получится, я то планировал на ту же частоту... скорее что-то меняется в разводке из-за каких то там чего-то там оба констраина одновременно существуют, вот.... в репорте напротив автоматом созданого setup и hold стоит, а напротив моего period. Может в этом отличие... разные параметры оценены... Quote Share this post Link to post Share on other sites More sharing options...
SM 9 June 25, 2014 Posted June 25, 2014 · Report post Ну и опять же частота работы блока в 2 раза меньше стала, тоже могло интересно получится, я то планировал на ту же частоту... Ну да, это обычно фатально. Quote Share this post Link to post Share on other sites More sharing options...