|
Синхронный сброс в триггерах на verilog, порождение мультиплексора на входах, quartus, семейство stratix4 |
|
|
|
May 29 2010, 00:34
|
Профессионал
    
Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082

|
Есть следующий код Код always @(posedge clk) if (~rst_sync) out_sync<=1'b0; else out_sync<=in; Вроде стандартное описание D-триггера с синхронным сбросом, только вот сброс на планере подключается не к sclr, а вешается на мультиплексор перед информационным входом. Вроде ничего страшного - дополнительных ресурсов минимум, по частоте не влияет, вот только непонятно - зачем этот мультиплексор, вроде стандартный триггер физически на ПЛИС есть? Были раньше на форуме подобные темы описаны и вроде настройки выставляю Allow Synchronous Control Signals Force Use of Synchronous Clear Signals Auto Clock Enable Replacement мультиплексор все равно остается, меняя вид... плюньте ссылкой, если не сложно, ну или объясните в чем проблема. Квартус косячит с описанием или я уже разучился на verilog писать элементарную схемотехнику?
Сообщение отредактировал bogaev_roman - May 29 2010, 00:35
|
|
|
|
|
May 29 2010, 01:52
|
Профессионал
    
Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942

|
С вашего позволения, с тем же самым размещусь в вашей теме. У меня вообще получается не пойми что. Код module rstest (rst, clk, in, out); input rst,clk,in; output out; reg [7:0] ctr; always @(posedge clk)// or negedge rst) if (~rst) ctr <= 8'd0; else if (in) ctr <= ctr + 1; assign out = &ctr; endmodule После синтеза. Код ASYNC SYNC Total registers 8 8 Total logic cells in carry chains 7 8 Total fan-out 50 43 Average fan-out 3.33 2.87
Асихронный сброс Синхронный сброс
Quartus 7.2, MAXII UPD: Учитывая название темы, перекомпилил под Стратикс-2. То же самое.Как при синхронном сбросе завести in на en вход триггера? И второй вопрос для гуру задам о синхронном сбросе. Как-то приводил описание своего синхронизатора ресета, почитав старые темы, решил уточнить. Код reg rst; reg [3:0] init; if (~reset) init <= 0; else if (~&init) init <= init + 1; rst <= init != 4'd14; end Асинхронный сброс заводится на счетчик в качестве синхронного сброса. При неблагоприятном стечении обстоятельств триггеры регистра могут попасть в метастабильное состояние, но при инкременте счетчик выходит из метастабильности, если понимать, что пройдя через второй и тем более через третий триггер в цепочке последовательно соединенных триггеров явление метастабильности с огромной вероятностью устраняется. А счетчик есть не что иное, как последовательно соединенные триггеры. Вопрос: это полный бред или имеет право на жизнь?
Сообщение отредактировал x736C - May 29 2010, 02:07
|
|
|
|
|
May 29 2010, 05:08
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(bogaev_roman @ May 28 2010, 19:34)  плюньте ссылкой, если не сложно, ну или объясните в чем проблема. Квартус косячит с описанием или я уже разучился на verilog писать элементарную схемотехнику? Обсуждали уже, поройтесь поиском. Квартус далеко не дурак, в вашем конкретном случае использовать lut ему дешевле. Потому что sclr это сигнал общий для 16 ти LC в LAB (для сыклона 3 например). И используя для вашего одного триггера честный sclr, он урезает функциональность 15 ти других. А как вы правильно заметили LUT все равно расходуется. То ква делает свой вывод об оптимальности. Цитата(x736C @ May 28 2010, 20:52)  У меня вообще получается не пойми что. чуть позже отвечу, почему он делает так объяснимо, но нужно проверить пару идей. Цитата Вопрос: это полный бред или имеет право на жизнь? лучше делайте на сдвиговых регистрах, как в статье про сбросы, до которой, по вашим словам, вы не добрались %)
--------------------
|
|
|
|
|
May 29 2010, 05:51
|
Знающий
   
