资源描述
2009年EDA考试程序汇总(终极版)
信息工程学院2009年EDA考试
程序汇总(终极版)
制作人:柳阳
2009年6月23日
说明
1. 所有程序均来自上课及实验,无压题之意;
2. 所有程序均通过编译,波形仿真请自己完成;
3. 文字部分由于时间较紧,可能会有错误,望见谅;
4. 特别感谢王敏聪同学在程序方面给予的指导和帮助。
1.组合逻辑电路:
(1)半加器与全加器(原理图以及VHDL语言)
A.半加器
输入:2个二进制1位
输出:和输出S,进位Co
真值表:
A
B
S
Co
0
0
0
0
0
1
1
0
1
0
1
0
1
1
0
1
程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY HALFADD IS
PORT(
A,B: IN STD_LOGIC;
S,Co: OUT STD_LOGIC
);
END HALFADD;
ARCHITECTURE RTL OF HALFADD IS
BEGIN
S <= A XOR B;
Co <= A AND B;
END RTL;
原理图:
B.全加器
输入:2个二进制1位,一个进位输入Ci
输出:和输出S,进位Co
真值表:
A
B
Ci
S
Co
0
0
0
0
0
0
0
1
1
0
0
1
0
1
0
0
1
1
0
1
1
0
0
1
0
1
0
1
0
1
1
1
0
0
1
1
1
1
1
1
程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY FULLADD IS
PORT(
A,B,Ci: IN STD_LOGIC;
S,Co: OUT STD_LOGIC
);
END FULLADD;
ARCHITECTURE RTL OF FULLADD IS
COMPONENT HALFADD
PORT(A: IN STD_LOGIC;
B: IN STD_LOGIC;
S: OUT STD_LOGIC;
Co: OUT STD_LOGIC);
END COMPONENT;
SIGNAL T1,T2,T3: STD_LOGIC;
BEGIN
U1: HALFADD PORT MAP( A=>A,B=>B,S=>T1,CO=>T2);
U2: HALFADD PORT MAP( A=>CI,B=>T1,S=>S,CO=>T3);
Co <= T2 OR T3;
END RTL;
原理图:
A.分层开发
B.单层开发(课本P114)
(2)全减器(原理图以及VHDL语言)
输入:2个二进制1位,一个借位输入Ci
输出:差输出S,借位Co
真值表:
A
B
Ci
S
Co
0
0
0
0
0
0
0
1
1
1
0
1
0
1
1
0
1
1
0
1
1
0
0
1
0
1
0
1
0
0
1
1
0
0
0
1
1
1
1
1
程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY FULL_SUBB IS
PORT(
A,B,CI:IN STD_LOGIC;
S,CO:OUT STD_LOGIC
);
END FULL_SUBB;
ARCHITECTURE RTL OF FULL_SUBB IS
SIGNAL NA:STD_LOGIC;
BEGIN
NA<=NOT A;
S<=A XOR B XOR CI;
CO<=(NA AND CI) OR (B AND CI) OR (NA AND B);
END RTL;
原理图:
(3) 译码器
(以下程序均非译码器程序,具体译码器程序可参照数字钟4-7译码器程序)
A.2-4译码器
输入端口:2个二进制输入端a、b
输入端口:1个使能控制信号en
输出端口:4个译码输出端y0 — y3
真值表:
输入
输出
EN
A
B
Y3
Y2
Y1
Y0
0
×
×
Z
Z
Z
Z
1
0
0
0
0
0
1
1
0
1
0
0
1
0
1
1
0
0
1
0
0
1
1
1
1
0
0
0
程序:(程序为四选一选择器,真值表及原理图为2-4译码器)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY MUX4 IS
PORT(
Y0,Y1,Y2,Y3,A,B,EN:IN STD_LOGIC;
Q:OUT STD_LOGIC
);
END MUX4;
ARCHITECTURE RTL OF MUX4 IS
SIGNAL SEL:STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
SEL<=A & B;
PROCESS(SEL)
BEGIN
IF EN='0' THEN
Q<='Z';
ELSE
IF SEL="00" THEN Q<=Y0;
ELSIF SEL="01" THEN Q<=Y1;
ELSIF SEL="10" THEN Q<=Y2;
ELSIF SEL="11" THEN Q<=Y3;
END IF;
END IF;
END PROCESS;
END RTL;
原理图:
B.3-8译码器(程序为八选一选择器,真值表及原理图为3-8译码器)
输入端口:3个二进制输入端T0,T1,T2
输入端口:1个使能控制信号EN
输出端口:4个译码输出端A0 — A7
真值表:
输入
输出
EN
T2
T1
T0
A7
A6
A5
A4
A3
A2
A1
A0
0
×
×
×
Z
Z
Z
Z
Z
Z
Z
Z
1
0
0
0
0
0
0
0
0
0
0
1
1
0
0
1
0
0
0
0
0
0
1
0
1
0
1
0
0
0
0
0
0
1
0
0
1
0
1
1
0
0
0
0
1
0
0
0
1
1
0
0
0
0
0
1
0
0
0
0
1
1
0
1
0
0
1
0
0
0
0
0
1
1
1
0
0
1
0
0
0
0
0
0
1
1
1
1
1
0
0
0
0
0
0
0
程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY MUX8 IS
PORT(
A0,A1,A2,A3,A4,A5,A6,A7:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
T0,T1,T2,EN:IN STD_LOGIC;
Y:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END MUX8;
ARCHITECTURE RTL OF MUX8 IS
SIGNAL SEL:STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
SEL<=T2&T1&T0;
PROCESS(SEL)
BEGIN
IF EN='0' THEN
Y <= "ZZZZZZZZ";
ELSE
IF SEL="000" THEN Y<=A0;
ELSIF SEL="001" THEN Y<=A1;
ELSIF SEL="010" THEN Y<=A2;
ELSIF SEL="011" THEN Y<=A3;
ELSIF SEL="100" THEN Y<=A4;
ELSIF SEL="101" THEN Y<=A5;
ELSIF SEL="110" THEN Y<=A6;
ELSIF SEL="111" THEN Y<=A7;
END IF;
END IF;
END PROCESS;
END RTL;
(4)编码器
A.优先编码器(8-3)
真值表:
输入
输出
S
D0
D1
D2
D3
D4
D5
D6
D7
Q2
Q1
Q0
Gs
E0
1
×
×
×
×
×
×
×
×
1
1
1
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
0
0
×
×
×
×
×
×
×
0
0
0
0
0
1
0
×
×
×
×
×
×
0
1
0
0
1
0
1
0
×
×
×
×
×
0
1
1
0
1
0
0
1
0
×
×
×
×
0
1
1
1
0
1
1
0
1
0
×
×
×
0
1
1
1
1
1
0
0
0
1
0
×
×
0
1
1
1
1
1
1
0
1
0
1
0
×
0
1
1
1
1
1
1
1
1
0
0
1
0
0
1
1
1
1
1
1
1
1
1
1
0
1
程序:(真值表为优先编码器真值表,程序为普通编码器程序)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY i_encoder IS
PORT(
D:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
S: IN STD_LOGIC;
Gs,E0: OUT STD_LOGIC;
Q: OUT STD_LOGIC_VECTOR(2 DOWNTO 0)
);
END i_encoder ;
ARCHITECTURE RTL OF i_encoder IS
BEGIN
PROCESS(S,D)
BEGIN
IF (S='1') THEN
q <= "111";Gs <= '1';E0<= '1';
ELSIF (S='0') THEN
IF ( d = "11111111") THEN
q <= "111";Gs <= '1';E0 <= '0';
ELSIF ( d(7) = '0') THEN
q <= "000";Gs <= '0';E0 <= '1';
ELSIF ( d(6) = '0') THEN
q <= "001";Gs <= '0';E0 <= '1';
ELSIF ( d(5) = '0') THEN
q <= "010";Gs <= '0';E0 <= '1';
ELSIF ( d(4) = '0') THEN
q <= "011";Gs <= '0';E0 <= '1';
ELSIF ( d(3) = '0') THEN
q <= "100";Gs <= '0';E0 <= '1';
ELSIF ( d(2) = '0') THEN
q <= "101";Gs <= '0';E0 <= '1';
ELSIF ( d(1) = '0') THEN
q <= "110";Gs <= '0';e0 <= '1';
ELSIF ( d(1) = '0') THEN
q <= "111";Gs <= '0';e0 <= '1';
END IF;
END IF;
END PROCESS;
END RTL;
B.普通编码器(4-2)
程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY ENCODE42 IS
PORT(
EN:IN STD_LOGIC;
I:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
A,B:OUT STD_LOGIC);
END ENCODE42;
ARCHITECTURE RTL OF ENCODE42 IS
BEGIN
PROCESS(EN,I)
BEGIN
IF(EN='0') THEN A<='0';B<='0';
ELSE IF(I(0)='0') THEN A<='0';B<='0';
ELSIF(I(1)='0') THEN A<='0';B<='1';
ELSIF(I(2)='0') THEN A<='1';B<='0';
ELSIF(I(3)='0') THEN A<='1';B<='1';
END IF;
END IF;
END PROCESS;
END RTL;
(5)四选一选择器
输入端:4路输入,2bit选择信号,
输出端:1路输出
程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CHOSE IS
PORT(
S:IN STD_LOGIC_VECTOR(1 DOWNTO 0);
A,B,C,D: IN STD_LOGIC;
Q: OUT STD_LOGIC
);
END CHOSE;
ARCHITECTURE RTL OF CHOSE IS
BEGIN
PROCESS(S,A,B,C,D)
BEGIN
CASE S IS
WHEN "00" => Q <= A;
WHEN "01" => Q <= B;
WHEN "10" => Q <= C;
WHEN "11" => Q <= D;
WHEN OTHERS => NULL;
END CASE;
END PROCESS;
END RTL;
(6)三态门(原理图以及VHDL语言)
数据输入din,控制输入en
数据输出dout
真值表:
数据输入
控制输入
数据输出
X
0
Z
0
1
0
1
1
1
程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY TAI3 IS
PORT(
DIN,EN: IN STD_LOGIC;
DOUT: OUT STD_LOGIC
);
END TAI3;
ARCHITECTURE RTL OF TAI3 IS
BEGIN
PROCESS(DIN,EN)
BEGIN
IF EN='1' THEN
DOUT <= DIN;
ELSE
DOUT <= 'Z';
END IF;
END PROCESS;
END RTL;
状态图:
(7)单向总线缓冲器
输入:A_IN,使能端EN
输出:A_OUT
程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY TRI_GATE8 IS
PORT(
A_IN:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
EN:IN STD_LOGIC;
A_OUT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END TRI_GATE8 ;
ARCHITECTURE RTL OF TRI_GATE8 IS
BEGIN
PROCESS(EN,A_IN)
BEGIN
IF EN='0' THEN
A_OUT <= "ZZZZZZZZ";
ELSE
A_OUT <= A_IN;
END IF;
END PROCESS;
END RTL;
(8)双向总线缓冲器
双向端口:A B(inout)
使能端EN,
方向控制端DR
真值表:
EN
DR
功能
1
0
A<=B
1
1
B<=A
0
X
高阻
程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY BITRIBUS IS
PORT(
DR,EN:IN STD_LOGIC;
A,B:INOUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END BITRIBUS;
ARCHITECTURE RTL OF BITRIBUS IS
BEGIN
PROCESS(EN,DR,A,B)
BEGIN
IF(EN='0') THEN A<="ZZZZZZZZ";
ELSE IF(DR='0') THEN A<=B;
ELSE A<="ZZZZZZZZ";
END IF;
END IF;
END PROCESS;
PROCESS(EN,DR,A,B)
BEGIN
IF(EN='0') THEN B<="ZZZZZZZZ";
ELSE IF(DR='1') THEN B<=A;
ELSE B<="ZZZZZZZZ";
END IF;
END IF;
END PROCESS;
END RTL;
原理图:
(9)三人表决器
真值表:
输入
输出
A
B
C
Q
0
0
0
0
0
0
1
0
0
1
0
0
0
1
1
1
1
0
0
0
1
0
1
1
1
1
0
1
1
1
1
1
原理图:
(10)火灾报警系统,烟感、温感、紫外光感,两种以上探测器发出信号,系统产生报警(与(9)类似)
2.时序逻辑电路:
(1)D触发器
真值表:
数据输入D
时钟输入CLK
数据输出Q
×
0
不变
×
1
不变
0
↑
0
1
↑
1
程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DFF IS
PORT(
CLK,D:IN STD_LOGIC;
Q:OUT STD_LOGIC
);
END DFF;
ARCHITECTURE RTL OF DFF IS
BEGIN
PROCESS(CLK)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
Q <= D;
END IF;
END PROCESS;
END RTL;
(2)非同步复位的D锁存器
真值表:
数据D
时钟CLK
复位CLR
输出Q
×
×
0
0
×
0/1
1
不变
0
↑
1
0
1
↑
1
0
程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DFF IS
PORT(
CLK,CLR,D:IN STD_LOGIC;
Q:OUT STD_LOGIC
);
END DFF;
ARCHITECTURE RTL OF DFF IS
BEGIN
PROCESS(CLK,CLR)
BEGIN
IF CLR='0' THEN
Q<='0';
ELSE
IF CLK'EVENT AND CLK='1' THEN
Q <= D;
END IF;
END IF;
END PROCESS;
END RTL;
(3)同步复位的D锁存器
真值表:
数据D
时钟CLK
复位CLR
输出Q
×
↑
0
0
×
0/1
1
不变
0
↑
1
0
1
↑
1
0
程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DFF IS
PORT(
CLK,CLR,D:IN STD_LOGIC;
Q:OUT STD_LOGIC
);
END DFF;
ARCHITECTURE RTL OF DFF IS
BEGIN
PROCESS(CLK,CLR)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
IF CLR='0' THEN
Q<='0';
ELSE
Q <= D;
END IF;
END IF;
END PROCESS;
END RTL;
(4)异步复位/同步置位的D触发器
真值表:
输入
输出
数据D
时钟CLK
置位PSET
复位CLR
Q
×
×
×
0
0
×
↑
0
1
1
×
0/1
1
1
不变
0
↑
1
1
0
1
↑
1
1
1
程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY DFF_CLR IS
PORT(
CLK,CLR,PSET,D:IN STD_LOGIC;
Q:OUT STD_LOGIC);
END DFF_CLR;
ARCHITECTURE RTL OF DFF_CLR IS
BEGIN
PROCESS(CLK,CLR)
BEGIN
IF(CLR='0') THEN Q<='0';
ELSIF(CLK'EVENT AND CLK='1') THEN
IF(PSET='0') THEN Q<='1';
ELSE Q<=D;
END IF;
END IF;
END PROCESS;
END RTL;
(5)JK触发器
真值表:
数据输入D
J
K
时钟输入CLK
数据输出Q
0
0
0
↑
0
1
0
0
↑
1
0/1
0
1
↑
0
0/1
1
0
↑
1
0
1
1
↑
1
1
1
1
↑
0
程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DFF IS
PORT(
CLK,J,K,D:IN STD_LOGIC;
Q:OUT STD_LOGIC
);
END DFF;
ARCHITECTURE RTL OF DFF IS
BEGIN
PROCESS(CLK,J,K)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
IF J='0' AND K='0' THEN Q <= D;
ELSIF J='0' AND K='1' THEN Q <= '0';
ELSIF J='1' AND K='0' THEN Q <= '1';
ELSIF J='1' AND K='1' THEN Q <= NOT D;
END IF;
END IF;
END PROCESS;
END RTL;
(6)串行输入、串行输出寄存器
输入端:串行数据,时钟
输出端:数据
8位串行移位寄存器:在时钟信号的作用下,前级的数据向后级移动
程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CRCC IS
PORT(
CLK,D:IN STD_LOGIC;
Q:OUT STD_LOGIC
);
END CRCC;
ARCHITECTURE RTL OF CRCC IS
SIGNAL TEMP:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
PROCESS(CLK)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
TEMP(7)<=D;
TEMP(6 DOWNTO 0)<=TEMP(7 DOWNTO 1);
Q<=TEMP(0);
END IF;
END PROCESS;
END RTL;
(7)双向移位寄存器
真值表:
输入
输出
CLR
DIR
LOAD
CLK
Q7
Q6
Q5
Q4
Q3
Q2
Q1
Q0
0
×
×
×
0
0
0
0
0
0
0
0
1
×
0
↑
D7
D6
D5
D4
D3
D2
D1
D0
1
0
1
↑
左移一位
SL
1
1
1
↑
SH
右移一位
程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ly1 IS
PORT(
CLR,CLK,LOAD,DIR:IN STD_LOGIC;
SR,SL:IN STD_LOGIC;
D:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
Q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END ly1;
ARCHITECTURE RTL OF ly1 IS
SIGNAL TEMP:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
PROCESS(CLK,CLR)
BEGIN
IF CLR='0' THEN
TEMP<="00000000";
ELSIF CLK'EVENT AND CLK='1' THEN
IF LOAD='0' THEN
TEMP<=D;
ELSE
IF DIR='0' THEN --LEFT SHIFT
FOR I IN 0 TO 6 LOOP
TEMP(I+1)<=TEMP(I);
END LOOP;
TEMP(0)<=SL;
ELSE --RIGHT SHIFT
FOR I IN 0 TO 6 LOOP
TEMP(I)<=TEMP(I+1);
END LOOP;
TEMP(7)<=SR;
END IF;
END IF;
END IF;
END PROCESS;
Q<=TEMP;
END RTL;
(8)循环移位寄存器
真值表:
输入
输出
S2
S1
S0
LOAD
CLK
Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0
×
×
×
0
↑
D7 D6 D5 D4 D3 D2 D1 D0
0
0
0
1
↑
不循环,保持原值
0
0
1
1
↑
循环左移1位
0
1
0
1
↑
循环左移2位
0
1
1
1
↑
循环左移3位
1
0
0
1
↑
循环左移4位
1
0
1
1
↑
循环左移5位
1
1
0
1
↑
循环左移6位
1
1
1
1
↑
循环左移7位
程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ly2 IS
PORT(
CLK,LOAD:IN STD_LOGIC;
SNUM:IN STD_LOGIC_VECTOR(2 DOWNTO 0);
DIN:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
DOUT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END ly2;
ARCHITECTURE RTL OF ly2 IS
SIGNAL TEMP:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
PROCESS(CLK,SNUM)
BEGIN
IF(LOAD='0') THEN
TEMP<=DIN;
ELSIF( CLK'EVENT AND CLK='1') THEN
CASE SNUM IS
WHEN "000"=>DOUT <= TEMP;
WHEN "001"=>DOUT(7 DOWNTO 1) <= TEMP(6 DOWNTO 0);
DOUT(0)<=TEMP(7);
WHEN "010"=>DOUT(7 DOWNTO 2) <= TEMP(5 DOWNTO 0);
DOUT(1 DOWNTO 0)<=TEMP(7 DOWNTO 6);
WHEN "011"=>DOUT(7 DOWNTO 3) <= TEMP(4 DOWNTO 0);
DOUT(2 DOWNTO 0)<=TEMP(7 DOWNTO 5);
WHEN "100"=>DOUT(7 DOWNTO 4) <= TEMP(3 DOWNTO 0);
DOUT(3 DOWNTO 0)<=TEMP(7 DOWNTO 4);
WHEN "101"=>DOUT(7 DOWNTO 5) <= TEMP(2 DOWNTO 0);
DOUT(4 DOWNTO 0)<=TEMP(7 DOWNTO 3);
WHEN "110"=>DOUT(7 DOWNTO 6) <= TEMP(1 DOWNTO 0);
DOUT(5 DOWNTO 0)<=TEMP(7 DOWNTO 2);
WHEN "111"=>DOUT(7) <= TEMP( 0);
DOUT(6 DOWNTO 0)<=TEMP(7 DOWNTO 1);
WHEN OTHERS => DOUT<=TEMP;
END CASE;
END IF;
END PROCESS;
END RTL;
(9)带允许端的十二进制计数器
真值表:
输入
输出
CLR
EN
CLK
Qd
Qc
Qb
Qa
1
×
×
0
0
0
0
0
0
×
不变
0
1
↑
计数值加1
程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY COUNT12 IS
PORT(
CLR,CLK,EN:IN STD_LOGIC;
QD,QC,QB,QA:OUT STD_LOGIC
);
END COUNT12 ;
ARCHITECTURE RTL OF COUNT12 IS
SIGNAL CNT: STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
QD<=CNT(3);QC<=CNT(2);QB<=CNT(1);QA<=CNT(0);
PROCESS(CLK)
BEGIN
IF CLR='1' THEN
CNT<="0000";
ELSIF CLK'EVENT AND CLK='1' THEN
IF EN='1' THEN
IF CNT="1011" THEN
CNT<="0000";
ELSE
CNT<=CNT+'1';
END IF;
END IF;
END IF;
END PROCESS;
END RTL;
(10)6位二进制可逆计数器
真值表:
输入
输出
CLR
UPDN
CLK
Qf
Qe
Qd
Qc
Qb
Qa
1
×
×
0
0
0
0
0
0
0
1
↑
计数加1
0
0
↑
计数减1
程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ly3 IS
PORT(
CLR,CLK,UPDN:IN STD_LOGIC;
QF,QE,QD,QC,QB,QA:OUT STD_LOGIC
);
END ly3;
ARCHITECTURE RTL OF ly3 IS
SIGNAL CNT: STD_LOGIC_VECTOR(5 DOWNTO 0);
BEGIN
QF<=CNT(5);QE<=CNT(4);QD<=CNT(3);
QC<=CNT(2);QB<=CNT(1);QA<=CNT(0);
PROCESS(CLK)
BEGIN
IF CLR='1' THEN
CNT<="000000";
ELSIF CLK'EVENT AND CLK='1' THEN
IF UPDN='1' THEN
CNT<=CNT+'1';
ELSE
CNT<=CNT-'1';
END IF;
END IF;
END PROCESS;
END RTL;
(11)模十二分频器
程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ly4 IS
PORT(
CLK:IN STD_LOGIC;
Y:OUT STD_LOGIC
);
END ly4;
ARCHITECTURE behav OF ly4 IS
SIGNAL Q:INTEGER RANGE 0 TO 11;
SIGNAL f:STD_LOGIC;
BEGIN
PROCESS(clk)
BEGIN
展开阅读全文