16
Ôn tập PLD & ASIC Bài 1: điều khiển 8 LED sang dần và tắt hết từ trái sang phải entity BAI2_TR75 is Port ( CLR : in STD_LOGIC; CLK : in STD_LOGIC; Q : out STD_LOGIC_VECTOR (07 downto 0)); end BAI2_TR75; architecture Behavioral of BAI2_TR75 is begin PROCESS (CLK,CLR) VARIABLE QT: STD_LOGIC_VECTOR (7 DOWNTO 0); VARIABLE DEM: INTEGER RANGE 0 TO 10; BEGIN IF CLR='1' THEN QT:= X"00";DEM:=0; ELSIF CLK='1' AND CLK'EVENT THEN QT:='1'& QT(7 DOWNTO 1); DEM:=DEM+1; IF DEM=9 THEN QT:=X"00";DEM:=0; END IF; END IF; Q<= QT; END PROCESS; end Behavioral; Bài 2: điều khiển 8 LED sang dần và tắt hết từ phải sang trái, chân S lựa chọn chiều dịch entity BAI3_TR75_C2 is Port ( S : in STD_LOGIC; CLK : in STD_LOGIC; CLR : in STD_LOGIC; Q : out STD_LOGIC_VECTOR (07 downto 0)); end BAI3_TR75_C2; architecture Behavioral of BAI3_TR75_C2 is SIGNAL D: STD_LOGIC; begin PROCESS(CLK,CLR,S) VARIABLE QT: STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN IF CLR='1' THEN QT:= X"00"; ELSIF CLK='1' AND CLK'EVENT THEN IF S='0' THEN D<= NOT QT(7); QT:=QT(6 DOWNTO 0)& D; ELSE D<=NOT QT(0); QT:= D& QT(7 DOWNTO 1); END IF; END IF; Q<=QT; END PROCESS; end Behavioral; Bài 3: 8 led sáng dần lên và tắt hết phải sang trái và ngược lại entity BAI4_TRANG75 is

PLD & ASIC

Embed Size (px)

Citation preview

Page 1: PLD & ASIC

Ôn tập PLD & ASIC

Bài 1: điều khiển 8 LED sang dần và tắt hết từ trái sang phải

entity BAI2_TR75 is

Port ( CLR : in STD_LOGIC;

CLK : in STD_LOGIC;

Q : out STD_LOGIC_VECTOR (07 downto 0));

end BAI2_TR75;

architecture Behavioral of BAI2_TR75 is

begin

PROCESS (CLK,CLR)

VARIABLE QT: STD_LOGIC_VECTOR (7 DOWNTO 0);

VARIABLE DEM: INTEGER RANGE 0 TO 10;

BEGIN

IF CLR='1' THENQT:= X"00";DEM:=0;

ELSIF CLK='1' AND CLK'EVENT THEN

QT:='1'& QT(7 DOWNTO 1);

DEM:=DEM+1;

IF DEM=9 THEN QT:=X"00";DEM:=0;

END IF;

END IF;

Q<= QT;

END PROCESS;

end Behavioral;

Bài 2: điều khiển 8 LED sang dần và tắt hết từ phải sang trái, chân S lựa chọn chiều dịch

entity BAI3_TR75_C2 is

Port ( S : in STD_LOGIC;

CLK : in STD_LOGIC;

CLR : in STD_LOGIC;

Q : out STD_LOGIC_VECTOR (07 downto 0));

end BAI3_TR75_C2;

architecture Behavioral of BAI3_TR75_C2 is

SIGNAL D: STD_LOGIC;

begin

PROCESS(CLK,CLR,S)

VARIABLE QT: STD_LOGIC_VECTOR(7 DOWNTO 0);

BEGIN

IF CLR='1' THEN QT:= X"00";

ELSIF CLK='1' AND CLK'EVENT THEN

IF S='0' THEN

D<= NOT QT(7);

QT:=QT(6 DOWNTO 0)& D;

ELSE D<=NOT QT(0);

QT:= D& QT(7 DOWNTO 1);

END IF;

END IF;

Q<=QT;

END PROCESS;

end Behavioral;

Bài 3: 8 led sáng dần lên và tắt hết phải sang trái và ngược lại

entity BAI4_TRANG75 is

Port ( CLK : in STD_LOGIC;

CLR : in STD_LOGIC;

Q : out STD_LOGIC_VECTOR (07 downto 0));

end BAI4_TRANG75;

architecture Behavioral of BAI4_TRANG75 is

begin

PROCESS(CLK,CLR)

VARIABLE QT:STD_LOGIC_VECTOR (7 DOWNTO 0);

Page 2: PLD & ASIC

Ôn tập PLD & ASIC

VARIABLE DEM: INTEGER RANGE 0 TO 32;

BEGIN

IF CLR='1' THENQT:=X"00"; DEM:=0;

ELSIF CLK='1' AND CLK'EVENT THEN

IF DEM<16 THEN

QT:= QT(6 DOWNTO 0) & NOT QT(7);

ELSE QT:=NOT QT(0)& QT(7 DOWNTO 1);

END IF;

DEM:=DEM+1;

END IF;

IF DEM=32 THEN DEM:=0; END IF;

Q<=QT;

END PROCESS;

end Behavioral;