Группа: Свой
Сообщений: 654
Регистрация: 24-01-07
Из: Воронеж
Пользователь №: 24 737

|
Цитата(x736C @ May 29 2010, 05:52)  У меня вообще получается не пойми что. ... Как при синхронном сбросе завести in на en вход триггера? Получается как раз понятно что. Чтобы en шел на триггер, приоритет en должен быть выше сброса. Цитата(x736C @ May 29 2010, 05:52)  Асинхронный сброс заводится на счетчик в качестве синхронного сброса. При неблагоприятном стечении обстоятельств триггеры регистра могут попасть в метастабильное состояние, но при инкременте счетчик выходит из метастабильности, если понимать, что пройдя через второй и тем более через третий триггер в цепочке последовательно соединенных триггеров явление метастабильности с огромной вероятностью устраняется. А счетчик есть не что иное, как последовательно соединенные триггеры. Вопрос: это полный бред или имеет право на жизнь? Бред. Вы сейчас сказали, что счетчик и сдвиговый регистр это одно и тоже. Достаточно очевидно что это не так? Триггер, попадающий в метастабильность, должен идти только на вход другого триггера.
|
|
|
|
|
May 29 2010, 11:24
|
Профессионал
    
Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942

|
Цитата(dvladim @ May 29 2010, 09:51)  Получается как раз понятно что. Чтобы en шел на триггер, приоритет en должен быть выше сброса. Вы правы, это усвоил. Синхронный сброс требует дополнительных ресурсов, как писал в соседней ветке. Так ведь? Цитата(dvladim @ May 29 2010, 09:51)  Бред. Вы сейчас сказали, что счетчик и сдвиговый регистр это одно и тоже. Достаточно очевидно что это не так? Триггер, попадающий в метастабильность, должен идти только на вход другого триггера. Я не говорил, что это одно и то же. Слово «сдвиговый» в моем сообщении отсутствует. Под «регистром» подразумевал набор триггеров, определяемых конструкцией языка reg [3:0] init;В счетчике выход одного триггера идет на вход другого. Ув. des00, я понял, что синхронизатор нужен нормальный, а подавать с него синхронный сброс все равно мне приходится на счетчик, так как синхронный сброс во всем проекте почему-то работает и по фронту и по уровню, а не только по уровню. Проверенно неоднократно. Если помните по другой ветке, я с этой проблемой столкнулся какое-то время назад. Поэтому счетчиком пришлось формировать гарантированный отрицательный импульс от отрицательного до положительного фронта. Почему так происходит — для меня так и осталось загадкой.
|
|
|
|
|
May 29 2010, 15:08
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(x736C @ May 29 2010, 05:24)  Синхронный сброс требует дополнительных ресурсов, как писал в соседней ветке. Так ведь? от архитектуры целевой плис зависит, в атаче как это сделано в статиксе2. Думаю что ответ на вопрос почему ква не ложит сброс на sclr стал понятным %) Цитата В счетчике выход одного триггера идет на вход другого. это в асинхронном счетчике, в синхронном на современных плис на вход одного триггера идет сигнал со всех предыдущих Цитата а подавать с него синхронный сброс все равно мне приходится на счетчик, так как синхронный сброс во всем проекте почему-то работает и по фронту и по уровню, а не только по уровню. Проверенно неоднократно. Вашу тему помню, но как то слабо. ИМХО там дело было не в сбросе, то, что вылечилось таким образом это просто повезло %)
Эскизы прикрепленных изображений
--------------------
|
|
|
|
|
May 29 2010, 15:19
|
Знающий
   
Группа: Свой
Сообщений: 654
Регистрация: 24-01-07
Из: Воронеж
Пользователь №: 24 737

