60进制计数器的文本编译
‘壹’ 60 进制计数器怎么算的
60进制计数器的算法是满60进1。
假设一个数是61,那么60进制就是61/60=1。
由此可得61的60进制是11。
作用
在数字电子技术中应用的最多的时序逻辑电路。计数器不仅能用于对时钟脉冲计数,还可以用于分频、定时、产生节拍脉冲和脉冲序列以及进行数字运算等。但是并无法显示计算结果,一般都是要通过外接LCD或LED屏才能显示。
‘贰’ 用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;
‘叁’ 用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时进行减。
‘肆’ 编程实现60进制的计数器,要求带复位清零,用CLR表示,高电平有效,输出带进位端,用CO表示
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity counter60 is
port(clk,clr:in std_logic;
c:out std_logic;
bcd1:out std_logic_vector(3 downto 0);
bcd2:out std_logic_vector(3 downto 0));
end counter60;
architecture rtl of counter60 is
signal bcd1n:std_logic_vector(3 downto 0):="0000";
signal bcd2n:std_logic_vector(3 downto 0):="0000";
signal cn:std_logic:='1';
begin
bcd1<=bcd1n;
bcd2<=bcd2n;
c<=cn;
process(clk,clr)
begin
if(clr='1') then
bcd1n<="0000";
else
if(clk'event and clk='0') then
if(bcd1n="1001") then
bcd1n<="0000";
else bcd1n<=bcd1n+1;
end if;
end if;
end if;
end process;
process(clk,clr)
begin
if(clr='1') then
bcd2n<="0000";
else
if(clk'event and clk='0') then
if(bcd1n="1001") then
if(bcd2n="0101") then
bcd2n<="0000";
else bcd2n<=bcd2n+1;
end if;
end if;
end if;
end if;
end process;
process(clk)
begin
if(clk'event and clk='0') then
if(bcd1n="1001" and bcd2n="0101") then
cn<='0';
else cn<='1';
end if;
end if;
end process;
end rtl;
‘伍’ 用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;