Bài 4:1 điểm sáng chạy từ trái sang phải sau do chạy từ phải sang trái

entity BAI7_TRANG75 is

Port ( CLK : in STD_LOGIC;

P : in STD_LOGIC;

RE : in STD_LOGIC;

Q : out STD_LOGIC_VECTOR (07 downto 0));

end BAI7_TRANG75;

architecture Behavioral of BAI7_TRANG75 is

begin

PROCESS(CLK,RE,P)

VARIABLE QT: STD_LOGIC_VECTOR(7 DOWNTO 0);

VARIABLE TAM: STD_LOGIC;

BEGIN

IF P='0' THEN --nút pause: nếu P=1 thì không làm gì

IF RE='0' THEN QT:="00000001";TAM:='0';

ELSIF CLK='1' AND CLK'EVENT THEN

IF TAM='0' THEN

QT:= QT(6 DOWNTO 0)& QT(7);

IF QT(7)='1' THEN TAM:='1'; END IF; ELSE -- TAM= ‘1’

QT:= QT(0) & QT(7 DOWNTO 1);

IF QT(0)='1' THEN TAM:='0'; END IF; END IF;

END IF; -- IF nút reset

END IF; -- IF nút pause

Q<=QT;

END PROCESS;

end Behavioral;

Note:Ban đầu gán cho QT:="00000001"; dùng biến TAM: TAM =0 thì dịch trái, sau khi dịch xong cho TAM=1. Có thể làm theo cách đếm số xung. Từ xung 1 8:dịch trái, từ 8 15 dịch phải, khi bằng 14 thì cho biến đếm =0.

IF DEM<8 THEN

QT:= QT(6 DOWNTO 0) & QT(7);

DEM:= DEM + 1;

ELSIF DEM >=8 AND DEM <15 THEN

QT:= QT(0) & QT(6 DOWNTO 0);

DEM:= DEM + 1;

END IF;

IF DEM=15 THEN DEM:= 0; END IF;

Bài 5: Điều khiển 16 led đơn như sau:

1 điểm sáng chạy từ phải sang trái sau đó chạy từ trái sang phải

Mạch sáng dần lên và tắt dần từ trái sang phải và ngược lại

Sáng dần từ ngoài vào trong và từ trong ra ngoài

entity BAI8_TRANG76 is

Port ( CLK : in STD_LOGIC;

Page 3: PLD & ASIC

Ôn tập PLD & ASIC

RE : in STD_LOGIC;

P : in STD_LOGIC;

Q : out STD_LOGIC_VECTOR (015 downto 0));

end BAI8_TRANG76;

architecture Behavioral of BAI8_TRANG76 is

BEGIN

PROCESS(CLK,RE,P)

VARIABLE QT: STD_LOGIC_VECTOR(15 DOWNTO 0);

VARIABLE TAM: STD_LOGIC;

VARIABLE DEM, DEM2: INTEGER RANGE 0 TO 100;

BEGIN

IF P='0' THEN

IF RE='0' THEN QT:=X"0001";TAM:='0';DEM:=0;DEM2:=0;

ELSIF CLK='1' AND CLK'EVENT THEN

IF DEM2<32 THEN – một led chạy

IF TAM='0' THEN

QT:= QT(14 DOWNTO 0)& QT(15);

DEM2:=DEM2+1;

IF QT(15)='1' THEN TAM:='1'; END IF;

ELSE QT:= QT(0) & QT(15 DOWNTO 1);

DEM2:=DEM2+1;

IF QT(0)='1' THEN TAM:='0';QT:=X"0000"END IF;

END IF;

ELSE -- sáng tắt dần phải sang trái

IF DEM<32 THEN

QT:= QT(14 DOWNTO 0) & NOT QT(15);

DEM:=DEM+1;

ELSIF DEM>=32 AND DEM<64 THEN

QT:= NOT QT(0)& QT(15 DOWNTO 1);

DEM:=DEM+1; -- sáng tắt dần trái sang phải

ELSIF DEM>=64 AND DEM<80 THEN –ngoài vào

QT(15 DOWNTO 8):= QT(14 DOWNTO 8) & NOT QT(15);

QT(7 DOWNTO 0):= NOT QT(0)& QT(7 DOWNTO 1);

DEM:=DEM+1;

ELSIF DEM>=80 AND DEM<96 THEN –trong ra

QT(15 DOWNTO 8):=NOT QT(8)& QT(15 DOWNTO 9) ;

QT(7 DOWNTO 0):= QT(6 DOWNTO 0)& NOT QT(7);

DEM:=DEM+1;

END IF;

IF DEM=96 THEN DEM:=0; DEM2:=0;QT:=X"0001"; END IF;

END IF; --IF của biến DEM2

END IF; --IF của biến RE

END IF; --IF của biến P

Q<=QT;

END PROCESS;

end Behavioral;

Bài 6:điều khiển 16 LED sáng tắt dần trái phải và ngược lại. Dùng phương pháp đếm số xung.

entity BAI4_TRANG75_16LED is

Port ( CLK : in STD_LOGIC;

CLR : in STD_LOGIC;

Q : out STD_LOGIC_VECTOR (015 downto 0));

end BAI4_TRANG75_16LED;

architecture Behavioral of BAI4_TRANG75_16LED is

begin

PROCESS(CLK,CLR)