|
Цитата(x736C @ May 29 2010, 15:24)  Вы правы, это усвоил. Синхронный сброс требует дополнительных ресурсов, как писал в соседней ветке. Так ведь? Почему? Просто вы описали схему, которая не легла на архитектуру (причина в приоритетах). В семействах Циклонов и Стратиксов выделенные цепи для синхронного сброса есть. Цитата(x736C @ May 29 2010, 15:24)  Я не говорил, что это одно и то же. Слово «сдвиговый» в моем сообщении отсутствует. Под «регистром» подразумевал набор триггеров, определяемых конструкцией языка reg [3:0] init; В счетчике выход одного триггера идет на вход другого. Зато присутствуют "пройдя через второй и тем более через третий триггер в цепочке последовательно соединенных триггеров", что в моем понимании и есть сдвиговый регистр. А в счетчике выход одного триггера идет не на вход другого, а на сумматор. Это слой логики и в синхронизаторе это совсем ни к чему.
|
|
|
|
|
May 29 2010, 18:59
|
Профессионал
    
Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942

|
Цитата(dvladim @ May 29 2010, 19:19)  Зато присутствуют "пройдя через второй и тем более через третий триггер в цепочке последовательно соединенных триггеров", что в моем понимании и есть сдвиговый регистр. А в счетчике выход одного триггера идет не на вход другого, а на сумматор. Это слой логики и в синхронизаторе это совсем ни к чему. Действительно, как выше указал des00 — для синхронного счетчика это так. Вопрос снимаю, бред так бред. Цитата(des00 @ May 29 2010, 19:08)  Вашу тему помню, но как то слабо. ИМХО там дело было не в сбросе, то, что вылечилось таким образом это просто повезло %) Исследовал много дней очень пристально этот вопрос. С осцилом и проверял на простейшей конструкции. Ответ «повезло» меня до сих пор не удовлетворяет, интересно все-таки разобраться почему. Проблема возникала не у меня одного. Могу повторить и поделиться результатами, все есть под рукой. Есть факт того, что при подаче питания (загрузка из м/с памяти) сигнал сброса имеет форму ступеньки " _/". Также есть факт — при загрузке через JTAG сигнал сброса, имеет V-образную форму форму " \_/" и формируется POR, насколько я понимаю. И есть факт загрузки (или ее отсутствия) триггера начальным значением после двух выше перечисленных фактов. Ув. dvladim в той ветке так же указывал на сброс и синхронизатор. В общем как-то так оно и происходит. Цитата(des00 @ May 29 2010, 19:08)  от архитектуры целевой плис зависит, в атаче как это сделано в статиксе2. Думаю что ответ на вопрос почему ква не ложит сброс на sclr стал понятным %) Выходит, с древним ACEX'ом, на котором проверял, ресурсов потребуется больше. В нем просто нет специального and под эти нужды. А под Стратикс такое описание не совсем подходит. Интересно другое. Под Стратикс такое описание очень даже подходит. RTL Viewer показывает (см. выше) картинку с мультиплексором. Chip Planner → Resource Property Editor показывает то что надо.
Что по всей видимости говорит о том, что одно относится к синтезу, а второе к размещению (fitter). Квартус In так и не заводит на En. Пропускает через мультиплексор, производя операцию else ctr <= ctr; которая мною не описана, но подразумевается. Проверяем утверждение dvladim.Меняем местами sclr и en.Код module rstest (rst, clk, in, out); input rst,clk,in; output out; reg [7:0] ctr; always @(posedge clk)// or negedge rst) if (in) ctr <= ctr + 1; else if (rst) ctr <= 8'd0; assign out = &ctr; endmodule RTL Viewer
Resource Property Editor Sсlr и En на своих местах.
Но сброс, видимо, вообще не сработает, пока En активен. UPD: Вывод: синхронный En при синхронном сбросе жрет таки-больше ресурсов, чем при асинхронном. Внимание вопрос: насколько я ошибся?))
Сообщение отредактировал x736C - May 29 2010, 19:05
|
|
|
|
|
May 29 2010, 19:15
|
Гуру
     
Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804

