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

счетчик на триггерах

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 ";" - не понятно почему..

 

как быть, надеюсь, не придется эти провода описывать как двунаправленные?

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

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


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

Error (10170): near text "b"; expecting ";" - не понятно почему..

 

как быть, надеюсь, не придется эти провода описывать как двунаправленные?

 

Если Вы описываете триггеры как "блоки", то тогда никаких "always@(posedge clk)" быть не должно.

просто сборка сигналов должна подаваться на входы "блоков", а привязка к тактам будет у них внутри...

Вы так же можете сделать еще так: взять Ваш триггер и "завернуть" в еще один файл. И в нем сделать нужные Вам входы: clk, счет-загрузка, вход синхронной загрузки. Тогда самый верхний уровень будет выглядеть вполне читаемым и в нем кроме установленных триггеров и одной сборки сигналов ничего не будет...

 

Но так следует поступать только в том случае, когда Вы без JK-триггера жить не можете... А обычно все пишется гораздо легче и проще...

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


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

у вас путаница.

 

вы пишите счетчик на 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 такт.

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


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

Разве у меня не это и сделано: после того как выходы триггеров принимают определенное состояние, они должны обнулиться

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-и, чтобы в них можно было записывать.

 

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

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


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

Разве у меня не это и сделано: ....

Внутри триггера делать сброс тоже не могу, ...

В общем сплошной бред...

Я Вам рекомендую еще раз найти у меня на сайте "Краткий Курс" и учить язык...

 

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


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

Разве у меня не это и сделано: после того как выходы триггеров принимают определенное состояние, они должны обнулиться
Должны, но обнулять их должны сами тригера, а не вы, присвоив их выходам какие то значения (это в принципе не работает)

 

Совет - откажитесь от асинхронного ресета, делайте всю схему синхронной.

Совет второй - используйте ваши JK тригера как управляемый T тригер (входы J и K объединяются и представляют вход EN)

Совет третий - разберитесь, как вообще переключаются тригера в счетчике (подсказка - самый младший переключается всегда, все остальные тогда, когда все тригера перед ним находятся в состоянии 1)

 

Сброс счетчика тоже делаете синхронным - из состояния 1001 он должен перейти в состояние 0000

 

Код сами напишите? :)

 

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


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

Пора начать все с начала.

 

У Вас есть вполне конкретная задача - реализовать счетчик на JK-триггерах. Цель этой задачи, очевидно в том, чтобы разобраться в особенностях работы JK-триггера.

 

Поэтому, Вы правильно сделали, что начали с графической схемы. Если писать код на HDL, то Вам все равно для решения поставленной задачи потребуется выделить JK-триггер в отдельный модуль и затем кодом соединить эти модули в цепочку, образующую счетчик. Это не наглядно, Вы в недостаточной степени владеете HDL, это мало поможет разобраться в особенностях работы JK-триггера.

 

Давайте вернемся к графической схеме, но начнем с малого и постепенно нарастим ее до нужного Вам счетчика.

 

 

Классический синхронный JK-триггер имеет управляющие J и K входы, тактовый CK вход и прямой и инверсный выходы Q, ~Q.

 

Квартусовский примитив имеет 2 дополнительных асинхронных входа для сброса (CLRN) и установки (PRN), но для решения вашей задачи ими пользоваться не нужно. При этом, Квартусовский примитив не имеет инверсный выход ~Q, поэтому либо "оберните" квартусовский примитив модулем с полным набором входов и выходов JK-триггера (что более наглядно), либо дорисовывайте инвертор прямо рядом с триггером, так чтобы мысленно его можно было бы представить инверсным выходом примитива.

 

Работа JK-триггера

 

post-7537-1384618901.jpg

 

 

Далее, поскольку Вы используете синхронные JK-триггеры, то стоит придерживаться простого правила - на тактовые входы подается один и тот же тактовый сигнал.

 

Когда в цепочке триггеров на тактовый вход следующего триггера подается сигнал с выхода предыдущего, то возникают гонки. Гонки - это всегда потенциальный источник ошибок. Произойдет ошибка или нет зависит от того успеют ли все триггеры в цепочке перейти в новое состояние до следующего фронта тактового импульса на первом триггере или нет (т.е. успеет ли "волна" переключений "докатиться" до последнего триггера).

 