VARIABLE QT:STD_LOGIC_VECTOR (15 DOWNTO 0);

VARIABLE DEM: INTEGER RANGE 0 TO 64;

BEGIN

Page 4: PLD & ASIC

Ôn tập PLD & ASIC

IF CLR='1' THENQT:=X"0000"; DEM:=0;

ELSIF CLK='1' AND CLK'EVENT THEN

IF DEM<32 THEN – sáng dần phải trái

QT:= QT(14 DOWNTO 0) & NOT QT(15);

DEM:=DEM+1;

ELSE – sáng dần trái phải

QT:= NOT QT(0)& QT(15 DOWNTO 1);

DEM:=DEM+1;

END IF;

IF DEM=64 THEN DEM:=0; END IF;

END IF;

Q<=QT;

END PROCESS;

end Behavioral;

Bài 7: điều khiển 30led.

entity BAI4_TRANG75_30LED is

Port ( CLK : in STD_LOGIC;

CLR : in STD_LOGIC;

Q : out STD_LOGIC_VECTOR (15 downto 0));

end BAI4_TRANG75_30LED;

architecture Behavioral of BAI4_TRANG75_30LED is

BEGIN

PROCESS(CLK,CLR)

VARIABLE QT1:STD_LOGIC_VECTOR (7 DOWNTO 0);

VARIABLE QT2:STD_LOGIC_VECTOR (7 DOWNTO 0);

VARIABLE DEM: INTEGER RANGE 0 TO 64;

BEGIN

IF CLR='1' THENQT1:=X"00"; DEM:=0;QT2:=X"00";

ELSIF CLK='1' AND CLK'EVENT THEN

IF DEM<16 THEN

QT1:= QT1(6 DOWNTO 0) & NOT QT1(7);

DEM:=DEM+1;

ELSIF DEM>16 AND DEM<32 THEN

QT2:= QT2(6 DOWNTO 0) & NOT QT2(7);

DEM:=DEM+1;

ELSIF DEM>32 AND DEM<64 THEN

QT1:= NOT QT1(0)& QT1(7 DOWNTO 1) ;

DEM:=DEM+1;

ELSE

QT2:= NOT QT2(0)& QT2(7 DOWNTO 1) ;

DEM:=DEM+1;

END IF;

IF DEM=64 THEN DEM:=0; END IF;

END IF;

Q<=QT2&QT1;

END PROCESS;

end Behavioral;

Bài 8:điều khiển 16 LED sáng tắt dần trái phải và ngược lại. Dùng nút nhấn. Nhấn lần 1: sáng tắt dần trái sang phải. Nhấn lần 2 :sáng tắt dần từ phải sang trái.

entity nut_nhan is

Port (BUTTON: in STD_LOGIC;

CLK : in STD_LOGIC;

CLR : in STD_LOGIC;

Q : out STD_LOGIC_VECTOR (15 downto 0));

end nut_nhan;

architecture Behavioral of nut_nhan is

begin

PROCESS(BUTTON,CLK,CLR)

Page 5: PLD & ASIC

Ôn tập PLD & ASIC

VARIABLE QT:STD_LOGIC_VECTOR (15 DOWNTO 0);

VARIABLE TAM: INTEGER RANGE 0 TO 10;

BEGIN

IF BUTTON=’1’ AND BUTTON’EVENT THEN

TAM:=TAM + 1;

IF TAM=2 THEN TAM:=0; END IF;

END IF;

IF CLR='1' THENQT:=X"0000";

ELSIF CLK='1' AND CLK'EVENT THEN

IF TAM=0 THEN – sáng dần phải trái

QT:= QT(14 DOWNTO 0) & NOT QT(15);

DEM:=DEM+1;

ELSE – sáng dần trái phải

QT:= NOT QT(0)& QT(15 DOWNTO 1);

DEM:=DEM+1;

END IF;

END IF;

Q<=QT;

END PROCESS;

end Behavioral;

Bài 9: thiết kế mạch giải mã 4-16 từ 4 mạch giải mã 2-4.

Entity GM4_16 IS

PORT ( A: IN STD_LOGIC_VECTOR(3 DOWNTO 0);

EN: IN STD_LOGIC;

O: OUT STD_LOGIC_VECTOR(15 DOWNTO 0));

END GM4_16;

ARCHITECTURE BEHAVIORAL OF GM4_16 IS

COMPONENT GM2_4

PORT ( I: IN STD_LOGIC_VECTOR(1 DOWNTO 0);

E: IN STD_LOGIC;

Q: IN STD_LOGIC_VECTOR(3 DOWNTO 0));

END COMPONENT;

SIGNAL S0,S1,S2,S3: IN STD_LOGIC;

BEGIN

U5: GM2_4 PORTMAP(I(0)=>A(2),I(1)=>A(3),E=>EN, Q(0) =>S0, Q(1) =>S1, Q(2) =>S2, Q(3) =>S3);

U4: GM2_4 PORTMAP(I(0)=>A(0),I(1)=>A(1),E=>S0, Q(0) =>O(0), Q(1) =>O(1), Q(2) =>O(2), Q(3) =>O(3));

U3: GM2_4 PORTMAP(I(0)=>A(0),I(1)=>A(1),E=>S1, Q(0) =>O(4), Q(1) =>O(5), Q(2) =>O(6), Q(3) =>O(7));

