Faton_11 0 16 ноября, 2013 Опубликовано 16 ноября, 2013 (изменено) · Жалоба Golikov A., спасибо, понятно, а звучит как счетчик на JK триггерах) Теперь проблема со сбросом счетчика когда он доходит до значения 1010. Ниже приведен основной модуль, часть после черты "======" призвана описывать этот сброс. module JK_Counter ( input rst, input clk, input J1,J2,J3,J4, input K1,K2,K3,K4, output Q1,Q2,Q3,Q4, output wire Qinv1,Qinv2,Qinv3,Qinv4 ); wire Q1_wire; assign Q1_wire=Q1; JK_Trigger tr1 (rst,clk,J1,K1,Q1,Qinv1); JK_Trigger tr2 (rst,Q1,J2,K2,Q2,Qinv2); JK_Trigger tr3 (rst,Q2,J3,K3,Q3,Qinv3); JK_Trigger tr4 (rst,Q3,J4,K4,Q4,Qinv4); //======================================================= reg Q1_c; reg Q2_c; reg Q3_c; reg Q4_c; assign Q1=Q1_c; assign Q2=Q2_c; assign Q3=Q3_c; assign Q4=Q4_c; always@(posedge clk) if ((Q1&Q2&!Q3&Q4)==1) begin Q1_c=0; Q2_c=0; Q3_c=0; Q4_c=0; end endmodule Error: cannot be assigned more than one value, и понятно почему. Если после черты поменять код на вот такой //=============================== always@(posedge clk) if ((Q1&Q2&!Q3&Q4)==1) {Q1,Q2,Q3,Q4}=4b'0000; endmodule Error (10170): near text "b"; expecting ";" - не понятно почему.. как быть, надеюсь, не придется эти провода описывать как двунаправленные? Изменено 16 ноября, 2013 пользователем Faton_11 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 16 ноября, 2013 Опубликовано 16 ноября, 2013 · Жалоба Error (10170): near text "b"; expecting ";" - не понятно почему.. как быть, надеюсь, не придется эти провода описывать как двунаправленные? Если Вы описываете триггеры как "блоки", то тогда никаких "always@(posedge clk)" быть не должно. просто сборка сигналов должна подаваться на входы "блоков", а привязка к тактам будет у них внутри... Вы так же можете сделать еще так: взять Ваш триггер и "завернуть" в еще один файл. И в нем сделать нужные Вам входы: clk, счет-загрузка, вход синхронной загрузки. Тогда самый верхний уровень будет выглядеть вполне читаемым и в нем кроме установленных триггеров и одной сборки сигналов ничего не будет... Но так следует поступать только в том случае, когда Вы без JK-триггера жить не можете... А обычно все пишется гораздо легче и проще... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 16 ноября, 2013 Опубликовано 16 ноября, 2013 · Жалоба у вас путаница. вы пишите счетчик на JK тригерах - это элемент который ведет себя определенным образом. он на выход выдает сигналы в зависимости от входного воздействия. И следовательно просить сделаться выход нулем не верно! надо подать соответствующее воздействия на вход триггеров, чтобы выход стал нулем! то есть когда у вас выходы триггеров принимаю определенное состояние я бы сделал так wire [3:0] State; assign State = {q3,q2,q1,q0}; кстати лучше нумеровать выходы с 0 и старшим вперед, так как то привычнее... и дальше if(State == 4b'1010) begin //do reset end; в зависимости от синхронного или асинхронного этот блок надо запихать либо под always @(posedge clk) либо под always@(q0,q1,q2,q3) но обращаю ваше внимание что ресет необходимо делать именно подачей правильного сигнала на вход сброса триггера, а не попыткой переназначит выходные сигналы далее в вашем модуле сигналы input J1,J2,J3,J4, input K1,K2,K3,K4, не нужны, это входа модулей триггера, и наружу выводить их не надо, это должны быть внутренними локальными wire также не нужны reg Q1_c; reg Q2_c; reg Q3_c; reg Q4_c; потому что триггер сам будет хранить свое состояние и иметь промежуточный регистр внутри не надо, это только задержку выдачи данных создаст в 1 такт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Faton_11 0 16 ноября, 2013 Опубликовано 16 ноября, 2013 · Жалоба Разве у меня не это и сделано: после того как выходы триггеров принимают определенное состояние, они должны обнулиться always@(posedge clk) if ((Q1&Q2&!Q3&Q4)==1) begin Q1_c=0; Q2_c=0; Q3_c=0; Q4_c=0; end Выставить между begin и end сигнал ресет не могу always@(posedge clk) if ((Q1&Q2&!Q3&Q4)==1) begin rst=0; end , потому что он input а эти регистры reg Q1_c; reg Q2_c; reg Q3_c; reg Q4_c; играют не роль промежуточных, а переназначают output-ы в reg-и, чтобы в них можно было записывать. Внутри триггера делать сброс тоже не могу, потому что нужно чтобы все выходы установились в определенное состояние, а не только один.. в общем, ужас какой-то.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 16 ноября, 2013 Опубликовано 16 ноября, 2013 · Жалоба Разве у меня не это и сделано: .... Внутри триггера делать сброс тоже не могу, ... В общем сплошной бред... Я Вам рекомендую еще раз найти у меня на сайте "Краткий Курс" и учить язык... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 16 ноября, 2013 Опубликовано 16 ноября, 2013 · Жалоба Разве у меня не это и сделано: после того как выходы триггеров принимают определенное состояние, они должны обнулитьсяДолжны, но обнулять их должны сами тригера, а не вы, присвоив их выходам какие то значения (это в принципе не работает) Совет - откажитесь от асинхронного ресета, делайте всю схему синхронной. Совет второй - используйте ваши JK тригера как управляемый T тригер (входы J и K объединяются и представляют вход EN) Совет третий - разберитесь, как вообще переключаются тригера в счетчике (подсказка - самый младший переключается всегда, все остальные тогда, когда все тригера перед ним находятся в состоянии 1) Сброс счетчика тоже делаете синхронным - из состояния 1001 он должен перейти в состояние 0000 Код сами напишите? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sefo 0 16 ноября, 2013 Опубликовано 16 ноября, 2013 · Жалоба Пора начать все с начала. У Вас есть вполне конкретная задача - реализовать счетчик на JK-триггерах. Цель этой задачи, очевидно в том, чтобы разобраться в особенностях работы JK-триггера. Поэтому, Вы правильно сделали, что начали с графической схемы. Если писать код на HDL, то Вам все равно для решения поставленной задачи потребуется выделить JK-триггер в отдельный модуль и затем кодом соединить эти модули в цепочку, образующую счетчик. Это не наглядно, Вы в недостаточной степени владеете HDL, это мало поможет разобраться в особенностях работы JK-триггера. Давайте вернемся к графической схеме, но начнем с малого и постепенно нарастим ее до нужного Вам счетчика. Классический синхронный JK-триггер имеет управляющие J и K входы, тактовый CK вход и прямой и инверсный выходы Q, ~Q. Квартусовский примитив имеет 2 дополнительных асинхронных входа для сброса (CLRN) и установки (PRN), но для решения вашей задачи ими пользоваться не нужно. При этом, Квартусовский примитив не имеет инверсный выход ~Q, поэтому либо "оберните" квартусовский примитив модулем с полным набором входов и выходов JK-триггера (что более наглядно), либо дорисовывайте инвертор прямо рядом с триггером, так чтобы мысленно его можно было бы представить инверсным выходом примитива. Работа JK-триггера Далее, поскольку Вы используете синхронные JK-триггеры, то стоит придерживаться простого правила - на тактовые входы подается один и тот же тактовый сигнал. Когда в цепочке триггеров на тактовый вход следующего триггера подается сигнал с выхода предыдущего, то возникают гонки. Гонки - это всегда потенциальный источник ошибок. Произойдет ошибка или нет зависит от того успеют ли все триггеры в цепочке перейти в новое состояние до следующего фронта тактового импульса на первом триггере или нет (т.е. успеет ли "волна" переключений "докатиться" до последнего триггера). Таким образом, появление ошибки тем вероятнее, чем выше тактовая частота или чем длиннее цепочка триггеров. Сначала реализуйте графической схемой 2-х битный счетчик на двух JK-триггерах, который считает по кругу от 0 до 3. Потом мы нарастим его до нужного Вам 4-х битного счетчика. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LV26 0 16 ноября, 2013 Опубликовано 16 ноября, 2013 · Жалоба Куда мир катится... 3 (!!!) страницы форума по одному из основных элементов в цифровой схемотехнике... Вот картинка классического синхронного счетчика на JK-тригерах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sefo 0 16 ноября, 2013 Опубликовано 16 ноября, 2013 · Жалоба Вот картинка классического синхронного счетчика на JK-тригерах. Ну зачем же Вы так? Человек сам хотел разобраться... что весьма похвально. Может лучше убрать картинку? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Faton_11 0 16 ноября, 2013 Опубликовано 16 ноября, 2013 · Жалоба Снова пришлось вернуться к схемам. Там есть ещё альтеровский примитив с инверсным выходом, вот он то меня и спас. А если 4-входовое "И" подключать к прямым выходам, квартус этого не позволяет. Спасибо всем! =) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LV26 0 16 ноября, 2013 Опубликовано 16 ноября, 2013 · Жалоба Ну зачем же Вы так? Человек сам хотел разобраться... что весьма похвально. Может лучше убрать картинку? Убрал, но не поможет. Эта картинка ищется в гугле на 5 сек. И раз ТС еще это не сделал, то ему это не интересно. Снова пришлось вернуться к схемам. Там есть ещё альтеровский примитив с инверсным выходом, вот он то меня и спас. А если 4-входовое "И" подключать к прямым выходам, квартус этого не позволяет. Спасибо всем! =) Простите, схема - кака. Асинхронное оно. Подумайте, как задействовать входы "К" для этого. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sefo 0 16 ноября, 2013 Опубликовано 16 ноября, 2013 · Жалоба А если 4-входовое "И" подключать к прямым выходам, квартус этого не позволяет. Быть такого не может! Это однозначно НЕЗАЧЕТ. Сравнивать "в лоб" и сбрасывать через асинхронный ресет как-то "некрасиво" для данной задачи. Тем более, что в классических JK-триггерах асинхронного сброса нет. Ну что, Вам сразу "правильный" ответ или пойдете по честному пути - т.е. помочь Вам дойти до правильного ответа самому? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 17 ноября, 2013 Опубликовано 17 ноября, 2013 · Жалоба ставлю на то что если бы это была учебная задачка, то должна была быть и методичка по которой надо было это собрать... если человек ковыряется, то хочет сам изобрести велосипедик. А это плохо только в работе, а в образовательном процессе чем больше своих велосипедов построил, тем лучше база, ну конечно если все велики до ума доведены.. и если хотите помочь человек ту надо что-то конкретнее чем "кака", "асинхронно"... я так понимаю что к счетчику претензий ней, вопросы вызывает реализация сброса? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sefo 0 17 ноября, 2013 Опубликовано 17 ноября, 2013 · Жалоба я так понимаю что к счетчику претензий ней, вопросы вызывает реализация сброса? Как раз претензии именно к счетчику. Классический синхронный JK-триггер не имеет асинхронного сброса. Задача учебная, поэтому сброс счетчика должен осуществляться через входы K. В противном случае, нет вообще смысла завязываться на конкретный тип триггера - пара строк на любом HDL или квартусовский примитив счетчика и счетчик готов. если хотите помочь человек ту надо что-то конкретнее чем "кака", "асинхронно"... Я предложил автору темы на выбор: ответ или несколько наводящих упражнений, после которых он, надеюсь, сам сообразит как это реализовать. Выбор за ним... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LV26 0 17 ноября, 2013 Опубликовано 17 ноября, 2013 · Жалоба и если хотите помочь человек ту надо что-то конкретнее чем "кака", "асинхронно"... Мне кажется, что человеку надо больше делать телодвижений в самообразовании и почитать пару книг в первую очередь. Но вопрос, по поводу где и что почитать не прозвучал, если не ошибаюсь. А знания не дают, их берут. Походу интереса к теме у ТС, кроме как сдачи лабораторки или зачета нет. И все, что тут ему понаписывали успешно забудется после решения "вопроса". Больше тратить время на эту тему не представляю возможным. Всем успехов! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться