PLD & ASIC
Transcript of 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);
Ô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;
Ô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
Ô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)
Ô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;
Ô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”;
Ô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";
Ô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
Ô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;
Ô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;
Ô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;
Ô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;
Ô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;
Ô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;