U4: GM2_4 PORTMAP(I(0)=>A(0),I(1)=>A(1),E=>S2, Q(0) =>O(8), Q(1) =>O(9), Q(2) =>O(10), Q(3) =>O(11));

U4: GM2_4 PORTMAP(I(0)=>A(0),I(1)=>A(1),E=>S3, Q(0) =>O(12), Q(1) =>O(13), Q(2) =>O(14), Q(3) =>O(5));

END BEHAVIORAL;

Bài 10: viết chương trình điều khiển 20 led như sau:sáng tắt dần từ phải sang trái và ngược lại. sáng tắt dần từ trong ra ngoài và ngược lại.chân E (mức cao) chân P (mức cao).

ENTITY DK_LED IS

PORT ( CLR,CLK,E,P: IN STD_LOGIC;

Q: OUT STD_LOGIC_VECTOR(19 DOWNTO 0));

END DK_LED;

ARCHITECTURE BEHAVIORAL OF DK_LED IS

BEGIN

PROCESS (CLR,CLK,E,P)

VARIABLE: DEM INTEGER RANGE 0 TO 200;

VARIABLE: QT STD_LOGIC_VECTOR(19 DOWNTO 0);

BEGIN

IF P=’1’ THEN

IF CLR=’0’ THEN QT:=(OTHERS=> ‘0’);DEM:=0;

Page 6: PLD & ASIC

Ôn tập PLD & ASIC

ELSIF CLK=’1’ AND CLK’EVENT THEN

IF DEM< 40 THEN

QT:= QT(18 DOWNTO 0) & QT(19);

ELSIF DEM>=40 AND DEM<80 THEN

QT:= QT(0) & QT(19 DOWNTO 0);

ELSIF DEM>=80 AND DEM<100 THEN

QT(9 DOWNTO 0):= QT(0)&QT(8 DOWNTO 0);

QT(19DOWNTO10):=QT(18DOWNTO10)&QT(19);

ELSIF DEM>=100 AND DEM<120 THEN

QT(9 DOWNTO 0):= QT(8 DOWNTO 0)&QT(9);

QT(19DOWNTO10):=QT(19)&QT(18DOWNTO10);

END IF;

DEM:=DEM+1;

IF DEM=120 THEN DEM:=0; END IF;

END IF;

END IF;

Q<=QT;

END PROCESS;

END BEHAVIORAL;

Bài 11: điều khiển 2 led chạy từ 2 phía vào va xuyên qua nhau

ENTITY DK_LED IS

PORT ( CLR,CLK,E,P: IN STD_LOGIC;

Q: OUT STD_LOGIC_VECTOR(19 DOWNTO 0));

END DK_LED;

ARCHITECTURE BEHAVIORAL OF DK_LED IS

BEGIN

PROCESS (CLR,CLK,E,P)

VARIABLE: QT1,QT2STD_LOGIC_VECTOR(9DOWNTO 0);

BEGIN

IF P=’1’ THEN

IF CLR=’0’ THEN QT1:=X”0000000001”; QT2:=X”1000000000”;

ELSIF CLK=’1’ AND CLK’EVENT THEN

QT1:= QT(8 DOWNTO 0) & QT(9);

QT2:= QT(0) & QT(8 DOWNTO 0);

END IF;

END IF;

Q<=QT2 & QT1;

END PROCESS;

END BEHAVIORAL;

Bài 12: mô tả mạch đếm có các chức năng sau: Đếm lên nhị phân 4bit, đếm xuống nhị phần 4 bit, BCD đếm lên, BCD đếm xuống

entity DEMTONGHOP is

Port ( CLK,CLR,E: in STD_LOGIC;

S: IN STD_LOGIC_VECTOR(1 DOWTO 0);

Q : out STD_LOGIC_VECTOR (03 downto 0));

end DEMTONGHOP;

architecture Behavioral of DEMTONGHOP is

begin

PROCESS(E,S,CLK,CLR)

VARIABLE QT:STD_LOGIC_VECTOR( 3 DOWNTO 0);

BEGIN

IF CLR='0' THENQT:="0000";

ELSIF E=’1’ THEN

IF CLK='1' AND CLK'EVENT THEN

CASE S IS

WHEN “00” => QT:=QT+1;

WHEN “01” => QT:=QT-1;

WHEN “10” => IF QT=”1010”THEN QT:=”0000”;

Page 7: PLD & ASIC

Ôn tập PLD & ASIC

ELSE QT:=QT+1; END IF;

WHEN “11” => IF QT=”1010”THEN QT:=”1001”;

ELSE QT:=QT-1; END IF;

WHEN OTHERS => NULL;

END CASE;

END IF;

END IF;

Q<=QT;

END PROCESS;

end Behavioral;

Bài 13: thiết kế chương trình đếm lên xuống 4bit, bit UD điều khiển đếm (0:up, 1:down),chân CLK,CLR

entity DEMUP_DOWN_4BIT is

Port ( CLK,CLR,UD : in STD_LOGIC;

Q : out STD_LOGIC_VECTOR (03 downto 0));

end DEMUP_DOWN_4BIT;

architecture Behavioral of DEMUP_DOWN_4BIT is

begin

PROCESS(UD,CLK,CLR)

