📌  相关文章
📜  同步 3 位向上向下计数器(1)

📅  最后修改于: 2023-12-03 14:50:40.597000             🧑  作者: Mango

同步 3 位向上向下计数器

在数字电路中,计数器通常用于计数、时间测量和控制。同步计数器是由若干种触发器以特定的方式连接而成的,能够实现数字计数。本文将介绍同步 3 位向上向下计数器的实现方法。

实现原理

同步 3 位向上向下计数器是通过三个 JK 触发器以及若干个与门和反相器连接而成的。这个计数器能够对 0~7 的整数进行计数,当计数器到达 0 或 7 时,能够切换计数方向。

JK 触发器

JK 触发器是一种常用的有记忆能力的触发器,常常在数字电路中使用。JK 触发器有两个输入端 J 和 K,以及两个输出端 Q 和 Q'。当 J 和 K 输入均为 1 时,JK 触发器将锁存并且输出反转。当 J 和 K 输入为 0 时,JK 触发器保持不变。当 J 和 K 输入不同的时候,JK 触发器执行翻转动作。

实现步骤
  1. 计数器初始状态为 000,Q1、Q2、Q3 输出均为 0。
  2. 当计数器为 0 时,Q1、Q2、Q3 输出均为 0。此时与门 A、B、C 的输出均为 1,反相器 D、E、F 的输出均为 0。此时 JK 触发器的 J、K 输入均为 0,不做任何改变。
  3. 当计数器为 1 时,Q1 输出变为 0,Q2、Q3 输出均为 0。此时与门 A、B 的输出均为 0,与门 C 的输出为 1,反相器 D、E 输出变成 1。此时 JK 触发器的 J、K 输入为 1,执行翻转动作,输出 01。
  4. 当计数器为 2 时,Q1 输出变为 1,Q2、Q3 输出均为 0。此时与门 A、B、C 的输出均为 0,反相器 D、E、F 的输出均为 1。此时 JK 触发器的 J、K 输入为 0,保持现有状态。
  5. 当计数器为 3 时,Q1、Q2 输出均变成 0,Q3 输出为 1。此时与门 A、B 的输出均为 1,与门 C 的输出为 0,反相器 E、F 的输出变成 0。此时 JK 触发器的 J、K 输入为 1,执行翻转动作,输出 10。
  6. 当计数器为 4 时,Q1 输出变成 0,Q2 输出为 1,Q3 输出为 0。此时与门 A、C 的输出均为 0,与门 B 的输出为 1,反相器 D、F 的输出变成 1。此时 JK 触发器的 J、K 输入为 0,保持现有状态。
  7. 当计数器为 5 时,Q1、Q2 输出均变成 1,Q3 输出为 0。此时与门 A、C 的输出均为 0,与门 B 的输出为 1,反相器 D、E、F 的输出均为 0。此时 JK 触发器的 J、K 输入为 1,执行翻转动作,输出 11。
  8. 当计数器为 6 时,Q1 输出变成 0,Q2、Q3 输出均为 1。此时与门 A、B、C 的输出均为 0,反相器 D、E、F 的输出均为 1。此时 JK 触发器的 J、K 输入为 0,保持现有状态。
  9. 当计数器为 7 时,Q1、Q2、Q3 输出均为 1。此时与门 A、B、C 的输出均为 1,反相器 D、E、F 的输出均为 0。此时 JK 触发器的 J、K 输入均为 1,执行翻转动作,输出 00。
代码实现

下面是同步 3 位向上向下计数器的 VHDL 代码实现:

library ieee;
use ieee.std_logic_1164.all;

entity up_down_counter is
  port (
    clk : in std_logic;         -- 时钟信号
    up_down : in std_logic;     -- 计数方向
    out_cnt : out std_logic_vector (2 downto 0)  -- 输出计数器的值
  );
end entity up_down_counter;

architecture behavioral of up_down_counter is
  signal cnt : std_logic_vector (2 downto 0) := (others => '0');   -- 计数器寄存器
begin
  process (clk)
  begin
    if rising_edge(clk) then
      if up_down = '1' then      -- 向上计数
        case cnt is
          when "000" =>
            cnt <= "001";
          when "001" =>
            cnt <= "010";
          when "010" =>
            cnt <= "011";
          when "011" =>
            cnt <= "100";
          when "100" =>
            cnt <= "101";
          when "101" =>
            cnt <= "110";
          when "110" =>
            cnt <= "111";
          when "111" =>
            cnt <= "000";
        end case;
      else                      -- 向下计数
        case cnt is
          when "000" =>
            cnt <= "111";
          when "001" =>
            cnt <= "000";
          when "010" =>
            cnt <= "001";
          when "011" =>
            cnt <= "010";
          when "100" =>
            cnt <= "011";
          when "101" =>
            cnt <= "100";
          when "110" =>
            cnt <= "101";
          when "111" =>
            cnt <= "110";
        end case;
      end if;
    end if;
    out_cnt <= cnt;             -- 输出计数器的值
  end process;
end architecture behavioral;
总结

同步 3 位向上向下计数器是通过三个 JK 触发器以及若干个与门和反相器连接而成的。它具有简单、可靠、稳定等优点,可以广泛应用于数字电路中。