Таким образом, появление ошибки тем вероятнее, чем выше тактовая частота или чем длиннее цепочка триггеров.

 

Сначала реализуйте графической схемой 2-х битный счетчик на двух JK-триггерах, который считает по кругу от 0 до 3. Потом мы нарастим его до нужного Вам 4-х битного счетчика.

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


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

Куда мир катится... 3 (!!!) страницы форума по одному из основных элементов в цифровой схемотехнике...

 

Вот картинка классического синхронного счетчика на JK-тригерах.

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


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

Вот картинка классического синхронного счетчика на JK-тригерах.

 

Ну зачем же Вы так? Человек сам хотел разобраться... что весьма похвально.

 

Может лучше убрать картинку?

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


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

Снова пришлось вернуться к схемам. Там есть ещё альтеровский примитив с инверсным выходом, вот он то меня и спас.

post-77128-1384623262_thumb.jpg

А если 4-входовое "И" подключать к прямым выходам, квартус этого не позволяет.

Спасибо всем! =)

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


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

Ну зачем же Вы так? Человек сам хотел разобраться... что весьма похвально.

 

Может лучше убрать картинку?

 

Убрал, но не поможет.

 

Эта картинка ищется в гугле на 5 сек.

И раз ТС еще это не сделал, то ему это не интересно.

 

Снова пришлось вернуться к схемам. Там есть ещё альтеровский примитив с инверсным выходом, вот он то меня и спас.

post-77128-1384623262_thumb.jpg

А если 4-входовое "И" подключать к прямым выходам, квартус этого не позволяет.

Спасибо всем! =)

 

Простите, схема - кака.

Асинхронное оно. Подумайте, как задействовать входы "К" для этого.

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


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

А если 4-входовое "И" подключать к прямым выходам, квартус этого не позволяет.

 

Быть такого не может!

 

 

post-77128-1384623262_thumb.jpg

 

Это однозначно НЕЗАЧЕТ.

 

Сравнивать "в лоб" и сбрасывать через асинхронный ресет как-то "некрасиво" для данной задачи. Тем более, что в классических JK-триггерах асинхронного сброса нет.

 

Ну что, Вам сразу "правильный" ответ или пойдете по честному пути - т.е. помочь Вам дойти до правильного ответа самому?

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


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

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

если человек ковыряется, то хочет сам изобрести велосипедик. А это плохо только в работе, а в образовательном процессе чем больше своих велосипедов построил, тем лучше база, ну конечно если все велики до ума доведены..

 

и если хотите помочь человек ту надо что-то конкретнее чем "кака", "асинхронно"...

 

я так понимаю что к счетчику претензий ней, вопросы вызывает реализация сброса?

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


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

я так понимаю что к счетчику претензий ней, вопросы вызывает реализация сброса?

 

Как раз претензии именно к счетчику. Классический синхронный JK-триггер не имеет асинхронного сброса.

 

Задача учебная, поэтому сброс счетчика должен осуществляться через входы K. В противном случае, нет вообще смысла завязываться на конкретный тип триггера - пара строк на любом HDL или квартусовский примитив счетчика и счетчик готов.

 

если хотите помочь человек ту надо что-то конкретнее чем "кака", "асинхронно"...

 

Я предложил автору темы на выбор: ответ или несколько наводящих упражнений, после которых он, надеюсь, сам сообразит как это реализовать.

 

Выбор за ним...

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


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

и если хотите помочь человек ту надо что-то конкретнее чем "кака", "асинхронно"...

 

Мне кажется, что человеку надо больше делать телодвижений в самообразовании и почитать пару книг в первую очередь.

Но вопрос, по поводу где и что почитать не прозвучал, если не ошибаюсь.

А знания не дают, их берут.

 

Походу интереса к теме у ТС, кроме как сдачи лабораторки или зачета нет.

И все, что тут ему понаписывали успешно забудется после решения "вопроса".

Больше тратить время на эту тему не представляю возможным.

 

Всем успехов!

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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