VARIABLE QT:STD_LOGIC_VECTOR( 3 DOWNTO 0);

BEGIN

IF CLR='1' THENQT:="0000";

ELSIF CLK='1' AND CLK'EVENT THEN

IF UD='0' THEN QT:=QT+1;

IF QT=”1111”THEN QT:=”0000”; END IF;

ELSE QT:= QT-1;

IF QT=”0000”THEN QT:=”1111”; END IF;

END IF;

END IF;

Q<=QT;

END PROCESS;

end Behavioral;

Bài 14: đếm BCD_giải mã led

entity BCD_LED7SEG is

Port ( CLK : in STD_LOGIC;

CLR : in STD_LOGIC;

P : in STD_LOGIC;

Q : out STD_LOGIC_VECTOR (07 downto 0));

end BCD_LED7SEG;

architecture Behavioral of BCD_LED7SEG is

begin

PROCESS(CLK,CLR,P)

VARIABLE QT: STD_LOGIC_VECTOR(3 DOWNTO 0);

BEGIN

IF CLR='1' THEN QT:="0000";

ELSIF CLK='1' AND CLK'EVENT THEN

IF P='1' THEN QT:=QT+1;

IF QT="1010" THEN QT:="0000"; END IF;

END IF;

END IF;

CASE QT IS

WHEN "0000" => Q<= X"C0";

WHEN "0001" => Q<= X"F9";

WHEN "0010" => Q<= X"A4";

WHEN "0011" => Q<= X"B0";

WHEN "0100" => Q<= X"99";

WHEN "0101" => Q<= X"92";

WHEN "0110" => Q<= X"82";

WHEN "0111" => Q<= X"F8";

Page 8: PLD & ASIC

Ôn tập PLD & ASIC

WHEN "1000" => Q<= X"80";

WHEN "1001" => Q<= X"90";

WHEN OTHERS => Q<= X"FF";

END CASE;

END PROCESS;

end Behavioral;

Note: với các bài đếm giải mã led thì tương tự các bài đếm nhưng thêm phần giải mã 7đoạn cho biến QT,QCH,QDV…dùng hàm Case để giải mã. Tuy nhiên nên dùng Function hay Package để giải mã giúp chương trình sẽ gọn gàng hơn.

Bài 15: đếm 00_123, dùng Function giải mã

entity DEM00_123 is

Port ( CLR : in STD_LOGIC;

CLK : in STD_LOGIC;

P : in STD_LOGIC;

QTR,QCH,QDV:out STD_LOGIC_VECTOR (07 downto 0));

end DEM00_123;

architecture Behavioral of DEM00_123 is

FUNCTION GIAIMA (BCD:IN INTEGER) RETURNSTD_LOGIC_VECTORIS

VARIABLE SEG: STD_LOGIC_VECTOR(7 DOWNTO 0);

BEGIN giải mã dùng Function

CASE BCD IS

WHEN 0 => SEG:= X"C0";

WHEN 1 => SEG:= X"F9";

WHEN 2 => SEG:= X"A4";

WHEN 3 => SEG:= X"B0";

WHEN 4 => SEG:= X"99";

WHEN 5 => SEG:= X"92";

WHEN 6 => SEG:= X"82";

WHEN 7 => SEG:= X"F8";

WHEN 8 => SEG:= X"80";

WHEN 9 => SEG:= X"90";

WHEN OTHERS => SEG:= X"FF";

END CASE;

RETURN(SEG);

END GIAIMA;

begin

PROCESS(CLK,CLR,P)

VARIABLE TR,CH,DV: INTEGER RANGE 0 TO 10;

BEGIN

IF CLR='0' THENTR:=0;CH:=0;DV:=0;

ELSIF CLK='1'AND CLK'EVENT THEN

IF P='1' THEN DV:=DV+1;

IF DV=10 THEN DV:=0;CH:=CH+1;

IF CH=10THEN CH:=0;TR:=TR+1;END IF;

END IF;

END IF;

END IF;

IF TR=1 AND CH=2 AND DV=4 THEN

TR:=0; CH:=0; DV:=0; END IF;

QTR<=GIAIMA(TR);

QCH<=GIAIMA(CH);

QDV<=GIAIMA(DV);

END PROCESS;

end Behavioral;

Từ bài này về sau dùng function (giải mã anod chung)để giải mã, sử dụng chương trình in nghiêng trên

Page 9: PLD & ASIC

Ôn tập PLD & ASIC

Bài 16:đếm hiển thị trên 3 led 7đoạn, khi reset 3led hiện 000, có xung led1 đếm 0 – 9, sau đó lần lượt led2,3. Đếm tới 999 thì về 000.

entity DEM3LED_999 is

Port ( CLR,CLK,P : in STD_LOGIC;

QTR,QCH,QDV: out STD_LOGIC_VECTOR(07 downto 0));

end DEM3LED_999;

architecture Behavioral of DEM3LED_999 is

FUNCTION GIAIMA:SỬ DỤNG CHƯƠNG TRÌNH TRÊN

begin

PROCESS(CLK,CLR,P)

VARIABLE TAM,TR,CH,DV: INTEGER RANGE 0 TO 10;

BEGIN

IF CLR='0' THENTR:=0;CH:=0;DV:=0;TAM:=0;

