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

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

Добрый день. Счетчик состоит из 4 триггеров. После состояния 1010, счетчик должен сброситься в 0000, но вместо этого триггеры устанавливаются в значения 1111, и только потом в 0000. Как это можно исправить?

 

Ещё вопросы:

- Может ли Квартус по составленной схеме выдать свой вариант описания её в коде?

- Можно ли симулировать файлы bdf в моделсим?

 

post-77128-1384249544_thumb.jpg

 

post-77128-1384249624_thumb.png

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


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

А зачем вы влепили инверторы на выходах триггеров? Из за них оно и сбрасывается в 1111

 

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


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

Нет, напрямую схематик-файлы в моделсим загонять нельзя.

 

Есть генерация кода через меню File -> Create -> Create HDL Design File. Но все триггера и прочие элементы вставятся как компоненты. Кроме того, функция часто глючит, связи между компонентами нужно проверять.

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


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

Если не хотите проблем собирайте синхронный счетчик на D тригерах. В вашей схеме полно гонок, и срабатывание сброса непредсказуемо.

Кроме того тригера в вашей схеме переключаются по фронту(нарастанию) такта и счетчик получается вычитающий.

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


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

в том то и дело, что необходимо построить его именно на JK-триггерах. Как можно составляя схему указать, что триггеры должны переключаться по спаду?

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


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

XVR, иначе счетчик получается вычитающий

Поставьте инверторы на входы С триггеров.

 

PS. Если вы действительно собираетесь это реализовывать в FPGA, то эта схема не пойдет - делайте синхронный дизайн (как MaslovVG сказал).

 

в том то и дело, что необходимо построить его именно на JK-триггерах.
Синхронный дизайн никак не помешает применить JK триггера. Тем более, что сейчас у вас фактически не JK триггера, а T триггера - вы же им J и K входы намертво в '1' поставили.

 

Кстати, вам нужен схематик, или HDL описание? Второе здесь текстом написать можно, а схему вам далеко не каждый сможет подсказать, т.к. не у всех есть редактор схем под рукой :rolleyes:

 

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


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

Ещё вопросы:

- Может ли Квартус по составленной схеме выдать свой вариант описания её в коде?

- Можно ли симулировать файлы bdf в моделсим?

Называется "сделай то, не знаю что"...

Если говорить о HDL, то ни о каких JK триггерах и речи быть не может... Текстом написали и все, остальное компилятор сделает сам... Или же пишите статический автомат, убирайте птичку "one-hot" и все дела.. В Квартусе берите темплейты, там уже все заготовки сделаны... И будет Вам моделсим...

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


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

Все, буду писать код, только странно использовать в нем регистр state - счетчик в счетчике получается. Так, наверно, делать нельзя? И если описан один триггер, то как соединить все между собой? Создавать экземпляры модулей?

 

module JK_Counter
(
input rst,clk,J,K,
output reg Q,
output wire Qinv,

output reg [3:0] state,
output reg Q1,
output reg Q2,
output reg Q3
); 

assign Qinv=~Q;

always@(posedge rst or posedge clk)
if (rst)
    state=0;
    else
       case (state)
      10:
         state=0;
default:state=state+1;
endcase

always@(posedge clk) 
  if (state==0)
    Q=0;
      else if (state<11)
       Q=(J&~Q)|(~K&Q); 
   
endmodule

 

 

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


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

Все, буду писать код, только странно использовать в нем регистр state - счетчик в счетчике получается. Так, наверно, делать нельзя? И если описан один триггер, то как соединить все между собой? Создавать экземпляры модулей?

 

Хотелось бы посоветовать! Вы когда создаете устройства в схемотехническом редакторе - Вы мыслите триггерами, логическими элементами и т.д. и т.п. А когда Вы описываете принцип работы устройства используя языки описания аппаратуры было бы правельней если Вы абстрагируйтесь от классических модулей счетчиков, триггеров.

Просто дело в том, что есть категория людей которая описывает не принцип работы, а СХЕМУ....просто повторяют нарисованное при помощи конструкция языка. Наверное это бесмысленно. Подумайте, возможно этот опыт будет Вам полезен.

 

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


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

на hdl такой счетчик займет пару строк описания. xilinx в встроенной справке дает готовые шаблоны любых блоков на vhdl/verilog. достаточно выбрать подходящий и слегка изменить. например на простейший счетчик выдает такой шаблон:

process (<clock>) 
begin
   if <clock>='1' and <clock>'event then
         <count> <= <count> + 1;
   end if;
end process;

ваш будет выглядеть как-то так:

process (clock) 
begin
   if clock='0' and clock'event then
      if q="1010" then
        q <= "0000";
    else
         q <= q + 1;
      end if;
   end if;
end process;

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


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

Все, буду писать код, только странно использовать в нем регистр state - счетчик в счетчике получается. Так, наверно, делать нельзя? И если описан один триггер, то как соединить все между собой? Создавать экземпляры модулей?
Вам нужен именно счетчик на JK триггерах? Если да, то описывайте JK триггер модулем, а потом собирайте из них счетчик. Если нужен просто HDL счетчик от 0 до 10, то и пишите его, как ZASADA советовал.

 

 

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


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

на hdl такой счетчик займет пару строк описания. xilinx в встроенной справке дает готовые шаблоны любых блоков на vhdl/verilog. достаточно выбрать подходящий и слегка изменить. например на простейший счетчик выдает такой шаблон:

process (<clock>) 
begin
   if <clock>='1' and <clock>'event then
         <count> <= <count> + 1;
   end if;
end process;

ваш будет выглядеть как-то так:

process (clock) 
begin
   if clock='0' and clock'event then
      if q="1010" then
        q <= "0000";
    else
         q <= q + 1;
      end if;
   end if;
end process;

 

 

 

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

 

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


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

Можно типа так:

 

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.STD_LOGIC_UNSIGNED.ALL; 

entity codecounter is 
    Generic 
    ( 
        --размерность счетчиа 
        code_width     : integer := 16 
    ); 
  Port  
  ( 
        -- входной клок     
        clk         : in std_logic; 
        -- глобальный сброс  
        clr         : in std_logic;   
        -- код 
    code_in         : in std_logic_vector(code_width - 1 downto 0);  
        -- выход  
    cnt_out         : out std_logic  
  ); 
end entity codecounter; 

architecture behavioural of codecounter is 

    signal s_cnt_out             : std_logic;      
    signal s_div                     : std_logic_vector (code_width - 1 downto 0);      
     
begin 

-------------------------------------------------------------------- 
-- делитель управляемый кодом 
-------------------------------------------------------------------- 
process (clk, clr) 
begin 
    if clr = '0' then 
        s_div <= (others => '0'); 
        s_cnt_out <= '0'; 
    elsif clk'event and clk = '1' then 
        s_div <= s_div - 1; 
        -- сравнение текущего состояния с кодом 
        if s_div = 0 then  
            s_div <= code_in - 1; 
            -- перенос 
            s_cnt_out <= '0'; 
        else     
            s_cnt_out <= '1'; 
        end if; 
    end if; 

end process; 

    -- выход 
    cnt_out <= s_cnt_out; 

end behavioural;

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


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

Если не хотите проблем собирайте синхронный счетчик на D тригерах. В вашей схеме полно гонок, и срабатывание сброса непредсказуемо.

Кроме того тригера в вашей схеме переключаются по фронту(нарастанию) такта и счетчик получается вычитающий.

А по моему схема синхронная...

Если конечно описать выход каждого флопа как generated_clock....

 

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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