|
Цитата(x736C @ May 29 2010, 21:59)  Есть факт того, что при подаче питания (загрузка из м/с памяти) сигнал сброса имеет форму ступеньки "_/". Также есть факт — при загрузке через JTAG сигнал сброса, имеет V-образную форму форму "\_/" и формируется POR, насколько я понимаю. И есть факт загрузки (или ее отсутствия) триггера начальным значением после двух выше перечисленных фактов.
always @(posedge clk)// or negedge rst) if (in) ctr <= ctr + 1; else if (rst) ctr <= 8'd0;
Но сброс, видимо, вообще не сработает, пока En активен. Про сигнал сброса - кто его вырабатывает. От формы не должно зависить (если по фронту клока снимается). Начальное значение всегда грузится по этому сбросу. Год уже прошел. Надо разбираться. Про en - сама конструкция не корректна (rst всегда приоритетен) Код always @(posedge clk) if (in) begin if (rst) ctr <= 8'd0; else ctr <= ctr + 1'b1; end
|
|
|
|
|
May 29 2010, 19:32
|
Гуру
     
Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804

|
Цитата(x736C @ May 29 2010, 22:22)  Спасибо за ответ. Про сброс мыслю как и вы, но практика вынесла мне мозг.  В общем-то это в прошлом, просто не хочется наступить еще раз. Про некорректность знаю. Интересно было, что Квартус накомпилит. Если есть возможность по включению питания триггера в 0 устанавливать, можно внутренний clr вырабатывать (зачем в один такт как у Вас), и по нему грузить любое начальное значение. Вот - на базе рекомендаций из квартусовского руководства
|
|
|
|
|
May 29 2010, 19:33
|
Профессионал
    
Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942

|
Код always @(posedge clk) if (in) begin if (rst) ctr <= 8'd0; else ctr <= ctr + 1'b1; end То, что надо.
Два мультиплексора, вместо трех. Только мой вывод пока при мне: синхронный En при синхронном сбросе жрет таки-больше ресурсов, чем при асинхронном. Видимо, так и должно быть. За power_up.v спасибо. Цитата Если есть возможность по включению питания триггера в 0 устанавливать, можно внутренний clr вырабатывать (зачем в один такт как у Вас), и по нему грузить любое начальное значения. Так и не понял. Поподробней объясните, если вас не затруднит.
Сообщение отредактировал x736C - May 29 2010, 19:38
|
|
|
|
|
May 29 2010, 19:38
|
Профессионал
    
Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079

|
Цитата(x736C @ May 29 2010, 23:33)  То, что надо.  Цитата The signal order is the same for all Altera device families, although as noted previously, not all device families provide every signal. The following priority order is observed: 1. Asynchronous Clear, aclr—highest priority 2. Preset, pre 3. Asynchronous Load, aload 4. Enable, ena 5. Synchronous Clear, sclr 6. Synchronous Load, sload 7. Data In, data—lowest priority Код always @ (posedge clk or posedge aclr or posedge aload) begin if (aclr) q <= 1'b0; else if (aload) q <= adata; else if (ena) q <= data; end Код if (ena) begin if (sclr) q <= 1'b0; else if (sload) q <= sdata; else q <= data; end Quartus II Handbook Version 9.1 -> Volume 1: Design and Synthesis -> Section II. Design Guidelines -> 6. Recommended HDL Coding Styles -> Coding Guidelines for Registers and Latches (6-36)
--------------------
|
|
|
|
|
May 29 2010, 19:48
|
Профессионал
    
Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942

|
Спасибо за ссылку. Теперь буду знать, что при одновременном использовании ena имеет приоритет над sclr. Привычное описание if (sclr) .. else if (en) неоптимально.  Весь хендбук можно не копировать.
Сообщение отредактировал x736C - May 29 2010, 19:49
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|