ELSIF CLK='1' AND CLK'EVENT THEN

IF P='1' THEN

IF TAM=0 THEN DV:=DV+1;

IF DV=9 THEN TAM:=1;END IF;

ELSIF TAM=1THEN CH:=CH+1;

IF CH=9 THEN TAM:=2; END IF;

ELSIF TAM=2THEN TR:=TR+1;

IF TR=10 THEN TR:=0;CH:=0;DV:=0;TAM:=0;END IF;

END IF;

END IF;

END IF;

QTR<=GIAIMA(TR);

QCH<=GIAIMA(CH);

QDV<=GIAIMA(DV);

END PROCESS;

end Behavioral;

Bài 17: Cho tần số ngõ vào f= 1KHz, viết chương trình ngõ ra với 5bit đếm lên nhị phân với f= 1Hz, 8bit đếm vòng Johnson tần số 10Hz.

ENTITY CHIA_XUNG IS

PORT( CLR,CLK,E: IN STD_LOGIC;

Q: OUT STD_LOGIC_VECTOR(4 DOWNTO 0);

P: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));

END CHIA_XUNG;

ARCHITECTURE BEHAVIORAL OF CHIA_XUNG IS

BEGIN

PROCESS(CLK,CLR,E)

VARIABLE F1,F2:INTEGER RANGE 0 TO 1000;

VARIABLE QT: STD_LOGIC_VECTOR(5DOWNTO 0);

VARIABLE PT: STD_LOGIC_VECTOR(7DOWNTO 0);

BEGIN

IF CLR=’1’ THEN F1:=0;F2:=0;QT:=”00000”;PT:=”0000000”;

ELSIF E=’1’ THEN

IF CLK=’1’ AND CLK’EVENT THEN

F1:=F1+1;F2:=F2+1; CHIA XUNG

IF F1=1000 THEN F1:=0;QT:=QT+1;END IF;

IF F2=100 THEN F2:=0;

PT:=PT(6 DOWNTO 0) & NOT(PT(7));END IF;

END IF;

END IF;

P<=PT; Q<=QT;

END PROCESS;

END BEHAVIORAL;

Page 10: PLD & ASIC

Ôn tập PLD & ASIC

BÀI TẬP ĐẾM BẰNG CÁCH CHIA XUNG SỬ DỤNG FUNCTION GIẢI MÃ HIỆN THỊ BẰNG PHƯƠNG

PHÁP QUÉT

Bài 1:Đếm 00-99 hiển thị trên 2led 7đoạn,fvào= 10 KHz. Thường dùng tần số quét là 1KHz

entity dem00_99 is

Port ( CLK,CLR : in STD_LOGIC;

MA7 : out STD_LOGIC_VECTOR (07 downto 0);

MAQ : out STD_LOGIC_VECTOR (03 downto 0));

end dem00_99;

architecture Behavioral of dem00_99 is

FUNCTION GIAIMA(ĐOẠN CHƯƠNG TRÌNH GIAIMA)

begin

PROCESS(CLK,CLR)

VARIABLEQTDV,QTCH:STD_LOGIC_VECTOR(3DOWNTO 0);

VARIABLE FDEM,F: INTEGER RANGE 0 TO 100000;

VARIABLE FQUET: STD_LOGIC_VECTOR(1 DOWNTO 0);

BEGIN “CHIA XUNG ĐẾM VÀ QUÉT”

IF CLR=’1’ THEN QTCH:="0000";QTDV:="0000";FDEM:=0;F:=0;FQUET:="10";

ELSIF CLK='1' AND CLK'EVENT THEN

F:=F+1;

IF F=10 THEN

FQUET:=FQUET+1; -- FQUÉT=1 KHz

IF FQUET="10" THEN FQUET:="00"; END IF;

FDEM:=FDEM+1; F:=0;

IF FDEM=1000 THEN FDEM:=0; -- FĐẾM= 1Hz

QTDV:=QTDV+1;

IF QTDV="1010”THEN QTDV:="0000";QTCH:=QTCH+1;ENDIF;

IF QTCH="1010" THEN QTCH:="0000";QTDV:="0000"; END IF;

END IF;

END IF;

END IF;

CASE FQUET IS “QUÉT 2 LED”

WHEN "00" => MA7 <= GIAIMA(QTDV); MAQ <="1110";

WHEN "01" => MA7 <= GIAIMA(QTCH); MAQ <="1101";

WHEN OTHERS => MA7<=GIAIMA(QTCH); MAQ<="1100;

END CASE;

END PROCESS;

end Behavioral;

Bài 2:đếm 00_25 rồi quay ngược lại 25-00

entity dem00_25 is

Port ( CLK,CLR : in STD_LOGIC;

MA7 : out STD_LOGIC_VECTOR (07 downto 0);

MAQ : out STD_LOGIC_VECTOR (03 downto 0));

end dem00_25;

architecture Behavioral of dem00_25 is

FUNCTION GIAIMA(ĐOẠN CHƯƠNG TRÌNH GIAIMA)

begin

PROCESS(CLK,CLR)

VARIABLE QTDV,QTCH:STD_LOGIC_VECTOR(3DOWNTO 0);

VARIABLE TAM,FDEM,F: INTEGER RANGE 0 TO 100000;

