編譯60進制計數器
① 用vhdl程序設計一個60進制(帶進位輸出)和12進制加法計數器(帶進位輸出)
這是60進制:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT10 IS
PORT (CLK,RST,EN : IN STD_LOGIC;
CQ : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
COUT : OUT STD_LOGIC );
END CNT10;
ARCHITECTURE behav OF CNT10 IS
BEGIN
PROCESS(CLK, RST, EN)
VARIABLE CQI : STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
IF RST = '1' THEN CQI := (OTHERS =>'0') ; --計數器非同步復位
ELSIF CLK'EVENT AND CLK='1' THEN --檢測時鍾上升沿
IF EN = '1' THEN --檢測是否允許計數(同步使能)
IF CQI < 9 THEN CQI := CQI + 1; --允許計數, 檢測是否小於9
ELSE CQI := (OTHERS =>'0'); --大於9,計數值清零
END IF;
END IF;
END IF;
IF CLK'EVENT AND CLK='1' THEN
IF CQI = 9 THEN COUT <= '1'; --計數大於9,輸出進位信號
ELSE COUT <= '0';
END IF;
END IF;
CQ <= CQI; --將計數值向埠輸出
END PROCESS;
END behav;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT6 IS
PORT (CLK1,RST1,EN1 : IN STD_LOGIC;
CQ1: OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
COUT1 : OUT STD_LOGIC );
END CNT6;
ARCHITECTURE behav OF CNT6 IS
BEGIN
PROCESS(CLK1, RST1, EN1)
VARIABLE CQI : STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
IF RST1 = '1' THEN CQI := (OTHERS =>'0') ; --計數器非同步復位
ELSIF CLK1'EVENT AND CLK1='1' THEN --檢測時鍾上升沿
IF EN1 = '1' THEN --檢測是否允許計數(同步使能)
IF CQI < 5 THEN CQI := CQI + 1; --允許計數, 檢測是否小於5
ELSE CQI := (OTHERS =>'0'); --大於5,計數值清零 END IF;
END IF;
END IF;
IF CLK1'EVENT AND CLK1='1' THEN
IF CQI = 5 THEN COUT1 <= '1'; --計數大於5,輸出進位信號
ELSE COUT1 <= '0';
END IF;
END IF;
CQ1 <= CQI; --將計數值向埠輸出
END PROCESS;
END behav;
LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL ;
ENTITY CNT60 IS
PORT ( CLK0,RST0,EN0 : IN STD_LOGIC;
COUT2: OUT STD_LOGIC;
LED1 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
LED2 : OUT STD_LOGIC_VECTOR(2 DOWNTO 0) );
END ;
ARCHITECTURE one OF CNT60 IS
COMPONENT CNT10
PORT (CLK,RST,EN : IN STD_LOGIC;
CQ : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
COUT : OUT STD_LOGIC );
END COMPONENT ;
COMPONENT CNT6
PORT (CLK1,RST1,EN1 : IN STD_LOGIC;
CQ1: OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
COUT1 : OUT STD_LOGIC );
END COMPONENT ;
SIGNAL COUT0:STD_LOGIC;
BEGIN
u1:CNT10 PORT MAP
(CLK=>CLK0,
RST=>RST0,
EN=>EN0,
COUT=>COUT0,
CQ=>LED1);
u2:CNT6 PORT MAP
(CLK1=>COUT0,
RST1=>RST0,
EN1=>EN0,
COUT1=>COUT2,
CQ1=>LED2);
END ARCHITECTURE one;
這是12進制:
LIBRARY IEEE;
use IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT12 IS
PORT(clk9,reset,en9:IN STD_LOGIC;
ut:out STD_LOGIC_VECTOR(5 DOWNTO 0));
END ENTITY CNT12;
ARCHITECTURE fun OF CNT12 IS
SIGNAL count:STD_LOGIC_VECTOR(5 DOWNTO 0);
BEGIN
ut<=count;
PROCESS(clk9,reset,en9)
BEGIN
IF(reset='1')THEN count<="000000"; --若reset=1,則非同步清零
ELSIF(clk9'event and clk9='1')THEN --否則,若clk上升沿到
IF en9='1' THEN
IF(count(3 DOWNTO 0)="1001")THEN --若個位計時恰好到"1001"即
IF(count<16#11#)THEN --11進制
count<=count+7; --若到11D則
else
count<="000000"; --復0
END IF;
ELSIF (count<16#11#)THEN --若未到11D,則count進1
count<=count+1;
ELSE --否則清零
count<="000000";
END IF;
END IF; --END IF(count(3 DOWNTO 0)="1001")
END IF; --END IF(reset='1')
END PROCESS;
END fun;
② 如何用74LS161晶元構成60進制計數器
用兩片74LS161晶元,一片控制個位,為十進制;另一片控制十位,為六進制。個位的最高位0,接十位的CP,個位十進制計數器經過十個脈沖循環一次,每當第十個脈沖來到後Q由1變為0,相當於一個下降沿,使十位六進制計數器計數。經過六十個脈沖,個位和十位計數器都恢復為0000。

(2)編譯60進制計數器擴展閱讀
計數器的分類
計數器主要由觸發器構成。若按觸發器 的翻轉的次序來分類,可以把計數器分為同 步式和非同步式。在同步計數器中,當計數脈 沖輸入時所有觸發器是同時翻轉的; 而在異 步計數器中,各級觸發器則不是同時翻轉 的。
若按計數過程中計數器中數字的增減來 分類,可以分為加法計數器,減法計數器和 可逆計數器(亦稱加減計數器)。加法計數器 是隨著計數脈沖的不斷輸入而遞增計數的; 減法計數器是隨著計數脈沖的不斷輸入而遞 減計數的;可增可減的稱可逆計數器。
③ 60 進制計數器怎麼算的
60進制計數器的演算法是滿60進1。
假設一個數是61,那麼60進制就是61/60=1。
由此可得61的60進制是11。

作用
在數字電子技術中應用的最多的時序邏輯電路。計數器不僅能用於對時鍾脈沖計數,還可以用於分頻、定時、產生節拍脈沖和脈沖序列以及進行數字運算等。但是並無法顯示計算結果,一般都是要通過外接LCD或LED屏才能顯示。
④ 用VHDL語言編寫程序:可逆的60進制計數器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT60 IS
PORT(CH,CLK,EN:IN STD_LOGIC;
DOUT:OUT STD_LOGIC_VECTOR(5 DOWNTO 0);
COUT:OUT STD_LOGIC);
END ENTITY CNT60;
ARCHITECTURE ONE OF CNT60 IS
BEGIN
PROCESS(CLK,EN,CH)
VARIABLE dd: STD_LOGIC_VECTOR(5 DOWNTO 0);
BEGIN
IF CLK'EVENT AND CLK='1' THEN
IF EN='1' THEN
IF CH='1' THEN
IF dd<60 THEN dd:=dd+1;
ELSE dd:="000000";
END IF;
IF dd=60 THEN COUT<='1';
ELSE COUT<='0';
END IF;
ELSE IF dd>0 THEN dd:=dd-1;
ELSE dd:="111100";
END IF;
IF dd=0 THEN COUT<='1';
ELSE COUT<='0';
END IF;
END IF;
END IF;
END IF;
DOUT<=dd;
END PROCESS;
END ARCHITECTURE ONE;
--EN為使能信號,高電平有效,CH可以選擇,為1時進行加,為0時進行減。
⑤ 用VHDL語言編寫BCD碼60進制加法計數器
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity counter60 is
port(rst,en,clk:in std_logic;
co:out std_logic;
q1:out std_logic_vector (2 downto 0);
q0:out std_logic_vector (3 downto 0)
);
end counter60;
architecture beh of counter60 is
signal q1_temp:std_logic_vector (2 downto 0);
signal q0_temp:std_logic_vector (3 downto 0);
begin
p0:process (rst,en,clk,q0_temp)
begin
if rst='0' then
q0_temp<=(others=>'0');
elsif en='1' then
if (clk'event and clk='1')then
if q0_temp<"1001" then q0_temp<=q0_temp+1;
else q0_temp<=(others=>'0');
end if;
end if;
end if;
end process;
p1:process (rst,en,clk,q0_temp,q1_temp)
begin
if rst='0' then
q1_temp<=(others=>'0');
elsif en='1' then
if (clk'event and clk='1')then
if q0_temp="1001" then
if q1_temp="101" then
q1_temp<=(others=>'0');
else q1_temp<=q1_temp+1;
end if;
end if;
end if;
end if;
end process;
p2:process (q0_temp,q1_temp)
begin
if (clk'event and clk='1')then
if q0_temp="1001" and q1_temp="101" then
co<='1';
else
co<='0';
end if;
end if;
end process;
q0<=q0_temp;
q1<=q1_temp;
end beh;