VARIABLE FQUET :STD_LOGIC_VECTOR(1 DOWNTO 0);

BEGIN

IF CLR='0' THEN QTCH:="0000";QTDV:="0000";

FDEM:=0;F:=0;FQUET:="10";TAM:=0;

ELSIF CLK='1' AND CLK'EVENT THEN

F:=F+1;

IF F=10 THEN FQUET:=FQUET+1;

IF FQUET="10" THEN FQUET:="00"; END IF;

Page 11: PLD & ASIC

Ôn tập PLD & ASIC

F:=0; FDEM:=FDEM+1;

IF FDEM=500 THEN FDEM:=0;

IF TAM=0 THEN QTDV:=QTDV+1;

IF QTDV="1010"THEN QTDV:="0000";QTCH:=QTCH+1;ENDIF;

IF QTCH="0010" AND QTDV="0101"THEN TAM:=1; END IF;

ELSIF TAM=1 THEN QTDV:=QTDV-1;IF QTDV="1111" THEN

QTDV:="1001";QTCH:=QTCH-1;END IF;

IF QTCH="0000" AND QTDV="0000" THEN TAM:=0; END IF;

END IF;

END IF;

END IF;

END IF;

CASE FQUET IS

WHEN "00" => MA7 <= GIAIMA(QTDV); MAQ <="1110";

WHEN "01" => MA7 <= GIAIMA(QTCH); MAQ <="1101";

WHEN OTHERS => MA7<=GIAIMA(QTCH); MAQ<="1100";

END CASE;

END PROCESS;

end Behavioral;

Bài 3: quét phút giây trên 4 led 7 đoạn

entity PHUT_GIAY is

Port ( CLK.CLR : in STD_LOGIC;

MA7 : out STD_LOGIC_VECTOR (07 downto 0);

MAQ : out STD_LOGIC_VECTOR (03 downto 0));

end PHUT_GIAY;

architecture Behavioral of PHUT_GIAY is

FUNCTION GIAIMA(ĐOẠN CHƯƠNG TRÌNH GIAIMA)

begin

PROCESS(CLK,CLR)

VARIABLE FDEM,F,DVG,CHG,DVP,CHP:INTEGER RANGE 0 TO 100000;

VARIABLE FQUET :INTEGER RANGE 0 TO 10;

BEGIN

IF CLR='0' THEN CHG:=0;DVG:=0;DVP:=0;CHP:=0;

FDEM:=0;F:=0; MAQ<="0000";MA7<=X"FF";

ELSIF CLK='1' AND CLK'EVENT THEN

F:=F+1;

IF F=10 THEN

FQUET:=FQUET+1;

IF FQUET=4 THEN FQUET:=0; END IF;

FDEM:=FDEM+1; F:=0;

IF FDEM=1000 THEN FDEM:=0; DVG:=DVG+1;

IF DVG=10 THEN DVG:=0; CHG:=CHG+1;

IF CHG=6 THEN CHG:=0; DVP:=DVP+1;

IF DVP=10 THEN DVP:=0; CHP:=CHP+1;

IF CHP=6 THEN CHP:=0; END IF;END IF;

END IF;

END IF;

END IF;

END IF;

CASE FQUET IS

WHEN 0 => MA7 <= GIAIMA(DVG); MAQ <="1110";

WHEN 1 => MA7 <= GIAIMA(CHG); MAQ <="1101";

WHEN 2 => MA7<=GIAIMA(DVP); MAQ<="1011";

WHEN 3 => MA7<=GIAIMA(CHP); MAQ<="0111";

WHEN OTHERS => NULL;

END CASE;

END IF;

END PROCESS; end Behavioral;

Page 12: PLD & ASIC

Ôn tập PLD & ASIC

Bài 4: Đèn giao thông: CLR=0 thì xóa, Fvào=100Hz. X1=X2=15S; V1=V2=5S;Đ1=Đ2= 20S.

entity DENGIAOTHONG is

Port ( CLK,CLR : in STD_LOGIC;

Q : out STD_LOGIC_VECTOR (5 downto 0));

end DENGIAOTHONG;

architecture Behavioral of DENGIAOTHONG is

begin

PROCESS(CLK,CLR)

VARIABLE F,DEM: INTEGER;

BEGIN

IF CLR ='0' THEN F:=0; DEM:=0;Q<= "000000";

ELSIF CLK='1' AND CK'EVENT THEN F:= F+1;

IF F = 100 THEN F :=0; DEM := DEM +1;

IF DEM = 30 THEN DEM:=0; END IF;

END IF;

END IF;

IF (0 <= DEM) AND ( DEM <11) THEN

Q <= "100100"; -- XANH 1= DO2 = ON

ELSIF (11<= DEM) AND ( DEM <15) THEN

Q <= "010100"; -- VANG 1= DO 2 = ON

ELSIF (15<= DEM) AND ( DEM <25) THEN

Q <= "001001"; -- DO 1 = XANH 2 = ON

ELSIF (25<= DEM) AND ( DEM <30) THEN

Q <= "001010"; -- DO 1 = VANG 2 = ON

END IF;

END PROCESS;

end Behavioral;

Bài 5: Đếm chẳn lẻ theo thứ tự sau:0,2,4…14 1,3,5…15 0

entity DEM_CHANLE isPort ( CLK,CLR : in STD_LOGIC;

Q : out STD_LOGIC_VECTOR (3 downto 0));end DEM_CHANLE;architecture Behavioral of DEM_CHANLE is

beginPROCESS(CLK,CLR)VARIABLE QT: STD_LOGIC_VECTOR(3 DOWNTO 0);VARIABLE TAM: INTEGER RANGE 0 TO 1;BEGIN

IF CLR='0' THEN QT:= "0000"; TAM:=0;ELSIF CLK='1' AND CLK'EVENT THEN

IF TAM = 0 THENIF QT = "1110" THEN TAM:=1;QT:= "0001";ELSE QT:= QT + 2;END IF;

ELSIF TAM=1 THEN IF QT ="1111" THEN TAM:=0; QT:= "0001";ELSE QT:= QT + 2;END IF;

END IF;END IF;Q <= QT;

END PROCESS;end Behavioral;

Bài 6: Đếm 2 kênh. Kênh 1 đếm lên. Kênh 2 đém xuống. dùng sw chọn chế độ

entity BAITHI_TAM is

Port ( CLK,CLR,SW1,SW2 : in STD_LOGIC;

MA7 : out STD_LOGIC_VECTOR (03 downto 0);

MAQ : out STD_LOGIC_VECTOR (07 downto 0));

end BAITHI_TAM;

architecture Behavioral of BAITHI_TAM is

SIGNAL S : STD_LOGIC_VECTOR(1 DOWNTO 0);

begin

PROCESS(CLK,CLR,S)

VARIABLE QDV1,QCH1,QDV2,QCH2:STD_LOGIC_VECTOR(3 DOWNTO 0);

VARIABLE TAM,FDEM,F,DEM: INTEGER RANGE 0TO 100000;

VARIABLE FQUET :STD_LOGIC_VECTOR(1 DOWNTO 0);

BEGIN

S<= SW1&SW2;

Page 13: PLD & ASIC

Ôn tập PLD & ASIC

CASE (S) IS

WHEN "00" => TAM:= 0;

WHEN "01" => TAM:= 1;

WHEN "10" => TAM:= 2;

WHEN "11" => TAM:= 3;

WHEN OTHERS => NULL;

END CASE;

IF CLK='1' AND CLK'EVENT THEN

F:=F+1;

IF F=10 THEN FQUET:=FQUET+1;FDEM:=FDEM+1; F:=0;

IF FDEM=100 THEN FDEM:=0;

IF TAM=0 THEN QDV1:="0000";QDV2:="0000";

QCH1:="0000";QCH2:="0000";

ELSIF TAM=1 THEN QDV1:=QDV1+1;

IF QDV1="1010"THEN QDV1:="0000";

QCH1:=QCH1+1;

IF QCH1="1010" THEN QCH1:="0000"; END IF;

END IF;

ELSIF TAM=2 THEN QDV2:=QDV2-1;

IF QDV2="1111" THEN QDV2:= "1001";

QCH2:=QCH2-1;

IF QCH2="1111" THEN QCH2:="1001"; END IF;

END IF;

ELSIF TAM=3 THEN

QDV1:=QDV1+1;

IF QDV1="1010" THEN QDV1:="0000";

QCH1:=QCH1+1;

IF QCH1="1010" THEN QCH1:="0000"; END IF;END IF;

QDV2:=QDV2-1;

IF QDV2="1111" THEN QDV2:= "1001";

QCH2:=QCH2-1;

IF QCH2="1111" THEN QCH2:="1001"; END IF;

END IF;

END IF;

END IF;

END IF;

END IF;

CASE FQUET IS

WHEN "00" => MAQ <= GIAI_MA(QDV1); MA7 <="1110";

WHEN "01" => MAQ <= GIAI_MA(QCH1); MA7 <="1101";

WHEN "10" => MAQ <= GIAI_MA(QDV2); MA7 <="1011";

WHEN "11" => MAQ <= GIAI_MA(QCH2); MA7 <="0111";

WHEN OTHERS => NULL;

END CASE;

END PROCESS;

end Behavioral;

Bài 7: mạch đếm nhị phân 4bit theo thứ tự sau 115314 lặp lại

entity DEMTONGHOP is

Port ( CLR,CLK : in STD_LOGIC;

Q : out STD_LOGIC_VECTOR (03 downto 0));

end DEMTONGHOP;

architecture Behavioral of DEMTONGHOP is

begin

PROCESS(CLK,CLR)

VARIABLE QT: STD_LOGIC_VECTOR(3 DOWNTO 0);

VARIABLE TAM: INTEGER RANGE 0 TO 2;

BEGIN

IF CLR='0' THEN QT:= "0000"; TAM:=0;

Page 14: PLD & ASIC

Ôn tập PLD & ASIC

ELSIF CLK='1' AND CLK'EVENT THEN

IF TAM = 0 THEN

IF QT = "1111" THEN TAM:=1;

ELSE QT:= QT + 1; END IF;

ELSIF TAM=1 THEN QT:= QT - 1;

IF QT ="0011" THEN TAM:=2; END IF;

ELSIF TAM=2 THEN QT:= QT + 1;

IF QT ="1111" THEN TAM:=0; END IF;

END IF;

END IF;

Q <= QT;

END PROCESS;

end Behavioral;