P. 1
Ngon Ngu Lap Trinh Phan Cung (VHDL)

Ngon Ngu Lap Trinh Phan Cung (VHDL)

|Views: 1,016|Likes:
Được xuất bản bởimuathutocrung

More info:

Published by: muathutocrung on Mar 17, 2010
Bản quyền:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

06/12/2013

pdf

text

original

Sections

M cl c

Trang
M c l c.............................................................................................................- 0 Danh m c hình: ...............................................................................................- 2 Danh m c b ng:...............................................................................................- 4 Chương 1: Gi i thi u .......................................................................................- 5 1.1. Gi i thi u v VHDL..........................................................................- 5 1.2. Gi i thi u công ngh (và ng d ng) thi t k m ch b ng VHDL. ...- 6 1.2.1 ng d ng c a công ngh thi t k m ch b ng VHDL ...................- 6 1.2.2 Quy trinh thi t k m ch b ng VHDL. ..........................................- 6 1.2.3. Công c EDA..............................................................................- 7 1.2.4. Chuy n mã VHDL vào m ch.......................................................- 8 Chương 2. C u trúc mã .................................................................................- 11 2.1. Các ơn v VHDL cơ b n. ..............................................................- 11 2.2. Khai báo Library............................................................................- 11 2.3. Entity ( th c th ).............................................................................- 13 2.4. ARCHITECTURE ( c u trúc). ......................................................- 13 2.5. Các ví d m u............................................................................- 16 Chương 3: Ki u d li u .................................................................................- 19 3.1. Các ki u d li u ti n nh nghĩa. ...................................................- 19 3.2. Các ki u d li u ngư i dùng nh nghĩa........................................- 22 3.3. Các ki u con (Subtypes). ................................................................- 22 3.4. M ng (Arrays). ...............................................................................- 23 3.5. M ng c ng ( Port Array)................................................................- 26 3.6. Ki u b n ghi (Records)...................................................................- 27 3.7. Ki u d li u có d u và không d u ( Signed and Unsigned). .........- 27 3.8. Chuy n i d li u..........................................................................- 28 3.9. Tóm t t. ...............................................................................................- 30 3.10. Các ví d . ...........................................................................................- 30 Chương 4: Toán t và thu c tính. .................................................................- 35 4.1. Toán t ............................................................................................- 35 4.1.1 Toán t gán. .............................................................................- 35 4.1.2 Toán t Logic. ..........................................................................- 35 4.1.3 Toán t toán h c.......................................................................- 35 4.1.4 Toán t so sánh. .......................................................................- 36 4.1.5 Toán t d ch. ............................................................................- 36 4.2. Thu c tính.......................................................................................- 36 4.1.1. Thu c tính d li u.....................................................................- 36 4.1.2. Thu c tính tín hi u. ...................................................................- 37 4.3. Thu c tính ư c nh nghĩa b i ngư i dùng.................................- 37 4.4. Ch ng toán t . ................................................................................- 37 4.5. GENERIC.......................................................................................- 38 4.6. Ví d .....................................................................................................- 38 Chương 5: Mã song song ...............................................................................- 43 5.1. Song song và tu n t . .....................................................................- 43 5.1.1. M ch t h p và m ch dãy. ........................................................- 43 5.1.2. Mã song song và mã tu n t . ....................................................- 43 5.2. S d ng các toán t . .......................................................................- 44 5.3. M nh WHEN. ............................................................................- 45 -

ThiÕt kÕ vi m¹ch b»ng VHDL
5.4. GENERATE. ..................................................................................- 51 5.5. BLOCK. ..........................................................................................- 52 5.5.1. Simple BLOCK .........................................................................- 52 5.5.2. Guarded BLOCK ......................................................................- 53 Chương 6: Mã tu n t ...................................................................................- 55 6.1. PROCESS .......................................................................................- 55 6.2. Signals và Variables. ......................................................................- 56 6.3. IF. ....................................................................................................- 56 6.4. WAIT. .............................................................................................- 58 6.5. CASE...............................................................................................- 61 6.6. LOOP..............................................................................................- 65 6.7. Bad Clocking. .................................................................................- 70 6.8. S d ng mã tu n t thi t k các m ch t h p. .........................- 72 Chương 7: Signal và Variable .......................................................................- 75 7.1. CONSTANT. ..................................................................................- 75 7.2. SIGNAL. .........................................................................................- 75 7.3. VARIABLE ....................................................................................- 77 7.4. S thanh ghi. ...................................................................................- 83 Chương 8: Máy tr ng thái.............................................................................- 92 8.1. Gi i thi u. .......................................................................................- 92 8.2. Thi t k theo ki u 1 (thi t k theo mô hình may moore)...............- 93 8.3. Thi t k ki u 2. ...............................................................................- 99 8.4. Ki u mã hoá: t nh phân sang Onehot.......................................- 109 Chương 9: Thi t k thêm các m ch.............................................................- 111 9.1. Barrel Shifter................................................................................- 111 9.2. B so sánh không d u và có d u. .................................................- 113 9.3. B c ng Carry Ripple và b c ng Carry Look Ahead. ...............- 115 9.4. B chia d u ch m tĩnh..................................................................- 119 9.5. B i u khi n máy bán hàng. .......................................................- 122 9.6. B nh n d li u n i ti p. ..............................................................- 125 9.7. B chuy n song song thành n i ti p.............................................- 127 9.8. Trò chơi trên led 7 thanh. ............................................................- 128 9.9. B phát tín hi u. ...........................................................................- 131 9.10. Thi t k b nh . ........................................................................- 133 Tài li u tham kh o:......................................................................................- 138 Phân công công vi c:............................................ Error! Bookmark not defined.

-1-

ThiÕt kÕ vi m¹ch b»ng VHDL Danh m c hình:
Trang
Hình 1.1. Tóm t t quy trình thi t k VHDL .............................................- 7 Hinh 1.2.a. Sơ t ng quát v b c ng y .......................................- 8 Hình 1.2.b. B ng chân lý c a b c ng y .........................................- 8 Hình 1.3. Mã thi t k b c ng.................................................................- 9 Hình 1.4.a.Các ví d v sơ m ch có th có ng v i mã như hình 1.3..- 9 Hình 1.4.b: K t qu mô ph ng b c ng ư c thi t k theo hình 1.3 ......- 10 Hình 2.2: Các ph n cơ b n c a m t Library.........................................- 12 Hình 2.3. Các ch tín hi u Hình 2.4. C ng NAND ..........- 13 Hình 2.5.a. Sơ c a trigo RS ............................................................- 15 Hình 2.5.b. Sơ c a DFF không ng b ...........................................- 17 Hình 2.6: K t qu mô ph ng c a ví d 2.1............................................- 17 Hình 2.7. DFF k t h p v i c ng NAND ................................................- 18 Hình 2.8. K t qu mô ph ng c a ví d 2.2 ............................................- 18 Hình 3.1: Minh h a scalar (a), 1D (b), 1Dx1D (c), và 2D (d) ...............- 23 Hình 3.2. M ch ư c suy ra t mã c a v í d 3.2.................................- 33 Hình 3.2.a. K t qu mô ph ng cho o n mã 1c a ví d 3.2 ..................- 33 Hình 3.2.b. K t qu mô ph ng cho o n mã 1c a ví d 3.2 ..................- 33 Hình 3.3. B c ng 4 bit cho ví d 3.3....................................................- 33 Hình 3.4 K t qu mô ph ng cho ví d 3.3 .............................................- 34 Hình 4.1. B mã hoá cho ví d 4.1........................................................- 39 Hình 4.2 Mô ph ng k t qu c a b mã hoá...........................................- 40 Hình 4.3. B phát hi n bít chãn l ........................................................- 40 Hình 4.4. Mô ph ng k t qu c a hình 4.2 .............................................- 41 Hình 4.5. B phát bit ch n l c a ví d 4.3 ...........................................- 41 Hình 4.6. Mô ph ng k t qu c a ví d 4.3 ............................................- 42 Hình 5.1. M ch t h p và m ch dãy .....................................................- 43 Hình 5.2. B d n kênh ..........................................................................- 44 Hình 5.3. Mô ph ng k t qu c a ví d 5.1 ............................................- 45 Hình 5.4. B d n k nh cho ví d 2 ........................................................- 46 Hình 5.5. B m 3 tr ng thái ..............................................................- 47 Hình 5.6. K t qu mô ph ng cho ví d 5.3 ............................................- 47 Hình 5.7. B mã hoá cho ví d 5.4........................................................- 48 Hình 5.8. K t qu mô ph ng cho ví d 5.4 ............................................- 49 Hình 5.9. ALU ......................................................................................- 49 Hình 5.9.b. Ho t ng chinh c a các ph n t ALU...............................- 49 Hình 5.10. K t qu mô ph ng c a ví d 5.5 ..........................................- 50 Hình 5.11. K t qu mô ph ng c a ví d 5.6 ..........................................- 52 Hình 5.12. K t qu mô ph ng cho ví d 5.7 ..........................................- 54 Hình 5.13. K t qu mô ph ng c a ví d 5.8 ..........................................- 54 Hình 6.1a.1 DFF v i tín hi u reset không ng b ...............................- 55 Hình 6.1a.2 K t qu mô ph ng .............................................................- 55 Hình 6.2a.1. B m ch s th p phân .................................................- 57 Hình 6.2a.2. K t qu mô ph ng ............................................................- 57 Hình 6.3b.1. Thanh ghi d ch 4 bit .........................................................- 58 Hình 6.3b.2. K t qu mô ph ng ............................................................- 58 Hình 6.4a.1. K t qu mô ph ng ............................................................- 60 Hình 6.4b.1. K t qu mô ph ng ............................................................- 60 -2-

ThiÕt kÕ vi m¹ch b»ng VHDL
Hình 6.5a.1. K t qu mô ph ng ............................................................- 63 Hình 6.5b.1. B m 2 ch s th p phân ..............................................- 63 Hình 6.5b.2. K t qu mô ph ng ............................................................- 64 Hình 6.6a.1. B c ng có nh 8 bit không d u .......................................- 66 Hình 6.6a.2. K t qu mô ph ng ............................................................- 66 Hình 6.6b.1. B dich ơn gi n..............................................................- 68 Hình 6.6b.2. K t qu mô ph ng ............................................................- 68 Hình 6.6c.1. K t qu mô ph ng ............................................................- 69 Hình 6.7a.1. RAM ................................................................................- 71 Hình 6.7a.2. K t qu mô ph ng ............................................................- 71 Hình 6.8a.1. M ch t h p sai và các b ng th t.....................................- 73 Hình 6.8a.2. K t qu mô ph ng ............................................................- 73 Hình 7.2a.1. K t qu mô ph ng ............................................................- 76 Hình 7.3a.1. K t qu mô ph ng ............................................................- 77 Hình 7.3b.1. B d n kênh 4-1 ...............................................................- 78 Hình 7.3b.2. K t qu mô ph ng cách 1 và 2..........................................- 80 Hình 7.3c.1. DFF .................................................................................- 80 Hình 7.3c.2. K t qu mô ph ng cách 1 và 2..........................................- 82 Hình 7.3d.1. B chia t n.......................................................................- 82 Hình 7.3d.2. K t qu mô ph ng ............................................................- 82 Hình 7.4a.1. Các m ch suy ra t mã c a cách 1 và 2............................- 84 Hình 7.4a.2. K t qu mô ph ng cách 1 và 2..........................................- 84 Hình 7.4b.1. B m 0 – 7 ....................................................................- 86 Hình 7.4b.2. K t qu mô ph ng cách 1 và 2..........................................- 87 Hình 7.4c.1. Thanh ghi d ch 4 c p........................................................- 87 Hình 7.4c.2. K t qu mô ph ng cách 1, 2, và 3.....................................- 89 Hình 7.4d.1. Thanh ghi d ch 4 bit .........................................................- 89 Hình 7.4d.2. K t qu mô ph ng ............................................................- 91 Hình 8.1 Sơ máy tr ng thái..............................................................- 92 Hình 8.2. Sơ tr ng thái c a b m BCD.........................................- 96 Hình 8.3. K t qu mô ph ng c a b m BCD......................................- 98 Hình 8.4. Máy tr ng thái c a ví d 8.2 .................................................- 98 Hình 8.5. K t qu mô ph ng cho ví d 8.2 ............................................- 99 Hình 8.6.1 Sơ m ch ki u 1 - Hình 8.6.2. Sơ m ch ki u 2 ..........- 100 Hình 8.7.K t qu mô ph ng cho ví d 8.3 ...........................................- 102 Hình 8.8. Sơ tr ng thái c a b phát hi n chu i ..............................- 103 Hình 8.9.K t qu mô ph ng cho b oán nh n xâu.............................- 104 Hình 8.10.a. Sơ nguyên lý ho t ng c a TLC ..............................- 104 Hình 8.10.b. hình tr ng thái c a TLC ...........................................- 105 Hình 8.11.a. K t qu mô ph ng TLC ch hd bình thư ng............- 107 Hình 8.11.b. K t qu mô ph ng TLC ch ki m tra ......................- 107 Hình 8.12.D ng tín hi u c n t o.........................................................- 107 Hình 8.13.K t qu mô ph ng cho ví d 8.6 .........................................- 109 Hình 9.1. B d ch barrel.....................................................................- 111 Hình 9.2.K t qu mô ph ng cho b d ch barrel ..................................- 113 Hình 9.3.Mô hình c a b so sánh .....................................................- 113 Hình 9.4. K t qu mô ph ng b so sánh có d u ..................................- 114 Hình 9.5.1.K t qu b so sánh không d u 1........................................- 114 Hình 9.5.2. K t qu c a b so sánh không d u2 .................................- 115 Hình 9.6. Sơ b c ng ripple carry..................................................- 116 -

-3-

ThiÕt kÕ vi m¹ch b»ng VHDL
Hình 9.7. K t qu mô ph ng cho b c ng ripple carry........................- 116 Hình 9.8.1. Sơ b c ng carry look ahead........................................- 117 Hình 9.8.2. K t qu mô ph ng cho b c ng carry look ahead..............- 118 Hình 9.9. Thu t toán chia...................................................................- 119 Hình 9.10.1. K t qu mô ph ng b chia..............................................- 120 Hình 9.10.2.K t qu mô phong b chia th 2......................................- 121 Hình 9.11. hình tr ng thái c a b i u khi n máy bán hàng..........- 122 Hình 9.12.K t qu mô ph ng b i u khi n máy bán hàng..................- 125 Hình 9.13. Sơ b nh n d li u n i ti p...........................................- 125 Hình 9.14.K t qu mô ph ng b nh n d li u.....................................- 127 Hình 9.15.B chuy n song song thành n i ti p ...................................- 127 Hình 9.16.K t qu mô ph ng cho b chuy n song song thành n i ti p - 128 Hình 9.17. Sơ c a SSD ..................................................................- 129 Hình 9.18. hình tr ng thái.............................................................- 129 Hình 9.19. K t qu mô ph ng cho trò chơi trên SSD...........................- 131 Hình 9.20 Hình d ng sóng c n phát ...................................................- 131 Hình 9.2.1. K t qu mô ph ng t o sóng..............................................- 132 Hình 9.22K t qu mô ph ng t o sóng theo phương pháp truy n th ng- 133 Hình 9.23.Sơ c a ROM..................................................................- 134 Hình 9.24. K t qu mô ph ng thi t k ROM........................................- 134 Hình 9.25. RAM v i ư ng d li u tách r i........................................- 135 Hình 9.26K t qu mô ph ng RAM có ương d li u vào ra khác nhau- 136 Hình 9.27. RAM v i ư ng d li u chung...........................................- 136 -

Danh m c b ng:
Trang
B B B B B B ng 3.1. H th ng logic gi i ư c ......................................................- 20 ng 3.2. T ng h p các ki u d li u.....................................................- 30 ng 5.1. Các toán t ...........................................................................- 44 ng 6.1. So sánh gi a WHEN và CASE ..............................................- 62 ng 7.1. So sánh gi a SIGNAL và VARIABLE....................................- 78 ng 8.1.Mã hoá tr ng thái cho máy FSM 8 tr ng thái ......................- 109 -

-4-

ThiÕt kÕ vi m¹ch b»ng VHDL

Chương 1: Gi i thi u
1.1. Gi i thi u v VHDL

VHDL là ngôn ng mô t ph n c ng cho các m ch tích h p t c r t cao, là m t lo i ngôn ng mô t ph n c ng ư c phát tri n dùng cho trương trình VHSIC( Very High Speed Itergrated Circuit) c a b qu c phòng M . M c tiêu c a vi c phát tri n VHDL là có ư c m t ngôn ng mô ph ng ph n c ng tiêu chu n và th ng nh t cho phép th nghi m các h th ng s nhanh hơn cũng như cho phép d dàng ưa các h th ng ó vào ng d ng trong th c t . Ngôn ng VHDL ư c ba công ty Intermetics, IBM và Texas Instruments b t u nghiên c u phát tri n vào tháng 7 năm 1983. Phiên b n u tiên ư c công b vào tháng 8-1985. Sau ó VHDL ư c xu t t ch c IEEE xem xét thành m t tiêu chu n chung. Năm 1987 ã ưa ra tiêu chu n v VHDL( tiêu chu n IEEE-1076-1987). VHDL ư c phát tri n gi i quy t các khó khăn trong vi c phát tri n, thay i và l p tài li u cho các h th ng s . VHDL là m t ngôn ng cl p không g n v i b t kỳ m t phương pháp thi t k , m t b mô t hay công ngh ph n c ng nào. Ngư i thi t k có th t do l a ch n công ngh , phương pháp thi t k trong khi ch s d ng m t ngôn ng duy nh t. Và khi em so sánh v i các ngôn ng mô ph ng ph n c ng khác ta th y VHDL có m t s ưu i m hơn h n là: Th nh t là tính công c ng:

VHDL ư c phát tri n dư i s b o tr c a chính ph M và hi n nay là m t tiêu chu n c a IEEE. VHDL ư c s h tr c a nhi u nhà s n xu t thi t b cũng như nhi u nhà cung c p công c thi t k mô ph ng h th ng. Th hai là kh năng ư c h tr b i nhi u công ngh và nhi u phương pháp thi t k :

VHDL cho phép thi t k b ng nhi u phương pháp ví d phương pháp thi t k t trên xu ng, hay t dư i lên d a vào các thư vi n s n có. VHDL cũng h tr cho nhi u lo i công c xây d ng m ch như s d ng công ngh ng b hay không ng b , s d ng ma tr n l p trình ư c hay s d ng m ng ng u nhiên. Th ba là tính c l p v i công ngh :

VHDL hoàn toàn c l p v i công ngh ch t o ph n c ng. M t mô t h th ng dùng VHDL thi t k m c c ng có th ư c chuy n thành các b n t ng h p m ch khác nhau tuỳ thu c công ngh ch t o ph n c ng m i ra i nó có th ư c áp d ng ngay cho các h th ng ã thi t k . Th tư là kh năng mô t m r ng:
-5-

ThiÕt kÕ vi m¹ch b»ng VHDL

VHDL cho phép mô t ho t ng c a ph n c ng t m c h th ng s cho n m c c ng. VHDL có kh năng mô t ho t ng c a h th ng trên nhi u m c nhưng ch s d ng m t cú pháp ch t ch th ng nh t cho m i m c. Như th ta có th mô ph ng m t b n thi t k bao g m c các h con ư c mô t chi ti t. Th năm là kh năng trao i k t qu :

Vì VHDL là m t tiêu chu n ư c ch p nh n, nên m t mô hình VHDL có th ch y trên m i b mô t áp ng ư c tiêu chu n VHDL. Các k t qu mô t h th ng có th ư c trao i gi a các nhà thi t k s d ng công c thi t k khác nhau nhưng cùng tuân theo tiêu chu n VHDL. Cũng như m t nhóm thi t k có th trao i mô t m c cao c a các h th ng con trong m t h th ng l n (trong ó các h con ó ư c thi t k c l p). Th sáu là kh năng h tr thi t k m c l n và kh năng s d ng l i các thi t k : VHDL ư c phát tri n như m t ngôn ng l p trình b c cao, vì v y nó có th ư c s d ng thi t k m t h th ng l n v i s tham gia c a m t nhóm nhi u ngư i. Bên trong ngôn ng VHDL có nhi u tính năng h tr vi c qu n lý, th nghi m và chia s thi t k . Và nó cũng cho phép dùng l i các ph n ã có s n. 1.2. 1.2.1 Gi i thi u công ngh (và ng d ng) thi t k m ch b ng VHDL. ng d ng c a công ngh thi t k m ch b ng VHDL

Hi n nay 2 ng d ng chính và tr c ti p c a VHDL là các ng d ng trong các thi t b logic có th l p trình ư c (Programmable Logic Devices – PLD) (bao g m các thi t b logic ph c t p có th l p trình ư c và các FPGA Field Programmable Gate Arrays) và ng d ng trong ASICs(Application Specific Integrated Circuits). Khi chúng ta l p trình cho các thi t b thì chúng ta ch c n vi t mã VHDL m t l n, sau ó ta có th áp d ng cho các thi t b khác nhau (như Altera, Xilinx, Atmel,…) ho c có th ch t o m t con chip ASIC. Hi n nay, có nhi u thương m i ph c t p (như các vi i u khi n) ư c thi t k theo d a trên ngôn ng VHDL. 1.2.2 Quy trinh thi t k m ch b ng VHDL. Như c p trên, m t trong s l n các ng d ng c a VHDL là ch t o các m ch ho c h th ng trong thi t b có th l p trình ư c (PLD ho c FPGA) ho c trong ASIC. Vi c ch tao ra vi m ch s ư c chia thành 3 giai o n như sau:

-6-

ThiÕt kÕ vi m¹ch b»ng VHDL
Giai o n 1: ư c ư c

Chúng ta b t u thi t k b ng vi t mã VHDL. Mã VHDL này s lưu vào file có uôi là .vhd và có tên cùng v i tên th c th . Mã VHDL s mô t t ng chuy n i thanh ghi.

Hình 1.1. Tóm t t quy trình thi t k VHDL Giai o n 2: Giai o n ch t o:

Bư c u tiên trong quá trình ch t o là biên dich. Quá trình biên d ch s chuy n mã VHDL vào m t netlist t ng c ng. Bư c th 2 c a quá trình ch t o là t i ưu. Quá trình t i ưu ư c th c hi n trên netlist t ng c ng v t c và ph m vi. Trong giai o n này, thi t k có th ư c mô ph ng ki m tra phát hi n nh ng l i x y ra trong quá trình ch t o. Giai o n 3:

Là giai o n ghép n i óng gói ph n m m. giai o n này s t o ra s s p x p v t lý cho chip PLD/FPGA ho c t o ra m t n cho ASIC. 1.2.3. Công c EDA. Các công c ph c v cho quá trình thi t k vi m ch s là: Công c Active – HDL: T o mã VHDL và mô ph ng

-7-

ThiÕt kÕ vi m¹ch b»ng VHDL
Công c EDA (Electronic Design Automation): là công c t ng thi t k m ch i n t . Công c này ư c dùng ph c v cho vi c ch t o, th c thi và mô ph ng m ch s d ng VHDL. Công c cho óng gói: Các công c này s cho phép t ng h p mã VHDL vào các chip CPLD/FPGA c a Altera ho c h ISE c a Xilinx, for Xilinx’s CPLD/FPGA chips). 1.2.4. Chuy n mã VHDL vào m ch. M t b c ng y ư c mô t trong hình dư i ây:

Hinh 1.2.a. Sơ

t ng quát v b c ng

y

Trong ó, a , b là các bit vào cho b c ng, cin là bit nh . u ra s là bit t ng, cout là bit nh ra. Ho t ng c a m ch ư c ch ra dư i d ng b ng chân lý:

Hình 1.2.b. B ng chân lý c a b c ng

y

Bit s và cout ư c tính như sau: và T công th c tính s và cout ta vi t o n mã VHDL như dư i ây:

-8-

ThiÕt kÕ vi m¹ch b»ng VHDL

Hình 1.3. Mã thi t k b c ng T mã VHDL này, m ch v t lý ư c t o ra. Tuy nhiên có nhi u cách th c hi n phương trình ư c miêu t trong ARCHITECTURE OF, vì v y m ch th c t s ph thu c vào b biên d ch/b t i ưu ang ư c s d ng và c bi t ph thu c m c ích công ngh . Hình v sau ây th hi n m t s d ng ki n trúc c a m ch c ng:

Hình 1.4.a. Các ví d v sơ

m ch có th có ng v i mã như hình 1.3

Trong trư ng h p này, n u m c ích công ngh c a chúng ta là thi t b lgic có thê l p trình ư c (PLD, FPGA), thì 2 k t qu cho cout tho mãn là
-9-

ThiÕt kÕ vi m¹ch b»ng VHDL
hình (b) và hình (c) ( ). Còn n u m c ích công ngh là ASIC, thì chúng ta có th s d ng hình (d). Hình D s d ng công ngh CMOS v i các t ng transistor và các m t n ph . B t c m t cái m ch nào ư c tao ra t mã, thì nh ng thao tác c a nó s luôn luôn ư c ki m tra m c thi t k , như ta ã ch ra hình 1. T t nhiên, chúng ta cũng có th ki m tra nó t ng v t lý, nhưng sau ó nh ng thay i là r t tai h i. Hình dư i ây là mô ph ng k t qu c a o n chương trình ã vi t trên cho m ch b c ng y hình 1.3.

Hình 1.4.b: K t qu mô ph ng b c ng ư c thi t k theo hình 1.3

- 10 -

ThiÕt kÕ vi m¹ch b»ng VHDL

Chương 2. C u trúc mã
Trong chương này, chúng ta mô t các ph n cơ b n có ch a c các o n Code nh c a VHDL: các khai báo LIBRARY, ENTITY và ARCHITECTURE. 2.1. Các ơn v VHDL cơ b n.

M t an Code chu n c a VHDL g m t i thi u 3 m c sau: • Khai báo LIBRARY: ch a m t danh sách c a t t c các thư vi n ư c s d ng trong thi t k . Ví d : ieee, std, work, … • ENTITY: Mô t các chân vào ra (I/O pins) c a m ch • ARCHITECTURE: ch a mã VHDL, mô t m ch s h at ng như th nào. M t LIBRARY là m t t p các an Code thư ng ư c s d ng. Vi c có m t thư vi n như v y cho phép chúng ư c tái s d ng và ư c chia s cho các ng d ng khác. Mã thư ng ư c vi t theo các nh d ng c a FUNCTIONS, PROCEDURES, ho c COMPONENTS, ư c thay th bên trong PACKAGES và sau ó ư c d ch thành thư vi n ích. 2.2. Khai báo Library.

khai báo Library, chúng ta c n hai dòng mã sau, dòng th nh t ch a tên thư vi n, dòng ti p theo ch a m t m nh c n s d ng: LIBRARY library_name; USE library_name.package_name.package_parts; Thông thư ng có 3 gói, t 3 thư vi n khác nhau thư ng ư c s d ng trong thi t k : • ieee.std_logic_1164 (from the ieee library), • standard (from the std library), and • work (work library).

Hình 2.1: Các thành ph n cơ b n c a m t o n mã VHDL
- 11 -

ThiÕt kÕ vi m¹ch b»ng VHDL

Hình 2.2: Các ph n cơ b n c a m t Library Các khai báo như sau:
LIBRARY ieee; -- D u ch m ph y (;) ch th USE ieee.std_logic_1164.all;-- kt c a m t câu l nh LIBRARY std; -- ho c m t khai báo.m t d u 2 g ch USE std.standard.all; -- (--) b t u 1 chú thích. LIBRARY work; USE work.all;

Các thư vi n std và work thư ng là m c nh, vì th không c n khai báo chúng, ch có thư vi n ieee là c n ph i ư c vi t rõ ra. M c ích c a 3 gói/thư vi n ư c k trên là như sau: gói std_logic_1164 c a thư vi n ieee cho bi t m t h logic a m c; std là m t thư vi n tài nguyên (ki u d ki u, i/o text..) cho môi trư ng thi t k VHDL và thư vi n work ư c s d ng khi chúng ta lưu thi t k ( file .vhd, các file ư c t op b i chương trình d ch và chương trình mô ph ng…). Th c ra, thư vi n ieee ch a nhi u gói như sau: std_logic_1164: nh rõ STD_LOGIC ( 8 m c) và STD_ULOGIC ( 9 m c) là các h logic a m c std_logic_arith: nh rõ các ki u d li u SIGNED và UNSIGNED, các gi i thu t liên quan và so sánh toán t . Nó cũng ch a nhi u hàm chuy n i d li u, mà cho phép m t ki u ư c chuy n i thành các ki u d li u khác: conv_integer(p),conv_unsigned(p, b), conv_signed(p, b), conv_std_logic_vector(p, b) std_logic_signed: ch a các hàm cho phép làm vi c v i d li u STD_LOGIC_VECTOR ư c th c hi n ch khi d li u là ki u SIGNED

- 12 -

ThiÕt kÕ vi m¹ch b»ng VHDL
std_logic_signed: ch a các hàm cho phép làm vi c v i d li u STD_LOGIC_VECTOR ư c th c hi n ch khi d li u là ki u UNSIGNED. 2.3. Entity ( th c th ).

M t ENTITY là m t danh sách mô t các chân vào/ra ( các PORT) c a m ch i n. Cú pháp như sau:
ENTITY entity_name IS PORT ( port_name : signal_mode signal_type; port_name : signal_mode signal_type; ...); END entity_name;

Ch c a tín hi u ( mode of the signal) có th là IN, OUT, INOUT ho c BUFFER. Ví d trong hình 2.3 ta có th th y rõ các chân IN, OUT ch có m t chi u (vào ho c ra) trong khi INOUT là 2 chi u và BUFFER l i khác, tín hi u ra ph i ư c s d ng t d li u bên trong. Ki u c a tín hi u ( type of the signal) có th là BIT, STD_LOGIC, INTEGER, … Tên c a th c th ( name of the entity) có th l y m t tên b t kỳ, ng ai tr các tù khóa c a VHDL. Ví d : Xét c ng NAND hình 2.4, khai báo ENTITY như sau:
ENTITY nand_gate IS PORT (a, b : IN BIT; x : OUT BIT); END nand_gate;

Hình 2.3. Các ch 2.4.

tín hi u

Hình 2.4. C ng NAND

ARCHITECTURE ( c u trúc). quy t m ch s làm vi c

ARCHITECTURE là m t mô t m ch dùng như th nào ( có ch c năng gì). Cú pháp như sau:

ARCHITECTURE architecture_name OF entity_name IS [declarations] BEGIN (code)

- 13 -

ThiÕt kÕ vi m¹ch b»ng VHDL
END architecture_name;

Như th y trên, m t c u trúc có 2 ph n: ph n khai báo ( ch c năng), nơi các tín hi u và các h ng ư c khai báo, và ph n mã (code - t BEGIN tr xu ng). Ví d : Xét tr l i c ng NAND c a hình 2.4
ARCHITECTURE myarch OF nand_gate IS BEGIN x <= a NAND b; END myarch;

Ý nghĩa c a ARCHITECTURE trên là như sau: m ch ph i th c hi n công vi c NAND 2 tín hi u vào (a,b) và gán (<=) k t qu cho chân ra x. M i m t khai báo th c th u ph i i kèm v i ít nh t m t ki n trúc tương ng. VHDL cho phép t o ra hơn m t ki n trúc cho m t th c th . Ph n khai báo ki n trúc có th bao g m các khai báo v các tín hi u bên trong, các ph n t bên trong h th ng, hay các hàm và th t c mô t ho t ng c a h th ng. Tên c a ki n trúc là nhãn ư c t tuỳ theo ngư i x d ng. Có hai cách mô t ki n trúc c a m t ph n t ( ho c h th ng) ó là mô hình ho t ng (Behaviour) hay mô t theo mô hình c u trúc (Structure). Tuy nhiên m t h th ng có th bao g m c mô t theo mô hình ho t ng và mô t theo mô hình c u trúc.

+

Mô t ki n trúc theo mô hình ho t

ng:

Mô hình ho t ng mô t các ho t ng c a h th ng (h th ng áp ng v i các tín hi u vào như th nào và ưa ra k t qu gì ra u ra) dư i d ng các c u trúc ngôn ng l p trình b c cao. C u trúc ó có th là PROCESS , WAIT, IF, CASE, FOR-LOOP… Ví d :
ARCHITECTURE behavior OF nand IS -- Khai báo các tín hi u bên trong và các bí danh BEGIN c <= NOT(a AND b); END behavior;

Ví d 2:
ARCHITECTURE behavioral of decode2x4 is BEGIN Process (A,B,ENABLE) Variable ABAR,BBAR: bit; Begin ABAR := not A; BBAR := not B; If ENABLE = ‘1’ then Z(3) <= not (A and B); Z(0) <= not (ABAR and BBAR); Z(2) <= not (A and BBAR); Z(1) <= not (ABAR and B); Else Z <= not (ABAR and B); End if;

- 14 -

ThiÕt kÕ vi m¹ch b»ng VHDL
End process; END arc_behavioral;

+

Mô t ki n trúc theo mô hình c u trúc:

Mô hình c u trúc c a m t ph n t (ho c h th ng) có th bao g m nhi u c p c u trúc b t u t m t c ng logic ơn gi n n xây d ng mô t cho m t h th ng hoàn thi n. Th c ch t c a vi c mô t theo mô hình c u trúc là mô t các ph n t con bên trong h th ng và s k t n i c a các ph n t con ó. Mô t cú pháp:
architecture identifier of entity_name is Architecture_declarative_part begin all_concurrent_statements end [architecture][architecture_simple_name];

Khai báo các thành ph n:
Component Tên_componemt port [ danh sách ]; End component;

Như v i ví d mô t mô hình c u trúc m t flip-flop RS g m hai c ng NAND có th mô t c ng NAND ư c nh nghĩa tương t như ví d v i c ng NOT, sau ó mô t sơ móc n i các ph n t NAND t o thành trigơ RS Ví d 1:

Hình 2.5.a. Sơ

c a trigo RS

ENTITY rsff IS PORT( r : IN std_logic; s : IN std_logic; q : OUT std_logic; qb : OUT std_logic); END rsff; ARCHITECTURE kien_truc OF rsff IS COMPONENT nand -nh nghĩa c ng nand GENERIC(delay : time); PORT(a : IN std_logic; b : IN std_logic; c : OUT std_logic); END COMPONENT; BEGIN u1: nand -- cài t u1 là thành ph n nand GENERIC MAP(5 ns) -- giá tr delay có th thay i values

- 15 -

ThiÕt kÕ vi m¹ch b»ng VHDL
PORT MAP(s, qb, q); -- b n I/O cho thành ph n u2: nand -- thi t l p u2 là thành ph n nand GENERIC MAP(5 ns) PORT MAP(q, r, qb); END kien_truc;

Ví d 2:
Architecture arc_mach_cong of mach_cong is Component Xor Port( X,Y : in bit ; Z, T : out bit); End component; Component And Port(L,M :input ;N,P : out bit ); End component; Begin G1 : Xor port map (A,B,Sum); G2 : And port map (A, B, C); End arc_mach_cong;

+

Mô t ki n trúc theo mô hình t ng hơp
ó là mô hình k t h p c a 2 mô hình trên. Ví d :
Entity adder is Port (A,B,Ci : bit S, Cout : bit); End adder; Architecture arc_mixed of adder is Component Xor2 Port( P1, P2 : in bit; PZ : out bit); End compenent; Signal S1 :bit; Begin X1 : Xor2 port map(A,B,S1); Process (A,B,Cin) Variable T1,T2,T3 : bit; Begin T1 := A and B; T2 := B and Cin ; T3 := A and Cin; Cout := T1 or T2 or T3 ; End process; End arc_mixed ;

2.5.

Các ví d m

u.

Trong m c này, chúng ta s trình bày 2 ví d u tiên v mã VHDL. M i ví d u ư c theo kèm b i các chú thích di n gi i và các k t qu mô ph ng. Ví d 2.1: DFF v i Reset không ng b :

- 16 -

ThiÕt kÕ vi m¹ch b»ng VHDL

Hình 2.5.b. Sơ

c a DFF không

ng b

Hình 2.5.b cho th y sơ c a m t flip-flop lo i D (DFF), xung ư c kích theo sư n c a tín hi u ng h (clk), và v i m t tín hi u u vào reset không ng b (rst). Khi rst = ‘1’, u ra luôn m c th p b t k clk. Ngư c l i, u ra s copy u vào ( q<=d) t i th i i m khi clk chuy n t ‘0’ lên ‘1’. Có nhi u cách th c hi n DFF c a hình 2.5, m t gi i pháp s ư c trình bày dư i ây. S d ng m t PROCESS cho an mã sau ây:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 --------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; --------------------------------------ENTITY dff IS PORT ( d, clk, rst: IN STD_LOGIC; q: OUT STD_LOGIC); END dff; --------------------------------------ARCHITECTURE behavior OF dff IS BEGIN PROCESS (rst, clk) BEGIN IF (rst='1') THEN q <= '0'; ELSIF (clk'EVENT AND clk='1') THEN q <= d; END IF; END PROCESS; END behavior; ---------------------------------------

(Chú ý: VHDL không phân bi t ch hoa và ch thư ng.) * K t qu mô ph ng:

Hình 2.6: K t qu mô ph ng c a ví d 2.1
- 17 -

ThiÕt kÕ vi m¹ch b»ng VHDL
Hình 2.6 mô ph ng k t qu t ví d 2.1, th có th ư c gi i thích d dàng. C t u tiên cho bi t tên c a tín hi u, như ã ư c inh nghĩa trong ENTITY. Nó cũng cho bi t ch ( hư ng) c a tín hi u, lưu ý r ng các mũi tên ng v i rst, d và clk hư ng vào trong, ây là phía input, còn q hư ng ra ngoài tương ng v i phía output. C t th hai ch a giá tr c a m i tín hi u v trí tương ng v i nơi con tr tr t i. Trong trư ng h p hi n t i, con tr 0ns và tín hi u nh n giá tr (1,0,0,0). C t th 3 cho th y s mô ph ng c a toàn b quá trình. Các tín hi u vào (rst, d, clk) có th ư c ch n m t cách t do và b mô ph ng s xác nh tín hi u ngõ ra tương ng. Ví d 2.2: DFF k t h p v i c ng NAND M ch i n hình 2.7 là s k t h p c a 2 hình 2.4 và 2.5. Trong l i gi i sau ây, chúng ta ã gi i thi u m t cách có ch nh m t tín hi u không c n thi t (temp), ch minh h a m t tín hi u s ư c khai báo như th nào.

Hình 2.7. DFF k t h p v i c ng NAND Mã thi t k :
--------------------------------------ENTITY example IS PORT ( a, b, clk: IN BIT; q: OUT BIT); END example; --------------------------------------ARCHITECTURE example OF example IS SIGNAL temp : BIT; BEGIN temp <= a NAND b; PROCESS (clk) BEGIN IF (clk'EVENT AND clk='1') THEN q<=temp; END IF; END PROCESS; END example; ---------------------------------------

K t qu mô ph ng t m ch DFF k t h p v i NANDtrên hình 2.8:

Hình 2.8. K t qu mô ph ng c a ví d 2.2
- 18 -

ThiÕt kÕ vi m¹ch b»ng VHDL

Chương 3: Ki u d li u
vi t mã VHDL m t cách hi u qu , th t c n thi t bi t r ng các ki u d li u nào ư c cho phép, làm th nào nh rõ và s d ng chúng. Trong chương này, t t c các ki u d li u cơ b n s ư c mô t . 3.1. Các ki u d li u ti n nh nghĩa.

VHDL bao g m m t nhóm các ki u d li u ti n nh nghĩa, ư c nh rõ thông qua các chu n IEEE 1076 và IEEE 1164. C th hơn, vi c nh nghĩa ki u d li u như th có th tìm th y trong các gói/ thư vi n sau: • Gói standard c a thư vi n std: BOOLEAN, INTEGER và REAL. nh nghĩa các ki u d li u BIT,

• Gói std_logic_1164 c a thư vi n ieee: STD_LOGIC và STD_ULOGIC.

nh nghĩa ki u d li u

• Gói std_logic_arith c a thư vi n ieee: nh nghĩa SIGNED và UNSIGNED, c ng thêm nhi u hàm chuy n i d li u ví d : conv_integer(p), conv_unsigned(p, b), conv_signed(p, b), và conv_std_logic_vector(p, b). • Gói std_logic_signed và std_logic_unsigned c a thư vi n ieee: Ch a các hàm cho phép h at ng v i d li u STD_LOGIC_VECTOR ư c th c hi n khi mà ki u d li u là SIGNED h ăc UNSIGNED. T t c các ki u d li u ti n + nh nghĩa ã nêu trên ư c mô t như sau:

BIT và BIT_VECTOR: 2 m c logic (‘0’, ’1’). Ví d : SIGNAL x: BIT; -- x ư c khai báo như m t tín hi u s ki u BIT. SIGNAL y: BIT_VECTOR (3 DOWNTO 0); -- y là m t vec tơ 4 bit, v i bit bên trái nh t ư c g i là MSB. SIGNAL w: BIT_VECTOR (0 TO 7); -- w là m t véc tơ8 bit, phía bên ph i nh t ư c g i là MSB D a vào các tín hi u trên, các phép gán sau ây là h p l ( gán m t giá tr n m t tín hi u, toán t <= ư c s d ng): x <= “1”; y <= “0111”; z <= “01110001”; + STD_LOGIC ( và STD_LOGIC_VECTOR): H logic 8 giá tr sau ây ư c gi i ti u trong chu n IEEE 1164: ‘X’ không xác nh ( b t bu c)
- 19 -

ThiÕt kÕ vi m¹ch b»ng VHDL
‘0’ ‘1’ ‘Z’ ‘W’ ‘L’ ‘H’ ‘-’ Ví d : SIGNAL x: STD_LOGIC; -- x ư c khai báo như m t ký t s ( vô hư ng), tín hi u thu c ki u STD_LOGIC SIGNAL y: STD_LOGIC_VECTOR (3 DOWNTO 0) := "0001"; -- y ư c khai báo như m t vector 4-bit, v i bit bên trái cùng là -- MSB. Giá tr kh i u c a y là "0001". Lưu ý -- r ng toán t ":=" ư c s d ng thi t l p giá tr kh i u. H u h t các m c std_logic là vô hư ng ch i v i quá trình mô ph ng. Tuy nhiên ‘0’, ‘1’ và ‘Z’ là có th k t h p không h n ch . i v i các giá tr “weak”, chúng ư c gi i quy t trong s ưu tiên c a các giá tr “forcing” trong các nút a chi u ( B ng 3.1). Th t v y, n u 2 tín hi u std_logic b t kỳ ư c n i n cùng m t node, thì các m c logic i l p ư c t ng gi i quy t theo B ng 3.1 m c th p ( b t bu c) m c cao ( b t bu c) tr kháng cao không xác nh (y u) m c th p ( y u) m c cao ( y u) không quan tâm

B ng 3.1. H th ng logic gi i ư c + STD_ULOGIC( STD_ULOGIC_VECTOR): h th ng logic 9 m c trong chu n IEEE 1164: (‘U’, ‘X’, ‘0’, ‘1’, ‘Z’, ‘W’, ‘L’, ‘H’, ‘–’). Th t v y, h STD_LOGIC mô t trên là m t t p con c a STD_ULOGIC. H th ng th 2 này thêm giá tr logic ‘U’. • BOOLEAN: úng/sai • INTEGER: s nguyên 32 bits ( t -2.147.483.647 n +2.147.483.647) • NATURAL: ms nguyên không âm ( t 0 n +2.147.483.647) • REAL: s th c n m trong kho ng ( t -1.0E38 n +1.0E38). • Physic literals: s d ng i v i các i lư ng v t lý, như th i gian, i n áp,…H u ích trong mô ph ng • Character literals: ký t ASCII ơn ho c m t chu i các ký t như th
- 20 -

ThiÕt kÕ vi m¹ch b»ng VHDL
• SIGNED và UNSIGNED: các ki u d li u ư c nh nghĩa trong gói std_logic_arith c a thư vi n ieee. Chúng có hình th c gi ng như STD_LOGIC_VECTOR, nhưng ng ai tr các toán t s h c, mà tiêu bi u là ki u d li u INTEGER Các ví d : x0 <= '0'; -- bit, std_logic, or std_ulogic value '0' x1 <= "00011111"; -- bit_vector, std_logic_vector, -- std_ulogic_vector, signed, or unsigned x2 <= "0001_1111"; -- ư ng g ch dư i cho phép d hình dung hơn x3 <= "101111" -- bi u di n nh phân c a s th p phân 47 x4 <= B"101111" -- như trên x5 <= O"57" -- bi u di n bát phân c a s th p phân 47 x6 <= X"2F" -- bi u di n s th p l c phân c a s th p phân 47 n <= 1200; -- s nguyên m <= 1_200; -- s nguyên, cho phép g ch dư i IF ready THEN... -- Logic, th c hi n n u ready=TRUE y <= 1.2E-5; -- real, not synthesizable q <= d after 10 ns; -- physical, not synthesizable Ví d : Các toán t ư c phép và không ư c phép n m gi a các ki u d li u khác nhau: SIGNAL a: BIT; SIGNAL b: BIT_VECTOR(7 DOWNTO 0); SIGNAL c: STD_LOGIC; SIGNAL d: STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL e: INTEGER RANGE 0 TO 255; ... a <= b(5); -- ư c phép (cùng ki u vô hư ng: BIT) b(0) <= a; -- ư c phép (cùng ki u vô hư ng: BIT) c <= d(5); -- ư c phép (cùng ki u vô hư ng: STD_LOGIC) d(0) <= c; -- ư c phép (cùng ki u vô hư ng: STD_LOGIC) a <= c; -- không ư c phép (không th k t h p ki u: BIT x STD_LOGIC) b <= d; -- không ư c phép (không th k t h p ki u: BIT_VECTOR x -- STD_LOGIC_VECTOR) e <= b; -- không ư c phép (không th k t h p ki u: INTEGER x BIT_VECTOR) e <= d; -- không ư c phép (không th k t h p ki u: INTEGER x -- STD_LOGIC_VECTOR)

- 21 -

ThiÕt kÕ vi m¹ch b»ng VHDL
3.2. Các ki u d li u ngư i dùng nh nghĩa.

VHDL cũng cho phép ngư i dùng t nh nghĩa các ki u d li u. Hai lo i ki u d li u ngư i dùng nh nghĩa ư c ch ra dư i ây bao g m integer và enumerated. Ki u integer ngư i dùng nh nghĩa: TYPE integer IS RANGE -2147483647 TO +2147483647; -- Th c ra ki u này ã ư c nh nghĩa trư c b i ki u INTEGER. TYPE natural IS RANGE 0 TO +2147483647; -- Th c ra ki u này ư c ã nh nghĩa trư c b i ki u NATURAL. TYPE my_integer IS RANGE -32 TO 32; -- M t t p con các s integer mà ngư i dùng nh nghĩa. TYPE student_grade IS RANGE 0 TO 100; -- M t t p con các s nguyên ho c s t nhiên ngư i dùng nh nghĩa. _ Các ki u m ngư i dùng inh nghĩa: TYPE bit IS ('0', '1'); -- ư c nh nghĩa trư c b i ki u BIT TYPE my_logic IS ('0', '1', 'Z'); -- M t t p con c a std_logic mà ngư i dùng nh nghĩa TYPE bit_vector IS ARRAY (NATURAL RANGE <>) OF BIT; -- ã ư c nh nghĩa trư c b i BIT_VECTOR. -- RANGE <> ư c s d ng ch th r ng các m c.không gi i h n. -- NATURAL RANGE <>, on the other hand, indicates that the only -- restriction is that the range must fall within the NATURAL -- range. TYPE state IS (idle, forward, backward, stop); -- M t ki u d li u , i n hình c a các máy tr ng thái h u h n. TYPE color IS (red, green, blue, white); -- Ki u d li u li t kê khác. Vi c mã hóa các ki u li t kê ư c th c hi n m t cách tu n t và t ng. Ví d : Cho ki u màu như trên, mã hóa c n 2 bit ( có 4 tr ng thái), b t u ’00’ ư c gán cho tr ng thái u tiên ( red), ‘01’ ư c gán cho tr ng thái th hai (green), ‘10’ k ti p (blue) và cu i cùng là tr ng thái ‘11’ (while). 3.3. Các ki u con (Subtypes).

Ki u d li u con là m t ki u d li u i kèm theo i u ki n ràng bu c. Lý do chính cho vi c s d ng ki u d li u con sau ó nh ra m t ki u d li u m i ó là, các thao tác gi a các ki u d li u khác nhau không ư c cho phép, chúng ch ư c cho phép trong trư ng h p gi a m t ki u con và ki u cơ s tương ng v i nó.

- 22 -

ThiÕt kÕ vi m¹ch b»ng VHDL
Ví d : ki u d li u sau ây nh n ư c các ki u d li u ư c gi i thi u trong các ví d ph n trư c. SUBTYPE natural IS INTEGER RANGE 0 TO INTEGER'HIGH; -- NATURAL is a ki u con (t p con) of INTEGER. SUBTYPE my_logic IS STD_LOGIC RANGE '0' TO 'Z'; -- G i l i STD_LOGIC=('X','0','1','Z','W','L','H','-'). -- Do ó, my_logic=('0','1','Z'). SUBTYPE my_color IS color RANGE red TO blue; -- khi color=(red, green, blue, white), thì -- my_color=(red, green, blue). SUBTYPE small_integer IS INTEGER RANGE -32 TO 32; -- M t t p con c a INTEGER. Example: Các phép toán h p l và không h p l gi a các ki u d li u và các ki u d li u con. SUBTYPE my_logic IS STD_LOGIC RANGE '0' TO '1'; SIGNAL a: BIT; SIGNAL b: STD_LOGIC; SIGNAL c: my_logic; ... b <= a; --không h p l (không th k t h p ki u: BIT v i STD_LOGIC) b <= c; --h p l (cùng ki u cơ s : STD_LOGIC) 3.4. M ng (Arrays).

M ng là m t t p h p các i tư ng có cùng ki u. Chúng có th là m t chi u (1D), 2 chi u (2D) h ăc m t chi u c a m t chi u (1D x 1D) và cũng có th có nh ng kích thư c cao hơn. Hình 3.1 minh h a vi c xây d ng m t m ng d li u. M t giá tr ơn ( vô hư ng ư c ch ra (a), m t vector ( m ng 1D) (b) và m t m ng các vector ( m ng 1Dx1D) (c) và m ng c a m ng 2D như trong (d) Th t v y, các ki u d li u VHDL ư c nh nghĩa trư c ó (m c 3.1) ch bao g m các i lư ng vô hư ng-scalar ( bit ơn) và vector ( m ng m t chi u các bit). Các ki u d li u có th k t h p trong m i lo i này là như dư i ây: _ Scalars: BIT, STD_LOGIC, STD_ULOGIC, and BOOLEAN. _ Vectors: BIT_VECTOR, STD_LOGIC_VECTOR, STD_ULOGIC_VECTOR, INTEGER, SIGNED, and UNSIGNED.

Hình 3.1: Minh h a scalar (a), 1D (b), 1Dx1D (c), và 2D (d)

- 23 -

ThiÕt kÕ vi m¹ch b»ng VHDL
Như có th th y, không h có nh nghĩa trư c m ng 2D ho c 1Dx1D, mà khi c n thi t, c n ph i ư c ch nh b i ngư i dùng. làm như v y, m t ki u m i (new TYPE) c n ph i ư c nh nghĩa u tiên, sau ó là tín hi u m i (new SIGNAL), new VARIABLE h ăc CONSTANT có th ư c khai báo s d ng ki u d li u ó. Cú pháp dư i ây s ư c dùng: ch nh m t ki u m ng m i: TYPE type_name IS ARRAY (specification) OF data_type; t o s d ng ki u m ng m i: SIGNAL signal_name: type_name [:= initial_value]; Trong cú pháp trên, m t SIGNAL ư c khai báo. Tuy nhiên nó cũng có th là m t CONSTANT ho c m t VARIABLE. Gia tr kh i t o tùy ch n. * Ví d m ng 1Dx1D: Chúng ta mu n xây d ng m t m ng ch a 4 vector, m i vector có kích thư c là 8 bit, ólà m t m ng 1Dx1D ( hình 3.1). Ta g i m i vector là hàng (row) và m ng hoàn ch nh là ma tr n (matrix). Hơn n a, chúng ta mu n bit bên trái cùng c a m i vector tr thành MSB ( most significant bit) c a nó, và dòng trên cùng tr thành dòng 0. Khi ó s th c hi n y m ng s là như sau: TYPE row IS ARRAY (7 DOWNTO 0) OF STD_LOGIC; -- 1D array TYPE matrix IS ARRAY (0 TO 3) OF row; -- 1Dx1D array SIGNAL x: matrix; -- 1Dx1D signal * Ví d m ng 1Dx1D khác: Cách khác sau: TYPE matrix IS ARRAY (0 TO 3) OF STD_LOGIC_VECTOR(7 DOWNTO 0); * Ví d m ng 2D: M ng sau ây th c s là hai chi u. Lưu ý r ng vi c xây d ng nó d a trên các vector, nhưng khá hoàn ch nh trên các i lư ng vô hư ng. TYPE matrix2D IS ARRAY (0 TO 3, 7 DOWNTO 0) OF STD_LOGIC; -- 2D array * Kh i u cho m ng: xây d ng m ng 1Dx1D trên còn ư c th c hi n như

Như ã th y trong cú pháp trên, giá tr kh i u c a m t SIGNAL ho c VARIABLE là tùy ch n. Tuy nhiên, khi vi c kh i u giá tr ư c òi h i, nó có th ư c th c hi n như trong ví d phía dư i ây: ... :="0001"; -- for 1D array ... :=('0','0','0','1') -- for 1D array ... :=(('0','1','1','1'), ('1','1','1','0')); -- for 1Dx1D or-- 2D array

- 24 -

ThiÕt kÕ vi m¹ch b»ng VHDL

* Ví d : Các phép gán m ng h p l và không h p l Phép gán trong ví d này ư c d a trên tín hi u như sau: nh nghĩa ki u và khai báo các

TYPE row IS ARRAY (7 DOWNTO 0)OF STD_LOGIC; -- 1D array TYPE array1 IS ARRAY (0 TO 3) OF row; -- 1Dx1D array TYPE array2 IS ARRAY (0 TO 3) OF STD_LOGIC_VECTOR(7 DOWNTO 0); -- 1Dx1D TYPE array3 IS ARRAY (0 TO 3, 7 DOWNTO 0) OF STD_LOGIC; -- 2D array SIGNAL x: row; SIGNAL y: array1; SIGNAL v: array2; SIGNAL w: array3;

--------- Các phép gán vô hư ng h p l : ---------------- Các phép gán i lư ng vô hư ng (bit ơn) dư i ây là h p l , -- b i vì ki u ( vô hư ng) cơ b n là STD_LOGIC cho t t c các tín hi u -- (x,y,v,w).
x(0) <= y(1)(2); -- lưu ý 2 c p d u ngo c ơn -- (y is 1Dx1D) x(1) <= v(2)(3); -- 2 c p d u ngo c ơn (v is 1Dx1D) x(2) <= w(2,1); -- 1 c p d u ngo c ơn (w is 2D) y(1)(1) <= x(6); y(2)(0) <= v(0)(0); y(0)(0) <= w(3,3); w(1,1) <= x(7); w(3,0) <= v(0)(3);

--------- Gán vector: --------------------x <= y(0); -- h p l (cùng ki u: ROW) x <= v(1); -- không h p l (không phù h p ki u: ROW và -- STD_LOGIC_VECTOR) x <= w(2); -- không h p l (w ph i là 2D) x <= w(2,2 DOWNTO 0);--không h p l (không phù h p ki u: ROW x -- STD_LOGIC) v(0)<=w(2,2 DOWNTO 0);--illegal(mismatch: STD_LOGIC_VECTOR -- x STD_LOGIC) v(0) <= w(2); -- illegal (w must have 2D index) y(1) <= v(3); -- illegal (type mismatch: ROW x -- STD_LOGIC_VECTOR) y(1)(7 DOWNTO 3) <= x(4 DOWNTO 0); -- legal (same type, -- same size) v(1)(7 DOWNTO 3) <= v(2)(4 DOWNTO 0); -- legal (same type, -- same size) w(1,5 DOWNTO 1)<=v(2)(4 DOWNTO 0);-- illegal (type mismatch)

- 25 -

ThiÕt kÕ vi m¹ch b»ng VHDL
3.5. M ng c ng ( Port Array).

Như chúng ta ã bi t, không có ki u d li u ư c nh nghĩa trư c nào có hơn m t chi u. Tuy nhiên, trong các c i m c a các chân vào ho c ra (các PORT) c a m t m ch i n ( mà ư c xây d ng thành ENTITY), chúng ta có th ph i c n nh rõ các PORT như là m ng các VECTOR Khi các khai báo TYPE không ư c cho phép trong m t ENTITY, gi i pháp khai báo ki u d li u ngư i dùng nh nghĩa trong m t PACKAGE, mà có th nh n bi t toàn b thi t k . M t ví d như sau:
------- Package: -------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; ---------------------------PACKAGE my_data_types IS TYPE vector_array IS ARRAY (NATURAL RANGE <>) OF STD_LOGIC_VECTOR(7 DOWNTO 0); END my_data_types; -------------------------------------------------- Main code: ------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; USE work.my_data_types.all; -- user-defined package --------------------------ENTITY mux IS PORT (inp: IN VECTOR_ARRAY (0 TO 3); ... ); END mux; ... ; --------------------------------------------

Có th th y trong ví d trên, m t ki u d li u ngư i dùng nh nghĩa ư c g i là vector_array, ã ư c t o ra, mà nó có th ch a m t s không xác nh các vector, m i vector ch a 8 bit. Ki u d li u ư c lưu gi trong m t PACKAGE g i là my_data_types, và sau ó ư c s d ng trong m t ENTITY xác nh m t PORT ư c g i. Chú ý trong o n mã chính bao g m thêm c m t m nh USE th c hi n gói ngư i dùng nh nghĩa my_data_types có th th y trong thi t k . Ch c năng khác cho PACKAGE trên s ư c trình bày dư i ây, nơi mà có khai báo CONSTANT:
------- Package: -----------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; ---------------------------PACKAGE my_data_types IS CONSTANT b: INTEGER := 7; TYPE vector_array IS ARRAY (NATURAL RANGE <>) OF STD_LOGIC_VECTOR(b DOWNTO 0);

- 26 -

ThiÕt kÕ vi m¹ch b»ng VHDL
END my_data_types; ----------------------------------------------

3.6.

Ki u b n ghi (Records). i

B n ghi tương t như m ng, v i i m khác r ng chúng ch a các tư ng có ki u d li u khác nhau. Ví d :
TYPE birthday IS RECORD day: INTEGER RANGE 1 TO 31; month: month_name; END RECORD;

3.7.

Ki u d li u có d u và không d u ( Signed and Unsigned).

Như ã c p trư c ây, các ki u d li u này ư c nh nghĩa trong gói std_logic_arith c a thư vi n ieee. Cú pháp c a chúng ư c minh h a trong ví d dư i ây: Ví d :
SIGNAL x: SIGNED (7 DOWNTO 0); SIGNAL y: UNSIGNED (0 TO 3);

Lưu ý r ng cú pháp c a chúng tương t v i STD_LOGIC_VECTOR, không gi ng như INTEGER. M t giá tr UNSIGNED là m t s không bao gi nh hơn zero. Ví d , “0101” bi u di n s th p phân 5, trong khi “1101” là 13. Nhưng n u ki u SIGNED ư c s d ng thay vào, giá tr có th là dương ho c âm ( theo nh d ng bù 2). Do ó, “0101” v n bi u di n s 5, trong khi “1101” s bi u di n s -3 s d ng ki u d li u SIGNED ho c UNSIGNED, gói std_logic_arith c a thư vi n ieee, ph i ư c khai báo. B t ch p cú pháp c a chúng, ki u d li u SIGNED và UNSIGNED có hi u qu ch y u i v i các phép toán s h c, nghĩa là, ngư c v i STD_LOGIC_VECTOR, chúng ch p nh n các phép toán s h c. m t khía c nh khác, các phép toán logic thì không ư c phép. * Ví d : Các phép toán h p l signed/unsigned: và không h p l i v i ki u d li u

LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; -thêm vào ... SIGNAL a: IN SIGNED (7 DOWNTO 0); SIGNAL b: IN SIGNED (7 DOWNTO 0); SIGNAL x: OUT SIGNED (7 DOWNTO 0); ...

gói

c n

thi t

- 27 -

ThiÕt kÕ vi m¹ch b»ng VHDL
v <= a + b; OK) w <= a AND b; không OK) -- h p l -- không h p l (phép toán s h c

(phép toán logic

Các phép toán h p l và không h p l v i std_logic_vector:
LIBRARY ieee; USE ieee.std_logic_1164.all; -- không thêm gói òi h i ... SIGNAL a: IN STD_LOGIC_VECTOR (7 DOWNTO 0); SIGNAL b: IN STD_LOGIC_VECTOR (7 DOWNTO 0); SIGNAL x: OUT STD_LOGIC_VECTOR (7 DOWNTO 0); ... v <= a + b; -- không h p l (phép toán s h c không OK) w <= a AND b; -- h p l (phép toán logic OK)

* Ví d : Các phép toán s h c v i std_logic_vector
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; -- bao g m gói thêm vào ... SIGNAL a: IN STD_LOGIC_VECTOR (7 DOWNTO 0); SIGNAL b: IN STD_LOGIC_VECTOR (7 DOWNTO 0); SIGNAL x: OUT STD_LOGIC_VECTOR (7 DOWNTO 0); ... v <= a + b; -- h p l (phép toán s h c OK), không d u w <= a AND b; -- h p l (phép toán logic OK).

3.8.

Chuy n

i d li u.

VHDL không cho phép các phép toán tr c ti p ( s h c, logic, …) tác ng lên các d li u khác ki u nhau. Do ó, thư ng là r t c n thi t i v i vi c chuy n i d li u t m t ki u này sang m t ki u khác. i u này có th ư c th c hi n trong hai cách cơ b n: ho c chúng ta vi t m t ít code cho i u ó, ho c chúng ta g i m t FUNCTION t m t gói ư c nh nghĩa trư c mà nó cho phép th c hi n các phép bi n i cho ta. N u d li u ư c quan h óng ( nghĩa là 2 toán h ng có cùng ki u cơ s , b t ch p ang ư c khai báo thu c v hai ki u l p khác nhau), thì std_logic_1164 c a thư vi n ieee cung c p các hàm chuy n i d th c hi n. * Ví d : các phép toán h p l và không h p l i v i các t p con

TYPE long IS INTEGER RANGE -100 TO 100; TYPE short IS INTEGER RANGE -10 TO 10; SIGNAL x : short; SIGNAL y : long;

- 28 -

ThiÕt kÕ vi m¹ch b»ng VHDL
... y <= 2*x + 5; y <= long(2*x + 5); thành ki u long

-- l i, không phù h p ki u -- OK, k t qu ư c chuy n

i

Nhi u hàm chuy n c a thư vi n ieee:

i d li u có th

ư c tìm trong gói std_logic_arith

o conv_integer(p): chuy n i m t tham s p c a ki u INTEGER, UNSIGNED, SIGNED, ho c STD_ULOGIC thành m t giá tr INTEGER. Lưu ý r ng STD_LOGIC_VECTOR không ư c k n. i m t tham s p c a ki u o conv_unsigned(p, b): chuy n INTEGER, UNSIGNED, SIGNED, ho c STD_ULOGIC thành m t giá tr UNSIGNED v i kích c là b bit. o conv_signed(p, b): chuy n i m t tham s p c a ki u INTEGER, UNSIGNED, SIGNED, ho c STD_ULOGIC thành m t giá tr SIGNED v i kích c là b bits. o conv_std_logic_vector(p, b): chuy n i m t tham s p thu c ki u d li u INTEGER, UNSIGNED, SIGNED, ho c STD_LOGIC thành m t giá tr STD_LOGIC_VECTOR v i kích thư c b bits. * Ví d : chuy n i d li u:

LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ... SIGNAL a: IN UNSIGNED (7 DOWNTO 0); SIGNAL b: IN UNSIGNED (7 DOWNTO 0); SIGNAL y: OUT STD_LOGIC_VECTOR (7 DOWNTO 0); ... y <= CONV_STD_LOGIC_VECTOR ((a+b), 8); -- Phép toán h p l : a+b ư c chuy n i t UNSIGNED thành m t -- giá tr 8-bit STD_LOGIC_VECTOR, sau ó gán cho y.

M t cách khác có th ch n ã ư c c p n trong m c trư c ây. Nó bao g m vi c s d ng các gói std_logic_signed và std_logic_unsigned t thư vi n ieee. Các gói này cho phép các phép toán v i d li u STD_LOGIC_VECTOR ư c th c hi n n u d li u ã là ki u SIGNED ho c UNSIGNED, m t cách l n lư t.

- 29 -

ThiÕt kÕ vi m¹ch b»ng VHDL
3.9. Tóm t t. Các ki u d li u VHDL t ng h p cơ b n ư c tóm t t trong b ng 3.2

B ng 3.2. T ng h p các ki u d li u. 3.10. Các ví d . * Ví d 3.1: S phân chia i v i các ki u d li u

Các phép gán h p l và không h p l ư c trình bày k ti p ư c d a trên các nh nghĩa ki u và các khai báo tín hi u sau ây:
TYPE byte IS ARRAY (7 DOWNTO 0) OF STD_LOGIC; -- 1D -- array TYPE mem1 IS ARRAY (0 TO 3, 7 DOWNTO 0) OF STD_LOGIC; -- 2D -- array TYPE mem2 IS ARRAY (0 TO 3) OF byte; -- 1Dx1D -- array TYPE mem3 IS ARRAY (0 TO 3) OF STD_LOGIC_VECTOR(0 TO 7); -- 1Dx1D -- array SIGNAL a: STD_LOGIC; -- scalar signal SIGNAL b: BIT; -- scalar signal SIGNAL x: byte; -- 1D signal SIGNAL y: STD_LOGIC_VECTOR (7 DOWNTO 0); -- 1D signal SIGNAL v: BIT_VECTOR (3 DOWNTO 0); -- 1D signal SIGNAL z: STD_LOGIC_VECTOR (x'HIGH DOWNTO 0); -- 1D signal SIGNAL w1: mem1; -- 2D signal SIGNAL w2: mem2; -- 1Dx1D signal SIGNAL w3: mem3; -- 1Dx1D signal -------- Legal scalar assignments: --------------------x(2) <= a; -- same types (STD_LOGIC), correct indexing y(0) <= x(0); -- same types (STD_LOGIC), correct indexing z(7) <= x(5); -- same types (STD_LOGIC), correct indexing b <= v(3); -- same types (BIT), correct indexing w1(0,0) <= x(3); -- same types (STD_LOGIC), correct indexing

- 30 -

ThiÕt kÕ vi m¹ch b»ng VHDL
Table 3.2 Synthesizable data types. Data types Synthesizable values BIT, BIT_VECTOR ‘0’, ‘1’ STD_LOGIC, STD_LOGIC_VECTOR ‘X’, ‘0’, ‘1’, ‘Z’ (resolved) STD_ULOGIC, STD_ULOGIC_VECTOR ‘X’, ‘0’, ‘1’, ‘Z’ (unresolved) BOOLEAN True, False NATURAL From 0 to þ2, 147, 483, 647 INTEGER From _2,147,483,647 to þ2,147,483,647 SIGNED From _2,147,483,647 to þ2,147,483,647 UNSIGNED From 0 to þ2,147,483,647 User-defined integer type Subset of INTEGER User-defined enumerated type Collection enumerated by user SUBTYPE Subset of any type (pre- or user-defined) ARRAY Single-type collection of any type above RECORD Multiple-type collection of any types above Data Types 39 TLFeBOOK w1(2,5) <= y(7); -- same types (STD_LOGIC), correct indexing w2(0)(0) <= x(2); -- same types (STD_LOGIC), correct indexing w2(2)(5) <= y(7); -- same types (STD_LOGIC), correct indexing w1(2,5) <= w2(3)(7); -- same types (STD_LOGIC), correct indexing ------- Illegal scalar assignments: -------------------b <= a; -- type mismatch (BIT x STD_LOGIC) w1(0)(2) <= x(2); -- index of w1 must be 2D w2(2,0) <= a; -- index of w2 must be 1Dx1D ------- Legal vector assignments: ---------------------x <= "11111110"; y <= ('1','1','1','1','1','1','0','Z'); z <= "11111" & "000"; x <= (OTHERS => '1'); y <= (7 =>'0', 1 =>'0', OTHERS => '1'); z <= y; y(2 DOWNTO 0) <= z(6 DOWNTO 4); w2(0)(7 DOWNTO 0) <= "11110000"; w3(2) <= y; z <= w3(1); z(5 DOWNTO 0) <= w3(1)(2 TO 7); w3(1) <= "00000000"; w3(1) <= (OTHERS => '0'); w2 <= ((OTHERS=>'0'),(OTHERS=>'0'),(OTHERS=>'0'),(OTHERS=>'0')); w3 <= ("11111100", ('0','0','0','0','Z','Z','Z','Z',), (OTHERS=>'0'), (OTHERS=>'0')); w1 <= ((OTHERS=>'Z'), "11110000" ,"11110000", (OTHERS=>'0')); ------ Illegal array assignments: ---------------------x <= y; -- type mismatch y(5 TO 7) <= z(6 DOWNTO 0); -- wrong direction of y w1 <= (OTHERS => '1'); -- w1 is a 2D array w1(0, 7 DOWNTO 0) <="11111111"; -- w1 is a 2D array w2 <= (OTHERS => 'Z'); -- w2 is a 1Dx1D array

- 31 -

ThiÕt kÕ vi m¹ch b»ng VHDL
w2(0, 7 DOWNTO 0) <= "11110000"; -- index should be 1Dx1D -- Example of data type independent array initialization: FOR i IN 0 TO 3 LOOP FOR j IN 7 DOWNTO 0 LOOP x(j) <= '0'; y(j) <= '0' 40 Chapter 3 TLFeBOOK z(j) <= '0'; w1(i,j) <= '0'; w2(i)(j) <= '0'; w3(i)(j) <= '0'; END LOOP; END LOOP; ---------------------------------------------------------

* Ví d 3.2: Bit ơn và bit vector Ví d này minh h a s khác nhau gi a phép gán m t bit ơn và phép gán m t bit vector (nghĩa là, BIT v i BIT_VECTOR, STD_LOGIC v i STD_LOGIC_VECTOR, ho c STD_ULOGIC v i STD_ULOGIC_VECTOR). Hai o n mã VHDL ư c gi i thi u phía dư i. C hai th c hi n phép toán AND gi a các tín hi u vào và gán k t qu n tín hi u ra. Ch có m t s khác bi t gi a chúng ó là s lư ng bit c ng vào và c ng ra ( m t bit trong ví d u tiên, 4 bits trong ví d th hai). M ch i n suy ra t các o n mã này ư c bi u di n trên hình 3.2: -- code 1---------------------------------------------------------------------------ENTITY and2 IS PORT (a, b: IN BIT; x: OUT BIT); END and2; -------------------------------------------------------ARCHITECTURE and2 OF and2 IS BEGIN x <= a AND b; END and2; -----------------------------------------------------------code 2--------------ENTITY and2 IS PORT (a, b: IN BIT_VECTOR (0 TO 3); x: OUT BIT_VECTOR (0 TO 3)); END and2; --------------------------------------------------------------ARCHITECTURE and2 OF and2 IS BEGIN x <= a AND b; END and2

- 32 -

ThiÕt kÕ vi m¹ch b»ng VHDL

Hình 3.2. M ch ư c suy ra t mã c a v í d 3.2 K t qu mô ph ng trên Active HDL 6.1: Code 1:

Hình 3.2.a. K t qu mô ph ng cho o n mã 1c a ví d 3.2 Code 2:

Hình 3.2.b. K t qu mô ph ng cho o n mã 1c a ví d 3.2 * Ví d 3.3: B c ng ( Adder)

Hình 3.3. B c ng 4 bit cho ví d 3.3 Hình 3.3 cho th y gi n m c nh c a m t b c ng 4 bit, m ch i n có 2 u vào (a,b) và m t u ra (sum). Có 2 gi i pháp ư c c p. Th nh t, t t c các tín hi u có ki u d li u SIGNED, trong khi gi i pháp th hai u ra có ki u INTEGER. Lưu ý trong gi i pháp th hai có m t hàm chuy n i (conversion function) ư c s d ng dòng 13, ki u c a (a+b) phù h p v i
- 33 -

ThiÕt kÕ vi m¹ch b»ng VHDL
ki u c a t ng. Lưu ý c n bao g m c gói std_logic_arith (dòng 4 c a m i gi i pháp), có mô t ki u d li u SIGNED. Nh l i r ng m t giá tr SIGNED ư c mô t gi ng như m t vector, nghĩa là, tương t như STD_LOGIC_VECTOR, không gi ng INTEGER. Code:
---------------------------------------------------1 ----- Solution 1: in/out=SIGNED ---------2 LIBRARY ieee; 3 USE ieee.std_logic_1164.all; 4 USE ieee.std_logic_arith.all; 5 -----------------------------------------6 ENTITY adder1 IS 7 PORT ( a, b : IN SIGNED (3 DOWNTO 0); 8 sum : OUT SIGNED (4 DOWNTO 0)); 9 END adder1; 10 -----------------------------------------11 ARCHITECTURE adder1 OF adder1 IS 12 BEGIN 13 sum <= a + b; 14 END adder1; 15 ----------------------------------------------------------------------------------------1 ------ Solution 2: out=INTEGER ----------2 LIBRARY ieee; 3 USE ieee.std_logic_1164.all; 4 USE ieee.std_logic_arith.all; 5 -----------------------------------------6 ENTITY adder2 IS 7 PORT ( a, b : IN SIGNED (3 DOWNTO 0); 8 sum : OUT INTEGER RANGE -16 TO 15); 9 END adder2; 10 -----------------------------------------11 ARCHITECTURE adder2 OF adder2 IS 12 BEGIN 13 sum <= CONV_INTEGER(a + b); 14 END adder2; 15 ------------------------------------------

* K t qu mô ph ng trên Active HDL 6.1

Hình 3.4 K t qu mô ph ng cho ví d 3.3

- 34 -

ThiÕt kÕ vi m¹ch b»ng VHDL

Chương 4: Toán t và thu c tính.
4.1. Toán t . VHDL cung c p m t s toán t sau: Toán t gán. Toán t logic. Toán t toán h c. Toán t so sánh. Toán t d ch. Sau ây chúng ta s xem xét c th t ng toán t m t. 4.1.1 Toán t gán. VHDL nh nghĩa ba lo i toán t gán sau: <=: Dùng gán giá tr cho SIGNAL. := : Dùng gán giá tr cho VARIABLE, CONSTANT,GENERIC. =>: Dùng gán giá tr cho thành ph n các vector và các lo i giá tr khác. Ví d :
SIGNAL x : STD_LOGIC; VARIABLE y : STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL w: STD_LOGIC_VECTOR(0 TO 7); x <= '1'; y := "0000 w <= "10000000"; w <= (0 =>'1', OTHERS =>'0');

4.1.2 Toán t Logic. VHDL nh nghĩa các toán t logic sau: NOT, AND, OR, NAND, NOR, XOR, XNOR D li u cho các toán t này ph i là ki u: BIT, STD_LOGIC, STD_ULIGIC, BIT_VECTOR, STD_LOGIC_VECTOR, STD_ULOGIC_VECTOR. Ví d :
y <= NOT a AND b; y <= NOT (a AND b); y <= a NAND b;

4.1.3 Toán t toán h c. Các toán t này dùng cho các ki u d li u s như là:INTEGER, SIGNED, UNSIGNED, REAL. Các toán t bao g m: + Toán t c ng. Toán t tr . * Toán t nhân. / Toán t chia.
- 35 -

ThiÕt kÕ vi m¹ch b»ng VHDL
** MOD REM ABS 4.1.4 Toán t so sánh. Có các toán t so sánh sau: = So sánh b ng /= So sánh không b ng. < So sánh nh hơn. > So sánh l n hơn. <= So sánh nh hơn ho c b ng. >= So sánh l n hơn ho c b ng. 4.1.5 Toán t d ch. Cú pháp s d ng toán t d ch là: <left operand> <shift operation> <right operand> Trong ó <left operand> có ki u là BIT_VECTOR, còn <right operand> có ki u là INTEGER. Có hai toán t d ch: Sll Toán t d ch trái. i n 0 vào phía ph i. Rll Toán t d ch ph i. i n 0 vào phía trái. 4.2. Thu c tính. Toán t l y mũ. Phép chia l y ph n nguyên. Phép chia l y ph n dư. Phép l y giá tr tuy t i.

4.1.1. Thu c tính d li u. VHDL cung c p các thu c tính sau. d’LOW Tr v giá tr nh nh t c a ch s m ng. d’HIGH Tr v ch s l n nh t c a m ng. d’LEFT Tr v ch s bên trái nh t c a m ng. d’RIGHT Tr v ch s bên ph i nh t c a m ng. d’LENGTH Tr v kích thư c c a m ng. d’RANGE Tr v m ng ch a ch s . d’REVERSE_RANGE Tr v m ng ch a ch s ư c o ngư c. Ví d : N u d là m t vector ư c khai báo như sau:
SIGNAL d : STD_LOGIC_VECTOR(0 TO 7)

Ta s có:
d'LOW = 0, d'HIGH = 7, d'LEFT = 7, d'RIGHT = 0, d'LENGTH = 8, d'RANGE = (7 downto 0), d'REVERSE_RANGE = (0 to 7).

Các thu c tính này có th dùng trong các vòng l p:
FOR FOR FOR FOR i i i i IN IN IN IN RANGE (0 TO 7) LOOP ... x'RANGE LOOP ... RANGE (x'LOW TO x'HIGH) LOOP ... RANGE (0 TO x'LENGTH-1) LOOP ...

N u tín hi u có ki u li t kê thì: d’VAL(pos)

Tr v giá tr t i pos.

- 36 -

ThiÕt kÕ vi m¹ch b»ng VHDL
d’POS(val) d’LEFTOF(value) d’VAL(row,colum)

Tr v v trí có giá tr là val. Tr v giá tr v trí bên trái c a value. Tr v giá tr m t v trí c bi t.

4.1.2. Thu c tính tín hi u. Các thu c tính lo i này ch ư c áp d ng i v i d li u SIGNAL. N u s là m t SIGNAL thì ta có : s’EVENT : Tr v true khi m t s ki n x y ra i v i s. s’STABLE: Tr v true n u không có s ki n nào x y ra i v i s. s’ACTIVE: Tr v true khi s = 1. s’QUIET<time>: Tr v true khi trong kho ng th i gian time khong có s ki n nào x y ra. s’LAST_EVENT: Tr v th i gian trôi qua k t s ki n cu i cùng s’LAST_ACTIVE: Tr v th i gian k t l n cu i cùng s = 1 s’LAST_VALUE: Tr v giá tr c a s trư c s ki n trư c ó. Trong các thu c tính trên thì thu c tính s’EVENT là hay ư c dùng nh t. Vi d : ây là ví d v i tín hi u ng h .
IF (clk'EVENT AND clk='1')... IF (NOT clk'STABLE AND clk='1')... WAIT UNTIL (clk'EVENT AND clk='1'); IF RISING_EDGE(clk)...

4.3.

Thu c tính ư c

nh nghĩa b i ngư i dùng.

VHDL, ngoài vi c cung c p các thu c tính có s n nó còn cho phép ngư i dùng t nh nghĩa các thu c tính. Các thu c tính này mu n s d ng c n ph i khai báo và mô t rõ ràng theo c u trúc sau:
ATTRIBUTE <attribute_name>:< attribute_type>; ATTRIBUTE <attribute_name> OF< target_name>: <class> IS <value>;

Trong ó + attribute_type là ki u d li u. + Class : SIGNAL, TYPE, FUNCTION. Ví d :
ATTRIBUTE number_of_inputs: INTEGER; ATTRIBUTE number_of_inputs OF nand3: SIGNAL IS 3;

4.4.

Ch ng toán t .

Cũng gi ng như các thu c tính ư c nh nghĩa b i ngư i dùng. Trong VHDL ta cũng có th xây d ng ch ng các toán t toán h c. xây d ng ch ng
- 37 -

ThiÕt kÕ vi m¹ch b»ng VHDL
các toán t này ta c n ph i ch rõ lo i d li u tham gia. Ví d như toán t + trên ch áp d ng cho các lo i d li u cùng ki u s .Bây gi ta xây d ng toán t + dùng c ng m t s INTEGER v i m t BIT.
FUNCTION "+" (a: INTEGER, b: BIT) RETURN INTEGER IS BEGIN IF (b='1') THEN RETURN a+1; ELSE RETURN a; END IF; END "+";

4.5.

GENERIC.

GENERIC là m t cách t o các tham s dùng chung (gi ng như các bi n static trong các ngôn ng l p trình). M c ích là cho các o n code m m d o và d s d ng l i hơn. M t o n GENERIC khi ư c s d ng c n ph i ư c mô t trong ENTITY. Các tham s ph i ư c ch rõ. C u trúc như sau:

GENERIC (parameter_name : parameter_type := parameter_value);
Ví d : Ví d sau s nh nghĩa bi n n có ki u INTEGER và là GENERIC nó có giá tr m c nh là 8. Khi ó khi n ư c g i b t kỳ âu, trong m t ENTITY hay m t ARCHITECTURE theo sau ó giá tr c a nó luôn là 8.
ENTITY my_entity IS GENERIC (n : INTEGER := 8); PORT (...); END my_entity; ARCHITECTURE my_architecture OF my_entity IS ... END my_architecture;

Có th có nhi u hơn 1 tham s GENERIC ư c mô t trong m t ENTITY. Ví d :
GENERIC (n: INTEGER := 8; vector: BIT_VECTOR := "00001111");

4.6. Ví d . làm rõ hơn các v n ã nói trên chúng ta s xem xét m t vài ví d sau: Ví d 1: Generic Decoder. Hình v sau ây mô ph ng m t b gi i mã có hai u vào. M t tín hi u vào d li u sel g m m bít và m t tín hi u là ena. Nó có m t u ra d li u g m n bít. Có m = log2(n).

- 38 -

ThiÕt kÕ vi m¹ch b»ng VHDL

Hình 4.1. B mã hoá cho ví d 4.1 Khi tín hi u ena = ‘0’ thì t t c các bít u ra x = ‘1’. u ra ư c ch n theo u vào sel. Chương trình sau ây mô t v i tư ng này v i 3 u vào sel và phía u ra có 8 ư ng x.
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY decoder IS PORT ( ena : IN STD_LOGIC; sel : IN STD_LOGIC_VECTOR (2 DOWNTO 0); x : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END decoder; ARCHITECTURE generic_decoder OF decoder IS BEGIN
PROCESS (ena, sel) VARIABLE temp1 : STD_LOGIC_VECTOR (x'HIGH DOWNTO 0); VARIABLE temp2 : INTEGER RANGE 0 TO x'HIGH; BEGIN temp1 := (OTHERS => '1'); temp2 := 0; IF (ena='1') THEN FOR i IN sel'RANGE LOOP IF (sel(i)='1') THEN temp2:=2*temp2+1; ELSE temp2 := 2*temp2; END IF; END LOOP; temp1(temp2):='0'; END IF; x <= temp1; END PROCESS; END generic_decoder;

- 39 -

ThiÕt kÕ vi m¹ch b»ng VHDL
Hình sau ây mô t k t qu ho t ng c a b gi i mã trên.

Hình 4.2 Mô ph ng k t qu c a b mã hoá Như chúng ta th y khi ena =0 thì t t c các bít phía u ra u b ng 1. Khi ena = 1 thì ch m t bít phía u ra ư c ch n t c là b ng 0. Ví d như khi sel=’000’ thì u ra x = ‘11111110’, sel = ‘001’ x = ‘11111101’…. Trong ví d trên ta ã s d ng các toán t +, * , các toán t gán và thu c tính RANGE. Ví d 2 : Generic parity detector. Ví d sau ây mô ph ng m t m ch phát hi n tính parity. Nó bao g m m t u vào n bít và m t u ra. u ra s có giá tr b ng 0 khi s u vào có giá tr là m t là m t s ch n và b ng 1 trong các trư ng h p còn l i.

Hình 4.3. B phát hi n bít chãn l Sau ây là mã ngu n mô t m ch trên.
ENTITY parity_det IS GENERIC (n : INTEGER := 7); PORT ( input: IN BIT_VECTOR (n DOWNTO 0); output: OUT BIT); END parity_det; ARCHITECTURE parity OF parity_det IS BEGIN PROCESS (input) VARIABLE temp: BIT; BEGIN temp := '0'; FOR i IN input'RANGE LOOP temp := temp XOR input(i); END LOOP; output <= temp; END PROCESS; END parity;

- 40 -

ThiÕt kÕ vi m¹ch b»ng VHDL
Trong o n mã trên chúng ta ã s d ng m t m nh GENERIC nh nghĩa n =7. Khi ó t t c các l n n xu t hi n nó u có giá tr là 7. K t qu c a m ch ư c bi u di n b i hình sau. Khi u vào input =’00000000’ thì u ra output =’0’. Khi input =’00000001’ thì u ra output = ‘1’ vì s u vào là 1 là m t s l .

Hình 4.4. Mô ph ng k t qu c a hình 4.2 Ví d 3: Parity Generator M ch sau s thêm m t bít parity vào tín hi u input. Bít này là 0 khi s u vào =1 c a input là m t s ch n và b ng 0 trong trư ng h p ngư c l i. Như v y m ch s g m n-1 u vào d li u và n u ra, trong ó n-1 u ra bên ph i gi ng như n-1 u vào, u ra còn l i là giá tr ki m tra parity.

Hình 4.5. B phát bit ch n l c a ví d 4.3
ENTITY parity_gen IS GENERIC (n : INTEGER := 7); PORT ( input: IN BIT_VECTOR (n-1 DOWNTO 0); output: OUT BIT_VECTOR (n DOWNTO 0)); END parity_gen; ARCHITECTURE parity OF parity_gen IS BEGIN PROCESS (input) VARIABLE temp1: BIT; VARIABLE temp2: BIT_VECTOR (output'RANGE); BEGIN temp1 := '0'; FOR i IN input'RANGE LOOP temp1 := temp1 XOR input(i); temp2(i) := input(i); END LOOP; temp2(output'HIGH) := temp1; output <= temp2; END PROCESS; END parity;

- 41 -

ThiÕt kÕ vi m¹ch b»ng VHDL
K t qu :
50 1 00 01 81 1 50 200 02 82 250 300 03 03 350 400 04 84 450 500 05 05 ns

input output

00 00

Hình 4.6. Mô ph ng k t qu c a ví d 4.3 Như ta th y khi u vào input =’0000000’ thì u ra output = ‘00000000’. Khi u vào input =’0000001’ thì u ra output = ‘10000001’.

- 42 -

ThiÕt kÕ vi m¹ch b»ng VHDL

Chương 5: Mã song song
5.1. Song song và tu n t .

u tiên chúng ta s xem xét s khác bi t gi a m ch t h p và m ch dãy sau ó s xem sét s khác bi t gi a mã ngu n tu n t và mã song song. 5.1.1. M ch t h p và m ch dãy. M ch t h p là m ch mà u ra c a m ch ch ph thu c vào u vào c a h t i th i i m hi n t i. T ó ta th y, h này không c n yêu câu b nh và chúng ư c t o thành ch t các c ng logic cơ b n. M ch dãy là m ch mà u ra c a m ch còn ph thu c vào c u vào trong quá kh c a m ch. T ó ta th y i v i h này c n ph i có b nh và m t vòng ph n h i tín hi u. Hính sau ây mô t hai lo i m ch này.

Hình 5.1. M ch t h p và m ch dãy 5.1.2. Mã song song và mã tu n t . Mã ngu n VHDL là song song. Ch các o n mã trong m t PROCESS, FUNCTION, PROCEDURE là tu n t . Các kh i này ư c th c hi n m t cách tu n t . Mã song song ươc g i là mã lu ng d li u ( dataflow code). Ví d . M t o n mã g m ba kh i l nh song song ( stat1, stat 2, stat3). Khi ó các o n sau s th c hi n cùng m t lúc trong m ch v t lý.

Các o n mã song song không th s d ng các thành ph n c a m ch ng b ( ho t ng ch x y ra khi có s ng b c a xung ng h .). M t cách khác chúng ta ch có th xây d ng d a trên các m ch t h p. Trong m c này chúng ta tìm hi u v các o n mã song song. Chúng ta ch tìm hi u các o n mã ư c s d ng bên ngoài PROCESS, FUNCTION, PROCEDURES. Chúng là các kh i l n WHEN và GENERATE. Bên c nh ó, các phép gán dùng các

- 43 -

ThiÕt kÕ vi m¹ch b»ng VHDL
toán t ư c s d ng t o các m ch t h p. Cu i cùng m t lo i kh i l n bi t ư c g i là BLOCK s ư c s d ng. 5.2. S d ng các toán t . c

ây là cách cơ b n nh t dùng t o các o n mã song song. Các toán t (AND, OR, ..) ư c tìm hi u trên s ư c li t kê b ng dư i ây. Các toán t có th ư c s d ng như là m t thành ph n c a m ch t h p. Tuy nhiên rõ ràng. Các m ch hoàn ch nh s s d ng cách vi t tu n t m c dù các m ch không ch a các ph n t tu n t . Các ví d sau ây ư c thi t k ch s d ng các thành ph n logic cơ b n.

B ng 5.1. Các toán t Ví d : B d n kênh 4 -1.

Hình 5.2. B d n kênh B d n kênh 4-1 có 4 u vào d li u, hai u vào i u khi n và m t u ra. Tín hi u u ra s là tín hi u c a m t trong 4 u vào tuỳ theo giá tr c a hai u vào i u khi n s0,s1. Sau ây là chương trình mô ph ng.
LIBRARY ieee; USE ieee.std_logic_1164.all; --------------------------------------------ENTITY mux IS PORT ( a, b, c, d, s0, s1: IN STD_LOGIC; y: OUT STD_LOGIC); END mux; --------------------------------------------ARCHITECTURE pure_logic OF mux IS

- 44 -

ThiÕt kÕ vi m¹ch b»ng VHDL
BEGIN y <= (a AND NOT s1 AND NOT s0) OR (b AND NOT s1 AND s0) OR (c AND s1 AND NOT s0) OR (d AND s1 AND s0); END pure_logic;

K t q a mô ph ng.
50 1 00 1 50 200 250 300 350 400 450 500 ns

a b c d s0 s1 y

Hình 5.3. Mô ph ng k t qu c a ví d 5.1 5.3. M nh WHEN.

WHEN là môt thành ph n c a các kh i l n song song. Nó xu t hi n trong hai trư ng h p. WHEN / ELSE và WITH / SELECT / WHEN. Cú pháp ư c trình b y như sau.

Ví d :
------ With WHEN/ELSE -----------------------outp <= "000" WHEN (inp='0' OR reset='1') ELSE "001" WHEN ctl='1' ELSE "010"; ---- With WITH/SELECT/WHEN ------------------WITH control SELECT output <= "000" WHEN reset, "111" WHEN set,

- 45 -

ThiÕt kÕ vi m¹ch b»ng VHDL
UNAFFECTED WHEN OTHERS;

Sau ây ta s xem xét các ví d dùng m nh Ví d 1: B d n kênh 4 -1.

WHEN.

Nguyên t c ho t ng c a m ch này ta ã nói trên. ây chúng ta s dùng m nh WHEN thay cho cá toán t . Chúng ta có th dùng theo c hai cách. d hi u chúng ta s xem xét c hai cách s d ng m nh WHEN.

Hình 5.4. B d n k nh cho ví d 2 ------- S d ng WHEN/ELSE -------LIBRARY ieee; USE ieee.std_logic_1164.all; ------------------------------------------ENTITY mux IS PORT ( a, b, c, d: IN STD_LOGIC; sel: IN STD_LOGIC_VECTOR (1 DOWNTO 0); y: OUT STD_LOGIC); END mux; ------------------------------------------ARCHITECTURE mux1 OF mux IS BEGIN y <= a WHEN sel="00" ELSE b WHEN sel="01" ELSE c WHEN sel="10" ELSE d; END mux1;

-------------------------------------------

--- S d ng WITH/SELECT/WHEN ----LIBRARY ieee; USE ieee.std_logic_1164.all; ------------------------------------------ENTITY mux IS PORT ( a, b, c, d: IN STD_LOGIC; sel: IN STD_LOGIC_VECTOR (1 DOWNTO 0); y: OUT STD_LOGIC); END mux; ------------------------------------------ARCHITECTURE mux2 OF mux IS BEGIN WITH sel SELECT

- 46 -

ThiÕt kÕ vi m¹ch b»ng VHDL
y <= a WHEN "00", b WHEN "01", c WHEN "10", d WHEN OTHERS; END mux2; --------------------------------------------

Ví d 2: B

m 3 tr ng thái.

Hình 5.5. B M ch b m 3 tr ng thái cho kháng cao khi ena = 1.

m 3 tr ng thái u ra output = input khi ena = 0 và tr

LIBRARY ieee; USE ieee.std_logic_1164.all; ---------------------------------------------ENTITY tri_state IS PORT ( ena: IN STD_LOGIC; input: IN STD_LOGIC_VECTOR (7 DOWNTO 0); output: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END tri_state; ---------------------------------------------ARCHITECTURE tri_state OF tri_state IS BEGIN output <= input WHEN (ena='0') ELSE (OTHERS => 'Z'); END tri_state;

----------------------------------------------

K t qu mô ph ng
50 1 00 1 50 200 250 300 350 400 450 500 ns

ena input output
01 01 00 00 ZZ 01 01 00 ZZ

Hình 5.6. K t qu mô ph ng cho ví d 5.3

- 47 -

ThiÕt kÕ vi m¹ch b»ng VHDL

Ví d 3: Encoder.

Hình 5.7. B mã hoá cho ví d 5.4 M t b ENCODER có n u vào, m u ra v i m = log2 (n). T i m t th i i m ch có m t bít u vào b ng 1. Sau ây là chương trình mô ph ng s d ng WHEN theo c hai cách dùng WHEN / ELSE,và WITH / SELECT / WHEN. ---- s d ng WHEN/ELSE ------------LIBRARY ieee; USE ieee.std_logic_1164.all; --------------------------------------------ENTITY encoder IS PORT ( x: IN STD_LOGIC_VECTOR (7 DOWNTO 0); y: OUT STD_LOGIC_VECTOR (2 DOWNTO 0)); END encoder; --------------------------------------------ARCHITECTURE encoder1 OF encoder IS BEGIN y <= "000" WHEN x="00000001" ELSE "001" WHEN x="00000010" ELSE "010" WHEN x="00000100" ELSE "011" WHEN x="00001000" ELSE "100" WHEN x="00010000" ELSE "101" WHEN x="00100000" ELSE "110" WHEN x="01000000" ELSE "111" WHEN x="10000000" ELSE "ZZZ"; END encoder1; ---------------------------------------------

---- S

d ng WITH/SELECT/WHEN ------

LIBRARY ieee; USE ieee.std_logic_1164.all; --------------------------------------------ENTITY encoder IS PORT ( x: IN STD_LOGIC_VECTOR (7 DOWNTO 0); y: OUT STD_LOGIC_VECTOR (2 DOWNTO 0)); END encoder; --------------------------------------------ARCHITECTURE encoder2 OF encoder IS BEGIN WITH x SELECT y <= "000" WHEN "00000001", "001" WHEN "00000010", "010" WHEN "00000100", "011" WHEN "00001000",

- 48 -

ThiÕt kÕ vi m¹ch b»ng VHDL
"100" "101" "110" "111" "ZZZ" WHEN WHEN WHEN WHEN WHEN "00010000", "00100000", "01000000", "10000000", OTHERS;

END encoder2; ---------------------------------------------

K t qu mô ph ng:
1 00 200 02 1 300 03 Z 400 04 2 500 05 Z 600 06 700 07 800 08 3 900 09 Z 1 000 0A ns 0B

x y

00 Z

01 0

Hình 5.8. K t qu mô ph ng cho ví d 5.4 Ví d 4: ALU.

Hình 5.9. ALU M ch ALU th c hi n các phép toán logic và toán h c i v i hai u vào a và b. Chúng ư c i u khi n b i 4 bít sel(3:0). Tuỳ thu c vào giá tr c a sel mà kh i s th c hi n thao tác nào v i d li u. B ng dư i ây mô t các thao tác c a ALU.

Hình 5.9.b. Ho t

ng chinh c a các ph n t ALU

- 49 -

ThiÕt kÕ vi m¹ch b»ng VHDL

Mã ngu n th c hi n mô ph ng:
---------------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; ---------------------------------------------ENTITY ALU IS PORT (a, b: IN STD_LOGIC_VECTOR (7 DOWNTO 0); sel: IN STD_LOGIC_VECTOR (3 DOWNTO 0); cin: IN STD_LOGIC; y: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END ALU; ---------------------------------------------ARCHITECTURE dataflow OF ALU IS SIGNAL arith, logic: STD_LOGIC_VECTOR (7 DOWNTO 0); BEGIN ----- Arithmetic unit: -----WITH sel(2 DOWNTO 0) SELECT arith <= a WHEN "000", a+1 WHEN "001", a-1 WHEN "010", b WHEN "011", b+1 WHEN "100", b-1 WHEN "101", a+b WHEN "110", a+b+cin WHEN OTHERS; ----- Logic unit: ----------WITH sel(2 DOWNTO 0) SELECT logic <= NOT a WHEN "000", NOT b WHEN "001", a AND b WHEN "010", a OR b WHEN "011", a NAND b WHEN "100", a NOR b WHEN "101", a XOR b WHEN "110", NOT (a XOR b) WHEN OTHERS; -------- Mux: --------------WITH sel(3) SELECT y <= arith WHEN '0', logic WHEN OTHERS; END dataflow; ----------------------------------------------

K t qu mô ph ng.
50 1 00 01 02 01 1 50 200 02 02 02 250 300 03 04 03 350 400 04 03 04 450 500 05 05 05 ns

a arith b cin logic sel y

00 00 00

FF 0 00

FE 1 02

FD 0 02

FC 1 04

04 2 03

05 3 05

Hình 5.10. K t qu mô ph ng c a ví d 5.5
- 50 -

ThiÕt kÕ vi m¹ch b»ng VHDL
5.4. GENERATE.

GENERATE là m t kh i l nh song song khác. Nó tương ương v i kh i l nh tu n t LOOP trong vi c cho phép các o n l nh ư c th c hi n l p l i m t s l n nào ó. M u dùng c a nó là FOR / GENERATE.
label: FOR identifier IN range GENERATE (concurrent assignments) END GENERATE;

M t cách khác s d ng GENERATE là dùng IF. ây m nh ELSE không ư c s d ng. M t cách hay ư c s d ng là dùng IF trong FOR/GENERATE. M u s d ng như sau.
label1: FOR identifier IN range GENERATE ... label2: IF condition GENERATE (concurrent assignments) END GENERATE; ... END GENERATE;

Ví d :
SIGNAL x: BIT_VECTOR (7 DOWNTO 0); SIGNAL y: BIT_VECTOR (15 DOWNTO 0); SIGNAL z: BIT_VECTOR (7 DOWNTO 0); ... G1: FOR i IN x'RANGE GENERATE z(i) <= x(i) AND y(i+8); END GENERATE;

M t i u c n ph i chú ý là gi i h n c a dãy ph i ư c khai báo là static n u không s không h p l . Trong ví d sau choice không ư c khai báo là static nên không h p l :
NotOK: FOR i IN 0 TO choice GENERATE (concurrent statements) END GENERATE;

hi u rõ hơn v kh i l nh GENERATE chúng ta s xét ví d sau: Ví d : Vector shifter. Ví d sau minh ho cho vi c s d ng GENERATE. Trong ó u vào s ư c d ch i m t bít và t o thành u ra. Ví d u vào có 4 ư ng và giá tr ban u là 1111 thì u ra s ư c mô t như sau: row(0): 0 0 0 0 1 1 1 1 row(1): 0 0 0 1 1 1 1 0 row(2): 0 0 1 1 1 1 0 0 row(3): 0 1 1 1 1 0 0 0 row(4): 1 1 1 1 0 0 0 0 Chương trình mô ph ng.
-----------------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; -----------------------------------------------ENTITY shifter IS

- 51 -

ThiÕt kÕ vi m¹ch b»ng VHDL
PORT ( inp: IN STD_LOGIC_VECTOR (3 DOWNTO 0); sel: IN INTEGER RANGE 0 TO 4; outp: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END shifter; -----------------------------------------------ARCHITECTURE shifter OF shifter IS SUBTYPE vector IS STD_LOGIC_VECTOR (7 DOWNTO 0); TYPE matrix IS ARRAY (4 DOWNTO 0) OF vector; SIGNAL row: matrix; BEGIN row(0) <= "0000" & inp; G1: FOR i IN 1 TO 4 GENERATE row(i) <= row(i-1)(6 DOWNTO 0) & '0'; END GENERATE; outp <= row(sel); END shifter;

K t qu mô ph ng:
50 100 1 01 1 150 200 0 02 2 250 300 0 03 3 04 4 350 400 450 500 ns

inp outp sel

0 00 0

Hình 5.11. K t qu mô ph ng c a ví d 5.6 Như hình ta th y, n u input = “0011”thì u ra output =”00000011” khi sel = 0. output = “00000110” khi sel = 1. output = 00001100 n u sel = 2. 5.5. BLOCK. Có hai lo i kh i l nh BLOCK : Simple và Guarded. 5.5.1. Simple BLOCK Kh i l nh BLOCK cho phép i u ó giúp cho các o n l nh d như sau: t m t kh i l nh song song vào m t o n, c và d qu n lý hơn. C u trúc c a chúng

label: BLOCK [declarative part] BEGIN (concurrent statements) END BLOCK label;

Các kh i l nh BLOCK

t liên ti p nhau như ví d sau:

-----------------------ARCHITECTURE example ... BEGIN ... block1: BLOCK BEGIN

- 52 -

ThiÕt kÕ vi m¹ch b»ng VHDL
... END BLOCK block1 ... block2: BLOCK BEGIN ... END BLOCK block2; ... END example; ------------------------

Ví d :
b1: BLOCK SIGNAL a: STD_ BEGIN a <= input_sig END BLOCK b1;

M t o n BLOCK có th cú pháp như sau:

ư c

t trong m t o n BLOCK khác, khi ó

label1: BLOCK [declarative part of top block] BEGIN [concurrent statements of top block] label2: BLOCK [declarative part nested block] BEGIN (concurrent statements of nested block) END BLOCK label2; [more concurrent statements of top block] END BLOCK label1;

5.5.2. Guarded BLOCK M t Guarded BLOCK là m t kh i BLOCK c bi t. Nó ch a m t i u ki n và BLOCK ch ư c th c hi n khi i u ki n ó có giá tr là TRUE. C u trúc như sau:
label: BLOCK (guard expression) [declarative part] BEGIN (concurrent guarded and statements) END BLOCK label;

unguarded

tìm hi u rõ hơn v kh i BLOCK ta i xét ví d sau: Víd 1: Ch t s d ng Guarded BLOCK. Trong ví d này khi nào clk = ‘1’ thì kh i ươc ho t ng khi ó kh i l nh s ơc th c hi n.
------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; ------------------------------ENTITY latch IS PORT (d, clk: IN STD_LOGIC; q: OUT STD_LOGIC); END latch;

- 53 -

ThiÕt kÕ vi m¹ch b»ng VHDL
------------------------------ARCHITECTURE latch OF latch IS BEGIN b1: BLOCK (clk='1') BEGIN q <= GUARDED d; END BLOCK b1; END latch; -------------------------------

K t qu mô ph ng
1 00 200 300 400 500 600 700 800 900 1 000 ns

clk d q

Hình 5.12. K t qu mô ph ng cho ví d 5.7 Ví d 2: DFF dùng Guarded BLOCK.Trong ví d này chúng ta s xem xét ho t ng c a m t TrigerT ho t ng ng b sư n dương.
------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; ------------------------------ENTITY dff IS PORT ( d, clk, rst: IN STD_LOGIC; q: OUT STD_LOGIC); END dff; ------------------------------ARCHITECTURE dff OF dff IS BEGIN b1: BLOCK (clk'EVENT AND clk='1') BEGIN q <= GUARDED '0' WHEN rst='1' ELSE d; END BLOCK b1; END dff; ------------------------------

K t qu mô ph ng:
1 00 200 300 400 500 600 700 800 900 1 000 ns

clk d q rst

Hình 5.13. K t qu mô ph ng c a ví d 5.8

- 54 -

ThiÕt kÕ vi m¹ch b»ng VHDL

Chương 6: Mã tu n t
6.1. PROCESS

PROCESS là ph n tu n t c a mã VHDL. Nó ư c mô t b i các câu l nh IF, WAIT, CASE, ho c LOOP, và b i danh sách nh y (ngo i tr WAIT ư c s d ng). PROCESS ph i ư c cài t trong mã chính, và ư c th c thi m i th i i m m t tín hi u trong danh sách nh y thay i.
Cú pháp: [label:] PROCESS (sensitivity list) [VARIABLE name type [range] [:= initial_value;]] BEGIN (sequential code) END PROCESS [label];

VARIABLES là tuỳ ch n. N u s d ng, chúng ph i ư c khai báo trong ph n khai báo c a PROCESS (trư c t khoá BEGIN). Giá tr kh i t o không th k t h p, ch l y i di n khi mô ph ng. Nhãn cũng ư c s d ng tuỳ ch n, m c ích là nâng cao kh năng c ư c c a mã. Nhãn có th là b t kỳ t nào, ngo i tr t khoá. Ví d 6.1a:

Hình 6.1a.1 DFF v i tín hi u reset không
1 0 20 30 40 50 60

ng b
70 80 90 ns

rst d clk q

Hình 6.1a.2 K t qu mô ph ng
library IEEE; use IEEE.STD_LOGIC_1164.all; entity DFF is

- 55 -

ThiÕt kÕ vi m¹ch b»ng VHDL
Port(d,clk,rst:in std_logic; q:out std_logic); end DFF; architecture Behaviour of DFF is begin process(clk,rst) begin -- wait on rst,clk; if (rst='1') then q <= '0'; elsif (clk'Event and clk='1') then q <= d; end if; end process; end Behaviour;

6.2.

Signals và Variables.

VHDL có hai cách nh nghĩa các giá tr không tĩnh: b ng SIGNAL ho c b ng VARIABLE. SIGNAL có th ư c khai báo trong PACKAGE, ENTITY ho c ARCHITECTURE (trong ph n khai báo c a nó), trong khi VARIABLE có th ư c mô t bên trong m t ph n c a mã tu n t (trong PROCESS). Do ó, trong khi giá tr c a ph n trư c có th là toàn c c, ph n sau luôn là c c b . Giá tr c a VARIABLE có th không bao gi nh nghĩa ngoài PROCESS m t cách tr c ti p, n u c n, thì nó ph i ư c gán thành SIGNAL. Trong cách x lý khác, c p nh t VARIABLE là t c thì, ta có th tính toán t c thì giá tr m i c a nó trong dòng l nh ti p theo. i u ó không ph i là trư ng h p c a SIGNAL (khi ư c s d ng trong PROCESS), giá tr m i c a nó ch t ng quát ư c b o toàn có th dùng ư c sau khi k t thúc quá trình ch y hi n t i c a PROCESS. Phép toán gán cho SIGNAL là “<=” (sig <= 5), trong khi v i VARIABLE là “:=” (var := 5). 6.3. IF.

IF, WAIT, CASE, và LOOP là các câu l nh i v i mã tu n t . Do ó, chúng ch có th ư c s d ng bên trong PROCESS, FUNCTION ho c PROCEDURE. V nguyên t c, có m t k t qu ph nh, t ng h p s t i ưu hoá c u trúc và tránh i sâu vào ph n c ng. Cú pháp:
IF conditions THEN assignments; ELSIF conditions THEN assignments; ... ELSE assignments;

END IF;
- 56 -

ThiÕt kÕ vi m¹ch b»ng VHDL

Ví d :
IF (x<y) THEN temp:="11111111"; ELSIF (x=y AND w='0') THEN temp:="11110000"; ELSE temp:=(OTHERS =>'0');

Ví d 6.3a:

Hình 6.2a.1. B
1 0 20 30 40 50 60

m ch s th p phân
70 80 90 1 00 10 1 1 20 1 30 1 40 1 50 1 60 ns

clk digit
0 1 2 3 4 5 6 7 8 9

Hình 6.2a.2. K t qu mô ph ng
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY counter IS PORT (clk : IN STD_LOGIC; digit : OUT INTEGER RANGE 0 TO 9); END counter; ARCHITECTURE counter OF counter IS BEGIN count: PROCESS(clk) VARIABLE temp : INTEGER RANGE 0 TO 10; BEGIN IF (clk'EVENT AND clk='1') THEN temp := temp + 1; IF (temp=10) THEN temp := 0; END IF; END IF; digit <= temp; END PROCESS count; END counter;

- 57 -

ThiÕt kÕ vi m¹ch b»ng VHDL
Ví d 6.3b:

Hình 6.3b.1. Thanh ghi d ch 4 bit
50 1 00 1 50 200 250 300 350 400 450 500 550 600 650 ns

clk rst d internal q
U ? ? ? C 6 3 1 0

Hình 6.3b.2. K t qu mô ph ng
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY shiftreg IS GENERIC (n: INTEGER := 4); -- # of stages PORT (d, clk, rst: IN STD_LOGIC; q: OUT STD_LOGIC); END shiftreg; ARCHITECTURE behavior OF shiftreg IS SIGNAL internal: STD_LOGIC_VECTOR (n-1 DOWNTO 0); BEGIN PROCESS (clk, rst) BEGIN IF (rst='1') THEN internal <= (OTHERS => '0'); ELSIF (clk'EVENT AND clk='1') THEN internal <= d & internal(internal'LEFT DOWNTO 1); END IF; END PROCESS; q <= internal(0); END behavior;

6.4.

WAIT.

Phép toán WAIT ôi khi tương t như IF. Tuy nhiên, nhi u hơn m t nh d ng có th dùng ư c. Hơn n a, khi IF, CASE, ho c LOOP ư c s d ng, PROCESS không th có m t danh sách nh y khi WAIT ư c s d ng.

- 58 -

ThiÕt kÕ vi m¹ch b»ng VHDL
Cú pháp:
WAIT UNTIL signal_condition; WAIT ON signal1 [, signal2, ... ]; WAIT FOR time;

Câu l nh WAIT UNTIL nh n ch m t tín hi u, do ó thích h p cho mã ng b hơn là mã không ng b . Khi PROCESS không có danh sách nh y trong trư ng h p này, WAIT ph i là câu l nh u tiên trong PROCESS. PROCESS ư c th c hi n m i th i i m khi g p i u ki n. Ví d : Thanh ghi 8 bit v i tín hi u reset ng b
PROCESS -- no sensitivity list BEGIN WAIT UNTIL (clk'EVENT AND clk='1'); IF (rst='1') THEN output <= "00000000"; ELSIF (clk'EVENT AND clk='1') THEN output <= input; END IF; END PROCESS;

WAIT ON, trong cách x lý khác, nh n nhi u tín hi u. PROCESS ư c t gi cho n khi b t kỳ tín hi u nào thay i. PROCESS s ti p t c th c hi n b t kỳ khi nào m t thay i trong rst ho c clk xu t hi n. Ví d : Thanh ghi 8 bit v i tín hi u reset không ng b
PROCESS BEGIN WAIT ON clk, rst; IF (rst='1') THEN output <= "00000000"; ELSIF (clk'EVENT AND clk='1') THEN output <= input; END IF; END PROCESS;

WAIT FOR ch dùng

mô ph ng. Ví d : WAIT FOR 5ns;

- 59 -

ThiÕt kÕ vi m¹ch b»ng VHDL
Ví d 6.4a: DFF v i tín hi u reset không
5 1 0 1 5 20 25 30

ng b
35 40 45 50 55 60 65 70 75 80 ns

rst d clk q

Hình 6.4a.1. K t qu mô ph ng
library IEEE; use IEEE.STD_LOGIC_1164.all; entity DFF is Port(d,clk,rst:in std_logic; q:out std_logic); end DFF; architecture DFF of DFF is begin process begin wait on rst,clk; if (rst='1') then q <= '0'; elsif (clk'Event and clk='1') then q <= d; end if; end process; end DFF;

Ví d 6.4b: B m m t ch s th p phân 0 → 9 → 0
1 0 20 30 40 50 60 70 80 90 1 00 10 1 1 20 1 30 1 40 1 50 1 60 ns

clk digit
0 1 2 3 4 5 6 7 8 9

Hình 6.4b.1. K t qu mô ph ng
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY counter IS PORT (clk : IN STD_LOGIC; digit : OUT INTEGER RANGE 0 TO 9); END counter; ARCHITECTURE counter OF counter IS BEGIN PROCESS -- no sensitivity list VARIABLE temp : INTEGER RANGE 0 TO 10;

- 60 -

ThiÕt kÕ vi m¹ch b»ng VHDL
BEGIN WAIT UNTIL (clk'EVENT AND clk='1'); temp := temp + 1; IF (temp=10) THEN temp := 0; END IF; digit <= temp; END PROCESS; END counter;

6.5.

CASE. ( i kèm v i IF, LOOP, và

CASE là l nh duy nh t cho mã tu n t WAIT). Cú pháp:
CASE identifier IS WHEN value => assignments; WHEN value => assignments; ... END CASE;

Ví d :
CASE control IS WHEN "00" => x<=a; y<=b; WHEN "01" => x<=b; y<=c; WHEN OTHERS => x<="0000"; y<="ZZZZ"; END CASE;

L nh CASE (tu n t ) tương t v i WHEN (k t h p). T t c s hoán v u ph i ư c ki m tra, vì v y t khoá OTHERS r t h u ích. T khoá quan tr ng khác là NULL (b n sao c a UNAFFECTED), nên ư c s d ng khi không có ho t ng nào thay th . Ví d : WHEN OTHERS => NULL;. Tuy nhiên, CASE cho phép nhi u phép gán v i m i i u ki n ki m tra, trong khi WHEN ch cho phép m t. Gi ng như trong trư ng h p c a WHEN, ây “WHEN value” có th có 3 d ng: WHEN value -- single value WHEN value1 to value2 -- range, for enumerated data types -- only WHEN value1 | value2 |... -- value1 or value2 or ... WHEN ng th i Ch ngoài PROCESS, FUNCTION, ho c CASE Tu n t Ch trong PROCESS, FUNCTION, ho c

Ki u l nh S d ng

- 61 -

ThiÕt kÕ vi m¹ch b»ng VHDL
PROCEDURE PROCEDURE T t c s hoán v ph i Có v i Có ư c ki m tra WITH/SELECT/WHEN S phép gán l n nh t 1 B t kỳ cho m i ki m tra T khoá không kích UNAFFECTED NULL ho t B ng 6.1. So sánh gi a WHEN và CASE Ví d : V i WHEN:
WITH sel SELECT x <= a WHEN "000", b WHEN "001", c WHEN "010", UNAFFECTED WHEN OTHERS;

V i CASE:
CASE sel IS WHEN "000" => x<=a; WHEN "001" => x<=b; WHEN "010" => x<=c; WHEN OTHERS => NULL; END CASE;

Ví d : B d n kênh MUX 4-1 V i IF:
IF (sel="00") THEN x<=a; ELSIF (sel="01") THEN x<=b; ELSIF (sel="10") THEN x<=c; ELSE x<=d;

V i CASE:
CASE sel IS WHEN "00" => x<=a; WHEN "01" => x<=b; WHEN "10" => x<=c; WHEN OTHERS => x<=d; END CASE;

- 62 -

ThiÕt kÕ vi m¹ch b»ng VHDL
Ví d 6.5a: DFF v i tín hi u reset không
5 1 0 1 5 20 25 30

ng b
35 40 45 50 55 60 65 70 75 80 ns

rst d clk q

Hình 6.5a.1. K t qu mô ph ng
LIBRARY ieee; -- Unnecessary declaration, -- because USE ieee.std_logic_1164.all; -- BIT was used instead of -- STD_LOGIC ENTITY dff IS PORT (d, clk, rst: IN BIT; q: OUT BIT); END dff; ARCHITECTURE dff3 OF dff IS BEGIN PROCESS (clk, rst) BEGIN CASE rst IS WHEN '1' => q<='0'; WHEN '0' => IF (clk'EVENT AND clk='1') THEN q <= d; END IF; WHEN OTHERS => NULL;-- Unnecessary,rst is of -- type BIT END CASE; END PROCESS; END dff3;

Ví d 6.5b: B m hai ch s th p phân 0 → 99 → 0,

u ra là 2 LED 7 thanh

Hình 6.5b.1. B

m 2 ch s th p phân
- 63 -

ThiÕt kÕ vi m¹ch b»ng VHDL

20

40

60

80

1 00

1 20

1 40

1 60

1 80

200

220

240

260

280

300

ns

reset clk temp1 temp2 digit1 digit2
0 0 7E 7E 30 7E 30 7E 30 6D 79 33 7E 30 1 0 1 0 1 2 3 4 0 1

Hình 6.5b.2. K t qu mô ph ng
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY counter IS PORT (clk, reset : IN STD_LOGIC; digit1, digit2 : OUT STD_LOGIC_VECTOR (6 DOWNTO 0)); END counter; ARCHITECTURE counter OF counter IS BEGIN PROCESS(clk, reset) VARIABLE temp1: INTEGER RANGE 0 TO 10; VARIABLE temp2: INTEGER RANGE 0 TO 10; BEGIN ---------------------- counter: ---------------------IF (reset='1') THEN temp1 := 0; temp2 := 0; ELSIF (clk'EVENT AND clk='1') THEN temp1 := temp1 + 1; IF (temp1=10) THEN temp1 := 0; temp2 := temp2 + 1; IF (temp2=10) THEN temp2 := 0; END IF; END IF; END IF; ---- BCD to SSD conversion: -------CASE temp1 IS WHEN 0 => digit1 <= "1111110"; --7E WHEN 1 => digit1 <= "0110000"; --30 WHEN 2 => digit1 <= "1101101"; --6D WHEN 3 => digit1 <= "1111001"; --79 WHEN 4 => digit1 <= "0110011"; --33 WHEN 5 => digit1 <= "1011011"; --5B WHEN 6 => digit1 <= "1011111"; --5F WHEN 7 => digit1 <= "1110000"; --70 WHEN 8 => digit1 <= "1111111"; --7F WHEN 9 => digit1 <= "1111011"; --7B WHEN OTHERS => NULL; END CASE; CASE temp2 IS WHEN 0 => digit2 <= "1111110"; --7E

- 64 -

ThiÕt kÕ vi m¹ch b»ng VHDL
WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN END CASE; END PROCESS; END counter; 1 => digit2 <= "0110000"; 2 => digit2 <= "1101101"; 3 => digit2 <= "1111001"; 4 => digit2 <= "0110011"; 5 => digit2 <= "1011011"; 6 => digit2 <= "1011111"; 7 => digit2 <= "1110000"; 8 => digit2 <= "1111111"; 9 => digit2 <= "1111011"; OTHERS => NULL; --30 --6D --79 --33 --5B --5F --70 --7F --7B

6.6.

LOOP.

LOOP h u ích khi m t ph n c a mã ph i ư c th hi n nhi u l n. Gi ng như IF, WAIT, và CASE, LOOP là duy nh t i v i mã tu n t , vì v y nó cũng có th ư c s d ng bên trong PROCESS, FUNCTION, hay PROCEDURE. Có nhi u cách s d ng LOOP. Cú pháp: FOR/LOOP: vòng l p ư c l p l i m t s l n c
[label:] FOR identifier IN range LOOP (sequential statements) END LOOP [label];

nh.

WHILE/LOOP: vòng l p ư c l p cho mãn.
[label:] WHILE condition LOOP (sequential statements) END LOOP [label];

n khi i u ki n không th o

EXIT: s d ng
[label:]

k t thúc vòng l p.

EXIT [label] [WHEN condition];

NEXT: s d ng
[label:]

b qua các bư c vòng l p.

NEXT [loop_label] [WHEN condition];

Ví d : V i FOR/LOOP:
FOR i IN 0 TO 5 LOOP x(i) <= enable AND w(i+2); y(0, i) <= w(i); END LOOP;

- 65 -

ThiÕt kÕ vi m¹ch b»ng VHDL
M t c i m quan tr ng c a FOR/LOOP (tương t t o v i GENERATE) là gi i h n t i thi u ph i là tĩnh. Do ó, m t khai báo ki u “FOR i IN 0 TO choice LOOP”, v i choice là m t tham s u vào (không tĩnh), không k t h p t ng quát ư c. Ví d : V i WHILE/LOOP
WHILE (i < 10) LOOP WAIT UNTIL clk'EVENT AND clk='1'; (other statements) END LOOP;

Ví d : V i EXIT
FOR i IN data'RANGE LOOP CASE data(i) IS WHEN '0' => count:=count+1; WHEN OTHERS => EXIT; END CASE; END LOOP;

Ví d : V i NEXT
FOR i IN 0 TO 15 LOOP NEXT WHEN i=skip; -- jumps to next iteration (...) END LOOP;

Ví d 6.6a: B c ng có nh 8 bit không d u.

Hình 6.6a.1. B c ng có nh 8 bit không d u
20 40 60 80 1 00 1 20 1 40 1 60 1 80 200 220 240 260 280 300 ns

cin a b s cout
92 24 B7 40 81 C2 04 09 0D 31 63 94 86 0D 93 C6 8D 53 32 65 97

Hình 6.6a.2. K t qu mô ph ng
- 66 -

ThiÕt kÕ vi m¹ch b»ng VHDL
M i ph n t c a sơ là m t b c ng y .

sj = aj XOR bj XOR cj cjþ1 = (aj AND bj) OR (aj AND cj) OR (bj AND cj)

Cách 1: Dùng Generic v i các VECTOR ----- Solution 1: Generic, with VECTORS -------LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY adder IS GENERIC (length : INTEGER := 8); PORT ( a, b: IN STD_LOGIC_VECTOR (length-1 DOWNTO 0); cin: IN STD_LOGIC; s: OUT STD_LOGIC_VECTOR (length-1 DOWNTO 0); cout: OUT STD_LOGIC); END adder; ARCHITECTURE adder OF adder IS BEGIN PROCESS (a, b, cin) VARIABLE carry : STD_LOGIC_VECTOR (length DOWNTO 0); BEGIN carry(0) := cin; FOR i IN 0 TO length-1 LOOP s(i) <= a(i) XOR b(i) XOR carry(i); carry(i+1) := (a(i) AND b(i)) OR (a(i) AND carry(i)) OR (b(i) AND carry(i)); END LOOP; cout <= carry(length); END PROCESS; END adder;

Cách 2: Dùng non-generic v i các INTEGER ---- Solution 2: non-generic, with INTEGERS ---LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY adder IS PORT ( a, b: IN INTEGER RANGE 0 TO 255; c0: IN STD_LOGIC; s: OUT INTEGER RANGE 0 TO 255; c8: OUT STD_LOGIC); END adder; ARCHITECTURE adder OF adder IS BEGIN PROCESS (a, b, c0) VARIABLE temp : INTEGER RANGE 0 TO 511;

- 67 -

ThiÕt kÕ vi m¹ch b»ng VHDL
BEGIN IF (c0='1') THEN temp:=1; ELSE temp:=0; END IF; temp := a + b + temp; IF (temp > 255) THEN c8 <= '1'; temp := temp; ---256 ELSE c8 <= '0'; END IF; s <= temp; END PROCESS; END adder;

Ví d 6.6b: B d ch ơn gi n: d ch vector u vào (kích thư c 8) ‘0’ ho c ‘1’ v phía trái. Khi d ch, bit LSB ph i ư c i n ‘0’. N u shift = 0 thì outp = inp; n u shift = 1 thì outp(0) = ‘0’ và outp(i) = inp(i-1) v i 1 ≤ i ≤ 7.

Hình 6.6b.1. B dich ơn gi n K t qu mô ph ng:
20 40 1 4 60 80 1 00 28 1 20 1 40 1 60 3C 1 80 200 50 1 1 4 28 3C A0 C8 F0 220 240 260 64 280 300 78 ns

inp shift outp

00 0 00

Hình 6.6b.2. K t qu mô ph ng
LIBRARY ieee;

- 68 -

ThiÕt kÕ vi m¹ch b»ng VHDL
USE ieee.std_logic_1164.all; ENTITY barrel IS GENERIC (n: INTEGER := 8); PORT ( inp: IN STD_LOGIC_VECTOR (n-1 DOWNTO 0); shift: IN INTEGER RANGE 0 TO 1; outp: OUT STD_LOGIC_VECTOR (n-1 DOWNTO 0)); END barrel; ARCHITECTURE RTL OF barrel IS BEGIN PROCESS (inp, shift) BEGIN IF (shift=0) THEN outp <= inp; ELSE outp(0) <= '0'; FOR i IN 1 TO inp'HIGH LOOP outp(i) <= inp(i-1); END LOOP; END IF; END PROCESS; END RTL;

Ví d 6.6c: B m s s ‘0’ c a m t vector nh phân, b t
50 1 00 02 6 1 50 03 200 04 5 250 05 300 06 350 07 400 08 4

u t bên trái
450 09 500 0A 550 0B 600 0C ns 0D

data zeros

00 8

01 7

Hình 6.6c.1. K t qu mô ph ng
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY LeadingZeros IS PORT ( data: IN STD_LOGIC_VECTOR (7 DOWNTO 0); zeros: OUT INTEGER RANGE 0 TO 8); END LeadingZeros; ARCHITECTURE behavior OF LeadingZeros IS BEGIN PROCESS (data) VARIABLE count: INTEGER RANGE 0 TO 8; BEGIN count := 0; FOR i IN data'RANGE LOOP CASE data(i) IS WHEN '0' => count := count + 1; WHEN OTHERS => EXIT; END CASE; END LOOP; zeros <= count;

- 69 -

ThiÕt kÕ vi m¹ch b»ng VHDL
END PROCESS; END behavior;

6.7.

Bad Clocking.

Trình biên d ch nói chung không có kh năng t ng h p các mã ch a các phép gán cho tín hi u gi ng nhau t i c chuy n ti p c a tín hi u ng h (clock) tham chi u (t i sư n dương c ng t i sư n âm). Trong trư ng h p này, trình biên d ch có th thông báo m t thông i p “signal does not hold value after clock edge” ho c tương t . Ví d : B m ph i ư c tăng t i m i s chuy n ti p c a tín hi u clock (sư n dương c ng sư n dương)
PROCESS (clk) BEGIN IF (clk'EVENT AND clk='1') THEN counter <= counter + 1; ELSIF(clk'EVENT AND clk='0') THEN counter <= counter + 1; END IF; ... END PROCESS;

Trình biên d ch có th còn thông báo r ng tín hi u counter b nhân d n. Trong trư ng h p này, vi c biên d ch s b treo. Khía c nh quan tr ng khác là thu c tính EVENT ph i có liên quan t i i u ki n ki m tra. Ví d : l nh IF (clk’EVENT and clk=’1’) là úng, nhưng ch s d ng IF (clk’EVENT) có th trình biên d ch gi s m t giá tr ki m tra m c nh (and clk=’1’) ho c thông báo m t thông i p “clock not locally stable”.
PROCESS (clk) BEGIN IF (clk'EVENT) THEN counter := counter + 1; END IF; ... END PROCESS;

Khi PROCESS ư c ch y m i th i i m clk thay i, b m có th ư c tăng hai trên m i chu kỳ clock. Tuy nhiên, i u này không x y ra. N u trình biên d ch gi thi t m t giá tr m c nh, m t m ch l i s ư c t ng h p, b i vì ch m t sư n c a clk s ư c quan tâm; n u không có giá tr m c nh gi thi t, thì m t thông i p l i và không có s biên d ch ư c mong mu n. N u m t tín hi u xu t hi n trong danh sách nh y, nhưng không xu t hi n trong b t kỳ phép gán nào c a PROCESS, thì xem như trình biên d ch s b qua. Tuy nhiên, m t thông i p “ignored unnecessary pin clk” có th ư c thông báo.

- 70 -

ThiÕt kÕ vi m¹ch b»ng VHDL

PROCESS (clk) BEGIN counter := counter + 1; ... END PROCESS;

Hai o n mã PROCESS sau s ư c t ng h p chính xác b i b t kỳ trình biên d ch nào. Tuy nhiên, chú ý r ng s d ng m t tín hi u khác nhau trong m i PROCESS.
PROCESS (clk) BEGIN IF (clk'EVENT AND clk='1') THEN x <= d; END IF; END PROCESS; PROCESS (clk) BEGIN IF (clk'EVENT AND clk='0') THEN y <= d; END IF; END PROCESS;

Ví d 6.7a: RAM (Random Acess Memory), dung lư ng 16 t nh x 8 bit

Hình 6.7a.1. RAM
50 1 00 1 50 200 250 300 350 400 450 500 550 600 ns

wr_ena clk addr data_in data_out
3 32 UU 32 4 33 UU 33 5 34 UU 34 2 35 UU 3 36 32 4 37 33 5 38 34

Hình 6.7a.2. K t qu mô ph ng M ch có bus d li u vào (data_in), bus d li u ra (data_out), bus a ch (addr), c ng tín hi u clock (clk) và các chân cho phép ghi (wr_ena). Khi

- 71 -

ThiÕt kÕ vi m¹ch b»ng VHDL
wr_ena ư c xác nh n, t i sư n dương ti p theo c a clk, vector có m t t i data_in ph i ư c lưu tr t i a ch ư c mô t b i addr. u ra, data_out, b ng cách x lý khác, ph i hi n th liên t c d li u ch n b i addr. Khi wr_ena m c th p, q ư c n i v i u vào c a flip-flop, và d ư c m , vì v y không có d li u m i s ư c ghi vào b nh . Khi wr_ena tr v m c cao, d ư c n i v i u vào c a thanh ghi, vì v y t i sư n dương ti p theo c a clk, d s ghi è giá tr li n trư c.
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY ram IS GENERIC ( bits: INTEGER := 8;-- # of bits per word words: INTEGER := 16);--#of words in the mem PORT ( wr_ena, clk: IN STD_LOGIC; addr: IN INTEGER RANGE 0 TO words-1; data_in: IN STD_LOGIC_VECTOR (bits-1 DOWNTO 0); data_out: OUT STD_LOGIC_VECTOR (bits-1 DOWNTO 0)); END ram; ARCHITECTURE ram OF ram IS TYPE vector_array IS ARRAY (0 TO words-1) OF STD_LOGIC_VECTOR (bits-1 DOWNTO 0); SIGNAL memory: vector_array; BEGIN PROCESS (clk, wr_ena) BEGIN IF (wr_ena='1') THEN IF (clk'EVENT AND clk='1') THEN memory(addr) <= data_in; END IF; END IF; END PROCESS; data_out <= memory(addr); END ram;

6.8.

S d ng mã tu n t

thi t k các m ch t h p.

Mã tu n t có th ư c s d ng th c hi n các h dãy hay t h p. Trong trư ng h p h dãy, các thanh ghi là c n thi t, vì v y s ư c suy ra b i trình biên d ch. Tuy nhiên, i u này s không x y ra trong trư ng h p h t h p. Hơn n a, n u mã ư c dùng cho h t h p, thì b ng th t y nên ư c môt t rõ ràng trong mã. tho mãn các tiêu chu n trên có các lu t ư c xét: - Lu t 1: m b o t t c tín hi u u vào s d ng trong PROCESS xu t hi n trong danh sách nh y c a nó. Trình biên d ch ưa ra c nh báo n u m t tín hi u u vào ã cho không ư c ch a trong danh sách nh y, và sau ó x lý n u tín hi u ã ư c ch a. - Lu t 2: m b o t t c t h p các tín hi u u vào/ u ra ư c bao g m trong mã, b ng th t y c a m ch có th ư c ch a ( i u này úng v i c mã tu n t và mã ng th i). Các c t không y c a các tín hi u u ra có th gây cho vi c t ng h p suy ra các ch t gi các giá tr li n trư c.
- 72 -

ThiÕt kÕ vi m¹ch b»ng VHDL

Ví d 6.8a: Thi t k m ch t h p sai

Hình 6.8a.1. M ch t h p sai và các b ng th t
50 1 00 1 50 200 250 300 350 400 450 500 550 600 ns

a b c d sel x y
0 3 1

Hình 6.8a.2. K t qu mô ph ng x ho t ng như m t b d n kênh, y = 0 khi sel = “00”, ho c = 1 n u sel = “01”. Tuy nhiên các c t ư c cung c p cho y không d y .
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY example IS PORT (a, b, c, d: IN STD_LOGIC; sel: IN INTEGER RANGE 0 TO 3; x, y: OUT STD_LOGIC); END example; ARCHITECTURE example OF example IS BEGIN PROCESS (a, b, c, d, sel) BEGIN IF (sel=0) THEN x<=a; y<='0'; ELSIF (sel=1) THEN x<=b; y<='1'; ELSIF (sel=2) THEN x<=c; ELSE x<=d; END IF;

- 73 -

ThiÕt kÕ vi m¹ch b»ng VHDL
END PROCESS; END example;

Sau khi biên d ch, các file báo cáo th hi n không có flip-flop nào ư c suy ra. Giá tr gi ng nhau c a u vào (sel = 3 = “11”), hai k t qu khác nhau cho y (khi sel =3 ư c i trư c sel = 0, k t qu y = ‘0’, trong khi y = ‘1’ khi sel = 3 ư c i trư c sel = 1). y = (sel(0) AND sel(1)) OR (sel(0) AND y) OR (sel(1) AND y) Do ó, m t ch t (s d ng các c ng AND/OR) ã ư c th c hi n, tr v b ng th t 2. tránh s d ng ch t, nên s d ng ‘X’ là giá tr không xác nh, l nh “y <= ‘X’;” ph i ư c ch a dư i các dòng 22 và 24, do ó y = sel(0).

- 74 -

ThiÕt kÕ vi m¹ch b»ng VHDL

Chương 7: Signal và Variable
VHDL cung c p hai i tư ng gi i quy t các giá tr d li u không tĩnh (non-static): SIGNAL và VARIABLE. Nó còn cung c p các cách thi t l p các giá tr m c nh (static): CONSTANT và GENERIC. CONSTANT và GENERIC có th là toàn c c và có th ư c s d ng trong c ki u mã, ng th i ho c tu n t . VARIABLE là c c b , ch có th ư c s d ng bên trong m t ph n c a mã tu n t (trong PROCESS, FUNCTION, ho c PROCEDURE). 7.1. CONSTANT. CONSTANT ph c v cho vi c thi t l p các giá tr m c Cú pháp:
CONSTANT name : type := value;

nh.

Ví d :
CONSTANT set_bit : BIT := '1'; CONSTANT datamemory : memory := (('0','0','0','0'), ('0','0','0','1'), ('0','0','1','1'));

CONSTANT có th ư c khai báo trong PACKAGE, ENTITY và ARCHITECTURE. Khi khai báo trong gói (package), nó là toàn c c, gói có th ư c s d ng b i nhi u th c th (entity). Khi khai báo trong th c th (sau PORT), nó là toàn c c v i t t c các ki n trúc (architecture) theo th c th . Khi khai báo trong ki n trúc (trong ph n khai báo c a nó), nó ch toàn c c v i mã c a ki n trúc ó. 7.2. SIGNAL.

SIGNAL ph c v gi i quy t các giá tr vào và ra c a m ch, cũng như là gi a các ơn v bên trong c a nó. Tín hi u bi u di n cho vi c k t n i m ch (các dây). Th hi n là, t t c các PORT c a ENTITY là các tín hi u m c nh. Cú pháp:
SIGNAL name : type [range] [:= initial_value];

Ví d :
SIGNAL control: BIT := '0'; SIGNAL count: INTEGER RANGE 0 TO 100; SIGNAL y: STD_LOGIC_VECTOR (7 DOWNTO 0);

- 75 -

ThiÕt kÕ vi m¹ch b»ng VHDL
Khai báo c a SIGNAL có th ư c t o ra các ch gi ng nhau như là khai báo CONSTANT. Khía c nh quan tr ng c a SIGNAl, khi s d ng bên trong m t ph n c a mã tu n t (PROCESS), s c p nh t nó không t c thì. Giá tr m i c a không nên ư c i ư c c trư c khi k t thúc PROCESS, FUNCTION, ho c PROCEDURE tương ng. Phép toán gán cho SIGNAL là “<=” (count <= 35;). Giá tr kh i t o không th t ng h p ư c, ch ư c xét khi mô ph ng. Khía c nh khác nh hư ng n k t qu khi nhi u phép gán ư c t o cùng SIGNAL. Trình biên d ch có th thông báo và thoát s t ng h p, ho c có th suy ra m ch sai (b ng cách ch xét phép gán cu i cùng). Do ó, vi c xét l p các giá tr kh i t o, nên ư c th c hi n v i VARIABLE. Ví d 7.2a: B
din temp ones
00 0 0

m s s ‘1’ trong m t vector nh phân
20 40 01 1 60 80 1 00 02 2 1 1 20 1 40 03 3 2 1 60 1 80 200 04 4 3 220 240 260 05 5 4 280 300 06 6 5 ns

Hình 7.2a.1. K t qu mô ph ng
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY count_ones IS PORT ( din: IN STD_LOGIC_VECTOR (7 DOWNTO 0); ones: OUT INTEGER RANGE 0 TO 8); END count_ones; ARCHITECTURE not_ok OF count_ones IS SIGNAL temp: INTEGER RANGE 0 TO 8; BEGIN PROCESS (din) BEGIN temp <= 0; FOR i IN 0 TO 7 LOOP IF (din(i)='1') THEN temp <= temp + 1; END IF; END LOOP; ones <= temp; END PROCESS; END not_ok;

- 76 -

ThiÕt kÕ vi m¹ch b»ng VHDL
7.3. VARIABLE

Ngư c l i v i CONSTANT và SIGNAL, VARIABLE ch bi u di n thông tin c c b . Nó ch có th ư c s d ng bên trong PROCESS, FUNCTION, hay PROCEDURE (trong mã tu n t ). Vi c c p nh t giá tr c a nó là t c thì, vì v y giá tr m i có th ư c l p t c s d ng trong dòng l nh ti p theo c a mã. Cú pháp:
VARIABLE name : type [range] [:= init_value];

Ví d :
VARIABLE control: BIT := '0'; VARIABLE count: INTEGER RANGE 0 TO 100; VARIABLE y: STD_LOGIC_VECTOR (7 DOWNTO 0) := "10001000";

Khi VARIABLE ch có th ư c s d ng trong mã tu n t , khai báo c a nó ch có th ư c th c hi n trong ph n khai báo c a PROCESS, FUNCTION, hay PROCEDURE. Phép toán gán c a VARIABLE là “:=” (count:=35;). Cũng gi ng như trư ng h p c a SIGNAl, giá tr kh i t o không th t ng h p ư c, ch ư c xét khi mô ph ng. Ví d 7.3a: B m s s ‘1’ c a m t vector nh phân Khi c p nh t bi n là t c thì, giá tr kh i t o ư c thi t l p chính xác và không có thông báo nào v nhi u phép gán do trình biên d ch.
50 1 00 02 1 50 03 2 200 04 1 250 05 2 300 06 350 07 3 400 08 1 450 09 2 500 0A 550 0B 3 600 0C 2 ns 0D 3

din ones

00 0

01 1

Hình 7.3a.1. K t qu mô ph ng
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY count_ones IS PORT ( din: IN STD_LOGIC_VECTOR (7 DOWNTO 0); ones: OUT INTEGER RANGE 0 TO 8); END count_ones; ARCHITECTURE ok OF count_ones IS BEGIN PROCESS (din) VARIABLE temp: INTEGER RANGE 0 TO 8; BEGIN temp := 0;

- 77 -

ThiÕt kÕ vi m¹ch b»ng VHDL
FOR i IN 0 TO 7 LOOP IF (din(i)='1') THEN temp := temp + 1; END IF; END LOOP; ones <= temp; END PROCESS; END ok;

Phép gán Tính năng Ph m vi

Ho t

ng

S d ng

VARIABLE := Bi u di n thông tin c c b C c b (ch trong PROCESS, FUNCTION, hay PROCEDURE tương ng) C p nh t không t c thì C p nh t t c thì (giá tr trong mã tu n t (giá tr m i có th ư c s m i ch có th dùng lúc d ng trong dòng l nh k t thúc PROCESS, ti p theo c a mã) FUNCTION, hay PROCEDURE) Trong PACKAGE, Ch trong mã tu n t , ENTITY, hay trong PROCESS, ARCHITECTURE. FUNCTION, hay Trong ENTITY, t t c PROCEDURE các PORT là các SIGNAL m c nh B ng 7.1. So sánh gi a SIGNAL và VARIABLE

SIGNAL <= Bi u di n s k t n i các m ch (các dây) Có th là toàn c c (trên toàn b mã)

Ví d 7.3b: B d n kênh 4-1

Hình 7.3b.1. B d n kênh 4-1

- 78 -

ThiÕt kÕ vi m¹ch b»ng VHDL
Cách 1: S d ng SIGNAL (không úng) -- Solution 1: using a SIGNAL (not ok) -LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY mux IS PORT ( a, b, c, d, s0, s1: IN STD_LOGIC; y: OUT STD_LOGIC); END mux; ARCHITECTURE not_ok OF mux IS SIGNAL sel : INTEGER RANGE 0 TO 3; BEGIN PROCESS (a, b, c, d, s0, s1) BEGIN sel <= 0; IF (s0='1') THEN sel <= sel + 1; END IF; IF (s1='1') THEN sel <= sel + 2; END IF; CASE sel IS WHEN 0 => y<=a; WHEN 1 => y<=b; WHEN 2 => y<=c; WHEN 3 => y<=d; END CASE; END PROCESS; END not_ok;

Cách 2: S d ng VARIABLE ( úng) -- Solution 2: using a VARIABLE (ok) ---LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY mux IS PORT ( a, b, c, d, s0, s1: IN STD_LOGIC; y: OUT STD_LOGIC); END mux; ARCHITECTURE ok OF mux IS BEGIN PROCESS (a, b, c, d, s0, s1) VARIABLE sel : INTEGER RANGE 0 TO 3; BEGIN sel := 0; IF (s0='1') THEN sel := sel + 1; END IF; IF (s1='1') THEN sel := sel + 2; END IF; CASE sel IS

- 79 -

ThiÕt kÕ vi m¹ch b»ng VHDL
WHEN WHEN WHEN WHEN END CASE; END PROCESS; END ok; 0 1 2 3 => => => => y<=a; y<=b; y<=c; y<=d;

M t l i thư ng xuyên khi s d ng SIGNAL là không nh nó có th yêu c u m t kho ng th i gian c p nh t. Do ó, phép gán sel <= sel + 1 (dòng 16) trong cách 1, k t qu c ng thêm 1 b t k giá tr v a ư c t o li n trư c cho sel, v i phép gán sel <= 0 (dòng 15) có th không có th i gian t o. i u này úng v i v i sel <= sel +2 (dòng 18). ây không là v n khi s d ng VARIABLE, phép gán c a nó luôn t c thì. Khía c nh th 2 có th là m t v n trong cách 1 là hơn m t phép toán ang ư c t o cho cùng SIGNAL (sel, dòng 15, 16, và 18), có th không ư c ch p nh n. Tóm l i, ch m t phép gán v i SIGNAL ư c phép bên trong PROCESS, vì v y ph n m m ch xét phép gán cu i cùng (sel <= sel +2) ho c ơn gi n là ưa ra thông báo l i và k t thúc vi c biên d ch. ây cũng không bao gi là v n khi s d ng VARIABLE.
20 40 60 80 1 00 1 20 1 40 1 60 1 80 200 220 240 260 280 300 ns

s0 s1 a b c d y

50

1 00

1 50

200

250

300

350

400

450

500

550

600

ns

s0 s1 a b c d y

Hình 7.3b.2. K t qu mô ph ng cách 1 và 2 Ví d 7.3c: DFF v i q và qbar

Hình 7.3c.1. DFF

- 80 -

ThiÕt kÕ vi m¹ch b»ng VHDL
Cách 1: Không úng ---- Solution 1: not OK --------------LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY dff IS PORT ( d, clk: IN STD_LOGIC; q: BUFFER STD_LOGIC; qbar: OUT STD_LOGIC); END dff; ARCHITECTURE not_ok OF dff IS BEGIN PROCESS (clk) BEGIN IF (clk'EVENT AND clk='1') THEN q <= d; qbar <= NOT q; END IF; END PROCESS; END not_ok;

Cách 2: úng ---- Solution 2: OK ------------------LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY dff IS PORT ( d, clk: IN STD_LOGIC; q: BUFFER STD_LOGIC; qbar: OUT STD_LOGIC); END dff; ARCHITECTURE ok OF dff IS BEGIN PROCESS (clk) BEGIN IF (clk'EVENT AND clk='1') THEN q <= d; END IF; END PROCESS; qbar <= NOT q; END ok;

Trong cách 1, các phép gán q<=d (dòng 16) và qbar<=NOT q (dòng 17) u ng b , vì v y các giá tr m i c a chúng s ch ư c dùng lúc k t thúc PROCESS. ây là v n i v i qbar, b i vì giá tr m i c a q không v a m i t o ra. Do ó, qbar s nh n giá tr o giá tr cũ c a q. Giá tr úng c a qbar s b tr m t chu kỳ ng h , gây cho m ch làm vi c không chính xác.
- 81 -

ThiÕt kÕ vi m¹ch b»ng VHDL
Trong cách 2, thay qbar<=NOT q (dòng 30) bên ngoài PROCESS, do ó phép tính như m t bi u th c ng th i úng.
50 1 00 1 50 200 250 300 350 400 450 500 550 600 ns

d clk q qbar

50

1 00

1 50

200

250

300

350

400

450

500

550

600

ns

d clk q qbar

Hình 7.3c.2. K t qu mô ph ng cách 1 và 2 Ví d 7.3d: B chia t n, chia t n s clock b i 6.

Hình 7.3d.1. B chia t n Th c hi n hai u ra, m t là d a trên SIGNAL (count1), và m t d a trên VARIABLE (count2).
20 40 60 80 1 00 1 20 1 40 1 60 1 80 200 220 240 260 280 300 ns

clk count1 count2 out1 out2
0 0 1 1 2 3 2 4 3 5 6 4 7

Hình 7.3d.2. K t qu mô ph ng
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY freq_divider IS PORT ( clk : IN STD_LOGIC; out1, out2 : BUFFER STD_LOGIC); END freq_divider; ARCHITECTURE example OF freq_divider IS SIGNAL count1 : INTEGER RANGE 0 TO 7; BEGIN

- 82 -

ThiÕt kÕ vi m¹ch b»ng VHDL
PROCESS (clk) VARIABLE count2 : INTEGER RANGE 0 TO 7; BEGIN IF (clk'EVENT AND clk='1') THEN count1 <= count1 + 1; count2 := count2 + 1; IF (count1 = 7 ) THEN out1 <= NOT out1; count1 <= 0; END IF; IF (count2 = 7 ) THEN out2 <= NOT out2; count2 := 0; END IF; END IF; END PROCESS; END example;

7.4.

S thanh ghi.

S flip-flop ư c suy ra t mã b i trình biên d ch. M c ích là không ch hi u ti p c n yêu c u s thanh ghi t i thi u, mà còn m b o o n mã th c hi n m ch mong mu n. M t SIGNAL sinh m t flip-flop b t c khi nào m t phép gán ư c t o ra t i s chuy n ti p c a tín hi u khác, khi m t phép gán ng b x y ra. Phép gán ng b , có th ch x y ra bên trong PROCESS, FUNCTION, hay PROCEDURE (thư ng là m t khai báo ki u “IF signal’EVENT …” ho c “WAIT UNTIL …”). M t VARIABLE s không sinh các flip-flop c n thi t n u giá tr c a nó không bao gi r i PROCESS (ho c FUNCTION, ho c PROCEDURE). Tuy nhiên, n u m t giá tr ư c gán cho m t bi n t i s chuy n ti p c a tín hi u khác, và giá tr th m chí ư c ưa t i m t tín hi u (r i PROCESS), thì các flipflop s ư c suy ra. M t VARIABLE còn sinh m t thanh ghi khi nó ư c s d ng trư c m t giá tr v a ư c gán cho nó. Ví d : Trong PROCESS, output1 và output2 u s ư c lưu tr (suy ra các flip-flop), b i vì c hai u ư c gán t i s chuy n ti p c a tín hi u khác (clk).
PROCESS (clk) BEGIN IF (clk'EVENT AND clk='1') THEN output1 <= temp; -- output1 stored output2 <= a; -- output2 stored END IF; END PROCESS;

Trong PROCESS ti p theo, ch output1 ư c lưu tr (output2 s t o cách s d ng các c ng logic).

- 83 -

ThiÕt kÕ vi m¹ch b»ng VHDL

PROCESS (clk) BEGIN IF (clk'EVENT AND clk='1') THEN output1 <= temp; -- output1 stored END IF; output2 <= a; -- output2 not stored END PROCESS; Trong PROCESS, bi n temp s gây ra tín hi u x lưu tr

PROCESS (clk) VARIABLE temp: BIT; BEGIN IF (clk'EVENT AND clk='1') THEN temp <= a; END IF; x <= temp; -- temp causes x to be stored END PROCESS;

Ví d 7.4a: DFF v i q và qbar Cách 1 có 2 phép gán SIGNAL ng b (dòng 16-17), vì v y 2 flip-flop s ư c sinh. Cách 2 có m t trong các phép gán là ng b , vi c t ng h p s luôn suy ra ch m t flip-flop

Hình 7.4a.1. Các m ch suy ra t mã c a cách 1 và 2
50 1 00 1 50 200 250 300 350 400 450 500 550 600 ns

d clk q qbar

50

1 00

1 50

200

250

300

350

400

450

500

550

600

ns

d clk q qbar

Hình 7.4a.2. K t qu mô ph ng cách 1 và 2

- 84 -

ThiÕt kÕ vi m¹ch b»ng VHDL
Cách 1: Sinh hai DFF ---- Solution 1: Two DFFs --------------LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY dff IS PORT ( d, clk: IN STD_LOGIC; q: BUFFER STD_LOGIC; qbar: OUT STD_LOGIC); END dff; ARCHITECTURE two_dff OF dff IS BEGIN PROCESS (clk) BEGIN IF (clk'EVENT AND clk='1') THEN q <= d; -- generates a register qbar <= NOT d; -- generates a register END IF; END PROCESS; END two_dff;

Cách 2: Sinh m t DFF ---- Solution 2: One DFF ---------------LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY dff IS PORT ( d, clk: IN STD_LOGIC; q: BUFFER STD_LOGIC; qbar: OUT STD_LOGIC); END dff; ARCHITECTURE one_dff OF dff IS BEGIN PROCESS (clk) BEGIN IF (clk'EVENT AND clk='1') THEN q <= d; -- generates a register END IF; END PROCESS; qbar <= NOT q; -- uses logic gate (no register) END one_dff;

- 85 -

ThiÕt kÕ vi m¹ch b»ng VHDL
Ví d 7.4b: B m0-7

Hình 7.4b.1. B

m0–7

Cách 1: M t phép gán VARIABLE ng b ư c tao ra (dòng 14-15). M t VARIABLE có th sinh các thanh ghi b i vì phép gán c a nó (dòng 15) t i s chuy n ti p c a tín hi u khác (clk, dòng 14) và giá tr c a nó không r i PROCESS (dòng 17). ------ Solution 1: With a VARIABLE -------ENTITY counter IS PORT ( clk, rst: IN BIT; count: OUT INTEGER RANGE 0 TO 7); END counter; ARCHITECTURE counter OF counter IS BEGIN PROCESS (clk, rst) VARIABLE temp: INTEGER RANGE 0 TO 7; BEGIN IF (rst='1') THEN temp:=0; ELSIF (clk'EVENT AND clk='1') THEN temp := temp+1; END IF; count <= temp; END PROCESS; END counter;

Cách 2: M t phép gán SIGNAL ng b x y ra (dòng 13-14). Ch s d ng các SIGNAL. Chú ý, khi không có tín hi u ph ư c s d ng, count c n ư c khai báo như ki u BUFFER (dòng 14), b i vì nó ư c gán m t giá tr và cũng ư c c (s d ng) n i t i (dòng 14). M t SIGNAL, gi ng như m t VARIABLE, có th cũng ư c tăng khi s d ng trong mã tu n t . ------ Solution 2: With SIGNALS only ------ENTITY counter IS PORT ( clk, rst: IN BIT; count: BUFFER INTEGER RANGE 0 TO 7); END counter;

- 86 -

ThiÕt kÕ vi m¹ch b»ng VHDL

ARCHITECTURE counter OF counter IS BEGIN PROCESS (clk, rst) BEGIN IF (rst='1') THEN count <= 0; ELSIF (clk'EVENT AND clk='1') THEN count <= count + 1; END IF; END PROCESS; END counter;

T 2 cách trên, 3 flip-flop ư c suy ra ( count).
50 1 00 1 50 200 250 300 350 400

gi 3 bit tín hi u

u ra
ns

450

500

550

600

rst clk count
0 1 2 3 4 5 6 7

50

1 00

1 50

200

250

300

350

400

450

500

550

600

ns

rst clk count
0 1 2 3 4 5 6 7

Hình 7.4b.2. K t qu mô ph ng cách 1 và 2 Ví d 7.4c: Thanh ghi d ch 4 c p

Hình 7.4c.1. Thanh ghi d ch 4 c p Cách 1: 3 VARIABLE ư c s d ng (a, b, và c, dòng 10). Tuy nhiên các bi n ư c s d ng trư c các giá tr ư c gán cho chúng ( o ngư c th t , b t u v i dout, dòng 13, và k t thúc v i din, dòng 16). K t qu là, các flip-flop s ư c suy ra, lưu tr các giá tr t phép ch y li n trư c c a PROCESS. -------- Solution 1: ----------------ENTITY shift IS PORT ( din, clk: IN BIT; dout: OUT BIT); END shift;

- 87 -

ThiÕt kÕ vi m¹ch b»ng VHDL
ARCHITECTURE shift OF shift IS BEGIN PROCESS (clk) VARIABLE a, b, c: BIT; BEGIN IF (clk'EVENT AND clk='1') THEN dout <= c; c := b; b := a; a := din; END IF; END PROCESS; END shift;

Cách 2: Các bi n ư c thay th b i các SIGNAL (dòng 8), và các phép gán ư c t o ra trong th t tr c ti p (t din-dout, dòng 13-16). Khi các phép gán tín hi u t i s chuy n ti p tín hi u khác sinh các thanh ghi, m ch úng s ư c suy ra. -------- Solution 2: ----------------ENTITY shift IS PORT ( din, clk: IN BIT; dout: OUT BIT); END shift; ARCHITECTURE shift OF shift IS SIGNAL a, b, c: BIT; BEGIN PROCESS (clk) BEGIN IF (clk'EVENT AND clk='1') THEN a <= din; b <= a; c <= b; dout <= c; END IF; END PROCESS; END shift;

Cách 3: Các bi n gi ng nhau c a cách 1 ã b chi m, nhưng trong th t tr c ti p (t din-dout, dòng 13-16). Tuy nhiên, m t phép gán cho m t bi n là t c thì, và khi các bi n ang ư c s d ng trong th t tr c ti p (sau khi các giá tr v a ư c gán cho chúng), dòng 13-15 thành 1 dòng, tương ương v i c:=din. Giá tr c a c r i PROCESS trong dòng ti p theo (dòng 16), khi m t phép gán tín hi u (dout <= c) x y ra t i s chuy n ti p c a clk. Do ó, m t thanh ghi s ư c suy ra t cách 3, nên không t o k t qu m ch chính xác. -------- Solution 3: ----------------ENTITY shift IS PORT ( din, clk: IN BIT;

- 88 -

ThiÕt kÕ vi m¹ch b»ng VHDL
dout: OUT BIT); END shift; ARCHITECTURE shift OF shift IS BEGIN PROCESS (clk) VARIABLE a, b, c: BIT; BEGIN IF (clk'EVENT AND clk='1') THEN a := din; b := a; c := b; dout <= c; END IF; END PROCESS; END shift;

u ra dout là b n sư n clock dương sau ch m t sư n dương sau u vào cách 2.
50 1 00 1 50 200 250 300 350 400

u vào din

cách 1, nhưng
ns

450

500

550

600

din clk dout

50

1 00

1 50

200

250

300

350

400

450

500

550

600

ns

din clk dout

50

1 00

1 50

200

250

300

350

400

450

500

550

600

ns

din clk dout

Hình 7.4c.2. K t qu mô ph ng cách 1, 2, và 3 Ví d 7.4d: Thanh ghi d ch 4 bit

Hình 7.4d.1. Thanh ghi d ch 4 bit

- 89 -

ThiÕt kÕ vi m¹ch b»ng VHDL
Bit ra (q) ph i là 4 sư n clock dương sau bit vào (d). Reset ph i là không ng b , xoá t t c các u ra flip-flop v ‘0’ khi kích ho t. Cách 1: S d ng m t SIGNAL sinh các flip-flop. Các thanh ghi ư c t o b i vì m t phép gán cho m t tín hi u ư c t o ra t i s chuy n ti p c a tín hi u khác (dòng 17-18). ---- Solution 1: With an internal SIGNAL --LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY shiftreg IS PORT ( d, clk, rst: IN STD_LOGIC; q: OUT STD_LOGIC); END shiftreg; ARCHITECTURE behavior OF shiftreg IS SIGNAL internal: STD_LOGIC_VECTOR (3 DOWNTO 0); BEGIN PROCESS (clk, rst) BEGIN IF (rst='1') THEN internal <= (OTHERS => '0'); ELSIF (clk'EVENT AND clk='1') THEN internal <= d & internal(3 DOWNTO 1); END IF; END PROCESS; q <= internal(0); END behavior;

Cách 2: S d ng m t VARIABLE. Phép gán t i s chuy n ti p c a tín hi u khác ư c t o ra cho m t bi n (dòng 17-18), nhưng khi giá tr c a nó r i PROCESS (nó ư c chuy n n m t port trong dòng 20), nó cũng suy ra các thanh ghi. -- Solution 2: With an internal VARIABLE --LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY shiftreg IS PORT ( d, clk, rst: IN STD_LOGIC; q: OUT STD_LOGIC); END shiftreg; ARCHITECTURE behavior OF shiftreg IS BEGIN PROCESS (clk, rst) VARIABLE internal: STD_LOGIC_VECTOR (3 DOWNTO 0); BEGIN IF (rst='1') THEN internal := (OTHERS => '0');

- 90 -

ThiÕt kÕ vi m¹ch b»ng VHDL
ELSIF (clk'EVENT AND clk='1') THEN internal := d & internal(3 DOWNTO 1); END IF; q <= internal(0); END PROCESS; END behavior;

Các m ch ư c t ng h p là gi ng nhau (4 flip-flop ư c suy ra).
50 1 00 1 50 200 250 300 350 400 450 500 550 600 ns

clk rst d internal q
0 1 0 1 0 1 0 1 0

Hình 7.4d.2. K t qu mô ph ng

- 91 -

ThiÕt kÕ vi m¹ch b»ng VHDL

Chương 8: Máy tr ng thái
M t thi t k m ch s có th ư c chia làm 2 thành ph n: b x lý d li u và b i u khi n. M i quan h gi a b i u khi n và b x lý d li u trong m ch ư c bi u di n Máy tr ng thái h u h n (FSM) là m t công ngh mô hình hoá c bi t cho các m ch logic tu n t . Mô hình ó có th r t ư c giúp trong thi t k c a nh ng lo i h th ng nào ó, c bi t là các thao tác c a nh ng h th ng ó theo khuôn d ng tu n t hoàn toàn xác nh. 8.1. Gi i thi u.

Hình sau ây ch ra sơ kh i c a m t máy tr ng thái m t pha. Trong hình này, ph n m ch dãy ch a các m ch dãy (flip-flops), ph n cao ch a m ch logic t h p.

Hình 8.1 Sơ

máy tr ng thái

Ph n m ch t h p có 2 u vào và 2 u ra: + u vào th nh t: là u vào tr ng thái hi n t i c a máy. + u vào th 2: là u vào t bên ngoài. + u ra th nh t: là u ra phía ngoài + u ra th 2: là tr ng thái ti p theo c a máy. Ph n m ch dãy có: + 3 u vào: clock, reset, và tr ng thái ti p theo + 1 u ra: tr ng thái hi n t i. T t c các flip-flop u n m trong ph n này, các tín hi u clock và reset ph i ư c k t n i v i các flip – flop th c hi n vi c i u khi n. Như v y, m t máy ôtômát h u h n là m t b 6 thông s <X, Y, S, s0, δ,λ>, trong ó: • X - T p h p các tín hi u vào c a ôtômat:

- 92 -

ThiÕt kÕ vi m¹ch b»ng VHDL
X = { x1(t),…,xn(t)} T p các tín hi u ra c a ôtômat: Y = {y1(t),…,ym(t)} T p h p các tr ng thái c a ôtômat: S = {s1(t),…,ss(t)} Hàm δ(s, x) – hàm chuy n tr ng thái c a ôtômat Hàm λ(s,x) – hàm u ra c a ôtômat.

• • • •

Tương ng v i các phương pháp tính toán hàm chuy n tr ng thái và hàm ra, chúng ta có các lo i ôtômat khác nhau. Hai d ng ôtômat h u h n chuyên d ng là: ôtômat Moore và ôtômat Mealy. Quay l i v i hình v trên, m ch c n thi t k ư c chia làm hai o n. Vi c chia o n như th này s giúp chúng ta thi t k t t hơn. Chúng ta s thi t k 2 ph n theo nh ng cách khác nhau. C th trong môi trư ng VHDL, ph n m ch dãy chúng ta s th c hi n trong PROCESS và ph n m ch t h p chúng ta có th th c hi n theo c u trúc ho c tu n t ho c k t h p c c u trúc l n tu n t . Tuy nhiên mã tu n t có th áp d ng cho c 2 lo i logic: t h p và tu n t . Thông thư ng các tín hi u clock và các tín hi u reset trong ph n m ch dãy s xu t hi n trong PROCESS (tr khi tín hi u reset là ng b ho c không ư c s d ng, tín hi u WAIT ư c s d ng thay cho l nh IF). Khi tín hi u reset ư c xác nh n, tr ng thái hi n t i s ư c thi t l p cho tr ng thái kh i t o c a h th ng. M t khác, t i sư n ng h th c t , các flip-flop s lưu tr tr ng thái ti p theo, do ó s chuy n nó t i u ra c a ph n m ch dãy (tr ng thái hi n t i). M t i u quan tr ng liên quan t i phương pháp FSM là : v nguyên t c chung là b t kỳ m t m ch dãy nào cũng có th ư c mô hình hoá thành 1 máy tr ng thái, nhưng i u này không ph i luôn luôn thu n l i. Vì có nhi u trư ng h p ( c bi t là các m ch thanh ghi như: b m,…) n u thi t k theo phương pháp FSM thì mã ngu n có th tr nên dài hơn, ph c t p hơn, m c nhi u l i hơn so v i phương pháp thông thư ng. Như thành m t quy t c nh , phương pháp FSM thì thích h p v i các h th ng mà thao tác c a nó là m t dãy hoàn toàn ư c c u trúc, ví d : các m ch i u khi n s . Vì i v i các h th ng lo i này thì t t c các tr ng thái c a nó có th d dàng ư c li t kê. Khi so n th o mã VHDL, thì các tr ng thái này s ư c khai báo trong ph n u c a ph n ARCHITECTURE dư i d ng ki u d li u li t kê ư c nh nghĩa b i ngư i s d ng. 8.2. Thi t k theo ki u 1 (thi t k theo mô hình may moore).

Có vài phương pháp có th ư c hình thành thi t k m t FSM. Chúng ta s mô t chi ti t m t ví d m u mà m ch hoàn toàn ư c c u trúc và d dàng áp d ng. Trong ó ph n m ch dãy c a máy tr ng thái s tách bi t v i ph n m ch t h pc a nó (hình v trên). T t c các tr ng thái c a máy luôn luôn ư c khai báo rõ ràng b ng cách s d ng ki u d li u li t kê.

- 93 -

ThiÕt kÕ vi m¹ch b»ng VHDL

Thi t k ph n m ch dãy:
Trên hình trên, các flip-flop n m ph n m ch dãy. Các u vào t bên ngoài c a ph n này là các tín hi u clock và reset. Các tín hi u này ư c n i v i các Flip-flop. M t u vào khác (bên trong) là tr ng thái ti p theo. u ra duy nh t c a ph n này là trang thái hi n t i. xây d ng cho ph n m ch dãy này, ta c n s d ng c u trúc PROCESS. Trong c u trúc c a PROCESS chúng ta co th s s d ng các câu l nh tu n t như l nh IF, WAIT, CASE, LOOP. Khuôn m u thi t k c a ph n m ch dãy s như sau:
PROCESS (reset, clock) BEGIN IF reset = ‘1’ THEN Trang_thai_hien_tai <= Trang_thai_0 ; ELSIF (clock ‘EVENT and clock = ‘’) THEN Trang_thai_hien_tai Trang_thai_tiep_theo; END IF ; END PROCESS ;

<=

Mã ch ra ây là r t ơn gi n. Nó ch ch a m t tín hi u reset ng b . Tín hi u reset này s xác nh tr ng thái kh i u c a h th ng, sau ó là lưu tr ng b tr ng thái ti p theo (t i sư n dương ông h ),và ưa ra u ra c a ph n m ch dãy tr ng thái hi n t i. Vi c thi t k cho ph n m ch dãy này thì ơn gi n vì nó là m t chu n cơ b n, và s lư ng các thanh ghi là t i thi u. ph n 7.5, chúng ta bi t r ng s lư ng các flip – flop s tính d a vào s bits c n thi t mã hoá t t c các tr ng thái c a FSM. B i v y n u m u ư c mã hoá theo cách m c nh (mã hoá nh phân) thì, chúng ta s c n log2n Flip-flop, v i n là s tr ng thái.

Thi t k ph n m ch t h p:
hình 1, thì ph n m ch t h p là y , vì v y mã c a nó s không c n thi t theo tu n t . T t nh t, chúng ta nên s d ng mã ng th i. Song trong ví d m u dư i ây chúng ta s s d ng mã tu n t v i câu l nh CASE óng vai trò trung tâm.
PROCESS (input, pr_state) BEGIN CASE pr_state IS WHEN state0 => IF (input = ...) THEN output <= <value>; nx_state <= state1; ELSE ... END IF;

- 94 -

ThiÕt kÕ vi m¹ch b»ng VHDL
WHEN state1 => IF (input = ...) THEN output <= <value>; nx_state <= state2; ELSE ... END IF; WHEN state2 => IF (input = ...) THEN output <= <value>; nx_state <= state2; ELSE ... END IF; ... END CASE; END PROCESS;

+ +

o n mã ây cũng r t ơn gi n, và nó s th c hi n 2 công vi c chính: Gán giá tr cho u ra. Thi t l p trang thái ti p theo.

M u máy tr ng thái cho ki u thi t k 1: Dư i ây là khuôn m u hoàn ch nh v ki u thi t k 1:
LIBRARY ieee; USE ieee.std_logic_1164.all; ----------------------------------------------------ENTITY <entity_name> IS PORT ( input: IN <data_type>; reset, clock: IN STD_LOGIC; output: OUT <data_type>); END <entity_name>; ----------------------------------------------------ARCHITECTURE <arch_name> OF <entity_name> IS TYPE state IS (state0, state1, state2, state3, ...); SIGNAL pr_state, nx_state: state; BEGIN ---------- Ph n m ch dãy: -----------------------PROCESS (reset, clock) BEGIN IF (reset='1') THEN pr_state <= state0; ELSIF (clock'EVENT AND clock='1') THEN pr_state <= nx_state; END IF; END PROCESS; ---------Ph n m ch t h p: -----------------------PROCESS (input, pr_state) BEGIN CASE pr_state IS WHEN state0 => IF (input = ...) THEN output <= <value>; nx_state <= state1;

- 95 -

ThiÕt kÕ vi m¹ch b»ng VHDL
ELSE ... END IF; WHEN state1 => IF (input = ...) THEN output <= <value>; nx_state <= state2; ELSE ... END IF; WHEN state2 => IF (input = ...) THEN output <= <value>; nx_state <= state3; ELSE ... END IF; ... END CASE; END PROCESS; END <arch_name>;

Ví d 8.1: B

m BCD

M tb m là m t ví d c a máy Moore, u ra ch ph thu c vào k t qu c a tr ng thái hi n t i. Gi ng như m t m ch thanh ghi và m t m ch dãy ơn gi n. thi t k m ch này, chúng ta có th dùng phương pháp thông thư ng như nh ng ph n m ch m ch t h p, nhưng ây ta s dùng phương pháp FSM. Gi s ta c n thi t k b m modul 10. Như v y chúng ta s c n có m t may có 10 trang thái. Các tr ng thái ây ư c g i là zero, one,…,nine. hình tr ng thái c a máy ư c cho như sau:

Hình 8.2. Sơ

tr ng thái c a b

m BCD

Mã VHDL cũng gi ng như khuôn m u c a thi t k m u 1. Trong ó: ki u d li u li t kê s xu t hi n dòng 11 – 12, thi t k c a ph n m ch dãy s t dòng 16 n dong 23, thi t k c a ph n m ch t h p(m ch t h p) s xu t

- 96 -

ThiÕt kÕ vi m¹ch b»ng VHDL
hi n t dòng 25 – 29. Do có 10 trang thái nên s lư ng cac thanh ghi b ng là [log210 ]= 4. Mã thi t k s như sau: ------------------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; ------------------------------------------------ENTITY counterBCD IS PORT ( clk, rst: IN STD_LOGIC; count: OUT STD_LOGIC_VECTOR (3 DOWNTO 0)); END counterBCD; ------------------------------------------------ARCHITECTURE state_machine OF counterBCD IS TYPE state IS (zero, one, two, three, four, five, six, seven, eight, nine); SIGNAL pr_state, nx_state: state; BEGIN ------------- Phan mach day: ----------------PROCESS (rst, clk) BEGIN IF (rst='1') THEN pr_state <= zero; ELSIF (clk'EVENT AND clk='1') THEN pr_state <= nx_state; END IF; END PROCESS; ------------- Phan mach to hop: ----------------PROCESS (pr_state) BEGIN CASE pr_state IS WHEN zero => count <= "0000"; nx_state <= one; WHEN one => count <= "0001"; nx_state <= two; WHEN two => count <= "0010"; nx_state <= three; WHEN three => count <= "0011"; nx_state <= four; WHEN four => count <= "0100"; nx_state <= five; WHEN five => count <= "0101"; nx_state <= six; WHEN six => count <= "0110"; nx_state <= seven; WHEN seven =>

- 97 -

ThiÕt kÕ vi m¹ch b»ng VHDL
count <= "0111"; nx_state <= eight; WHEN eight => count <= "1000"; nx_state <= nine; WHEN nine => count <= "1001"; nx_state <= zero; END CASE; END PROCESS; END state_machine; -------------------------------------------------

Mô ph ng k t qu :

Hình 8.3. K t qu mô ph ng c a b Ví d 8.2: Máy tr ng thái k t thúc ki u 1

m BCD

Hình 4 là sơ kh i c a 1 FSM ơn gi n. H th ng có 2 tr ng thái: tr ng thái A và tr ng thái B. Máy ph i chuy n tr ng thái khi nh n ư c d = 1 và u ra mong mu n là x = a khi máy tr ng thái A ho c x = b khi máy tr ng thái B.

Hình 8.4. Máy tr ng thái c a ví d 8.2 Mã thi t k s như sau:
------------------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; ---------------------------------------------ENTITY vd_FSM IS PORT ( a, b, d, clk, rst: IN BIT; x: OUT BIT);

- 98 -

ThiÕt kÕ vi m¹ch b»ng VHDL
END vd_FSM; ---------------------------------------------ARCHITECTURE state_machine OF vd_FSM IS TYPE state IS (stateA, stateB); SIGNAL pr_state, nx_state: state; BEGIN ---------- Phan mach day: ---------------------PROCESS (rst, clk) BEGIN IF (rst='1') THEN pr_state <= stateA; ELSIF (clk'EVENT AND clk='1') THEN pr_state <= nx_state; END IF; END PROCESS; ---------- Phan mach to hop: ----------------PROCESS (a, b, d, pr_state) BEGIN CASE pr_state IS WHEN stateA => x <= a; IF (d='1') THEN nx_state <= stateB; ELSE nx_state <= stateA; END IF; WHEN stateB => x <= b; IF (d='1') THEN nx_state <= stateA; ELSE nx_state <= stateB; END IF; END CASE; END PROCESS; END state_machine; ----------------------------------------------

K t qu mô ph ng:

Hình 8.5. K t qu mô ph ng cho ví d 8.2 8.3. Thi t k ki u 2.

Như chúng ta th y trong ki u thi t k 1 thì ch có tr ng thái hi n t i ư c lưu tr . T t c các m ch như v y s ư c tóm t t như trong hình 8.6.1. Trong trư ng h p này n u m ch là máy Mealy ( u ra c a nó ph thu c vào

- 99 -

ThiÕt kÕ vi m¹ch b»ng VHDL
u vào hi n t i), u ra có th thay i khi u vào thay i ( u ra không ng b ). Trong nhi u ng d ng, tín hi u ư c yêu c u là ng b , thì u ra s ch c p nh t khi thay i sư n clock. t o ra máy ng b Mealy, u ra ph i ư c lưu tr t t, như trong hình 8.6.2

Hình 8.6.1 Sơ

m ch ki u 1

Hình 8.6.2. Sơ

m ch ki u 2

C u trúc như trong hình 8.6.2 s là i tư ng c a thi t k ki u 2. th c hi n c u trúc m i này, chúng ta c n có vài s thay i so v i thi t k ki u 1. Ví d , chúng ta có th s d ng m t tín hi u thêm (như tín hi u trung gian) tính toán giá tr u ra ( o n trên), nhưng ch chuy n các giá tr c a nó thành tín hi u u ra khi s ki n clock thay i (ph n m ch dãy). S thay i này chúng ta s th y trong khuôn m u ch ra dư i ây:

Khuôn m u máy tr ng thái c a thi t k 2
LIBRARY ieee; USE ieee.std_logic_1164.all; ------------------------------------------------------ENTITY <ent_name> IS PORT (input: IN <data_type>; reset, clock: IN STD_LOGIC; output: OUT <data_type>); END <ent_name>; ------------------------------------------------------ARCHITECTURE <arch_name> OF <ent_name> IS TYPE states IS (state0, state1, state2, state3, ...); SIGNAL pr_state, nx_state: states; SIGNAL temp: <data_type>; BEGIN ---------- Phan mach day: -------------------------PROCESS (reset, clock) BEGIN IF (reset='1') THEN pr_state <= state0; ELSIF (clock'EVENT AND clock='1') THEN output <= temp; pr_state <= nx_state; END IF; END PROCESS;

- 100 -

ThiÕt kÕ vi m¹ch b»ng VHDL
---------- Phan mach to hop: -------------------------PROCESS (pr_state) BEGIN CASE pr_state IS WHEN state0 => temp <= <value>; IF (condition) THEN nx_state <= state1; ... END IF; WHEN state1 => temp <= <value>; IF (condition) THEN nx_state <= state2; ... END IF; WHEN state2 => temp <= <value>; IF (condition) THEN nx_state <= state3; ... END IF; ... END CASE; END PROCESS;

END <arch_name>;

So sánh khuôn m u c a thi t k ki u 2 v i thi t k ki u 1, chúng ta th y ch có m t s khác nhau duy nh t, ó là xu t hi n tín hi u trung gian temp. Tín hi u này s có tác d ng lưu tr u ra c a máy. Ch cho các giá tr chuy n thành u ra khi khi có s thay i s ki n clock. Ví d 8.3: Chúng ta s nhìn l i thi t k c a ví d 8.2. Tuy nhiên ây chúng ta mu n u ra là ng b (ch thay i khi có s ki n thay i clock). Vì v y trong ví d này chúng ta s thi t k theo ki u 2. ---------------------------------------------library IEEE; use IEEE.STD_LOGIC_1164.all; ---------------------------------------------ENTITY VD_FSM2 IS PORT ( a, b, d, clk, rst: IN BIT; x: OUT BIT); END VD_FSM2; ---------------------------------------------ARCHITECTURE VD_FSM2 OF VD_FSM2 IS TYPE state IS (stateA, stateB); SIGNAL pr_state, nx_state: state; SIGNAL temp: BIT; BEGIN ----- Phan mach day: ---------------------PROCESS (rst, clk)

- 101 -

ThiÕt kÕ vi m¹ch b»ng VHDL
BEGIN IF (rst='1') THEN pr_state <= stateA; ELSIF (clk'EVENT AND clk='1') THEN x <= temp; pr_state <= nx_state; END IF; END PROCESS; ---------- Phan mach to hop: ----------------PROCESS (a, b, d, pr_state) BEGIN CASE pr_state IS WHEN stateA => temp <= a; IF (d='1') THEN nx_state <= stateB; ELSE nx_state <= stateA; END IF; WHEN stateB => temp <= b; IF (d='1') THEN nx_state <= stateA; ELSE nx_state <= stateB; END IF; END CASE; END PROCESS; END VD_FSM2; ----------------------------------------------

ây chúng ta th y có 2 flip – flop ư c s d ng, m t cái c a máy, m t cái lưu tr u ra. B mô ph ng k t qu ư c ch ra trong hình dư i ây:

mã hoá tr ng thái

Hình 8.7.K t qu mô ph ng cho ví d 8.3 Ví d 8.4. B phát hi n chu i Chúng ta mu n thi t k m t m ch mà u vào là lu ng bit n i ti p và u ra là 1 khi u có xuât hi n chu i “111”, là 0 trong các trư ng h p còn l i hình tr ng thái c a máy ư c ch ra trong hình 8. ây chúng ta có 4 tr ng thái và chúng ta quy ư c là tr ng thái zero, one, tow, three. + Trang thái 0 là tr ng thái ch 1 u tiên. + Trang thai 1 là trang thái ã có 1 và ch 1 th 2

- 102 -

ThiÕt kÕ vi m¹ch b»ng VHDL
+ + Tr ng thái 2 là tr ng thái ã có 11 và ang ch 1 th 3. Tr ng thái 3 là tr ng thái thu ơc xâu 111.

Hình 8.8. Sơ

tr ng thái c a b phát hi n chu i

Mã c a máy ư c thi t k như sau:
---------------------------------------------library IEEE; use IEEE.STD_LOGIC_1164.all; ---------------------------------------------ENTITY Bo_doan_xau IS PORT ( d, clk, rst: IN BIT; q: OUT BIT); END Bo_doan_xau; -------------------------------------------ARCHITECTURE state_machine OF Bo_doan_xau IS TYPE state IS (zero, one, two, three); SIGNAL pr_state, nx_state: state; BEGIN --------- Phan mach day: -------------------PROCESS (rst, clk) BEGIN IF (rst='1') THEN pr_state <= zero; ELSIF (clk'EVENT AND clk='1') THEN pr_state <= nx_state; END IF; END PROCESS; ---------- Phan mach to hop: --------------PROCESS (d, pr_state) BEGIN CASE pr_state IS WHEN zero => q <= '0'; IF (d='1') THEN nx_state <= one; ELSE nx_state <= zero; END IF; WHEN one => q <= '0'; IF (d='1') THEN nx_state <= two;

- 103 -

ThiÕt kÕ vi m¹ch b»ng VHDL
ELSE nx_state <= zero; END IF; WHEN two => q <= '0'; IF (d='1') THEN nx_state <= three; ELSE nx_state <= zero; END IF; WHEN three => q <= '1'; IF (d='0') THEN nx_state <= zero; ELSE nx_state <= three; END IF; END CASE; END PROCESS; END state_machine; --------------------------------------------

K t qu mô ph ng s như sau:

Hình 8.9.K t qu mô ph ng cho b Ví d 8.5: B i u khi n èn giao thông (TLC)

oán nh n xâu.

Như ã gi i thi u ph n m ch m ch t h p, b i u khi n s là m ch ví d t t có th th c hi n hi u qu khi mô hình hoá máy tr ng thái. Trong ví d này, chúng ta s thi t k m t TLC v i nh ng c i m ư c tóm lư c như trong hình 8.10:

Hình 8.10.a. Sơ

nguyên lý ho t

ng c a TLC

- 104 -

ThiÕt kÕ vi m¹ch b»ng VHDL

Hình 8.10.b.

hình tr ng thái c a TLC

ây chúng ta th y có 3 ch thao tác: + Ch bình thư ng: ch này, m ch có 4 tr ng thái, m i tr ng thái là c l p, th i gian l p trình ….? + Ch ki m tra: Cho phép t t c th i gian ư c l p trình trư c ư c vi t lên v i 1 giá tr nh , do v y h th ng có th d dàng ư c ki m tra trong su t quá trình ba dư ng. + Ch Standby: N u thi t l p h th ng s kích ho t èn vàng trong khi tín hi u standby ư c kích ho t. ng th i 1 ông h t n s 60 HZ luôn ho t ng. Mã thi t k :
-----------------------------------------------------------library IEEE; use IEEE.STD_LOGIC_1164.all; ENTITY Bodk_den_giao_thong IS PORT ( clk, stby, test: IN STD_LOGIC; r1, r2, y1, y2, g1, g2: OUT STD_LOGIC); END Bodk_den_giao_thong; ------------------------------------------------ARCHITECTURE state_machine_be OF Bodk_den_giao_thong IS CONSTANT timeMAX : INTEGER := 2700; CONSTANT timeRG : INTEGER := 1800; CONSTANT timeRY : INTEGER := 300; CONSTANT timeGR : INTEGER := 2700; CONSTANT timeYR : INTEGER := 300; CONSTANT timeTEST : INTEGER := 60; TYPE state IS (RG, RY, GR, YR, YY); SIGNAL pr_state, nx_state: state; SIGNAL time : INTEGER RANGE 0 TO timeMAX; BEGIN -------------Phan mach day: ---PROCESS (clk, stby) VARIABLE count : INTEGER RANGE 0 TO timeMAX; BEGIN IF (stby='1') THEN pr_state <= YY; count := 0;

- 105 -

ThiÕt kÕ vi m¹ch b»ng VHDL
ELSIF (clk'EVENT AND clk='1') THEN count := count + 1; IF (count = time) THEN pr_state <= nx_state; count := 0; END IF; END IF; END PROCESS; ----------- Phan mach to hop: ---PROCESS (pr_state, test) BEGIN CASE pr_state IS WHEN RG => r1<='1';r2<='0';y1<='0'; y2<='0'; g1<='0'; g2<='1'; nx_state <= RY; IF (test='0') THEN time <= timeRG; ELSE time <= timeTEST; END IF; WHEN RY => r1<='1';r2<='0';y1<='0';y2<='1';g1<='0'; g2<='0'; nx_state <= GR; IF (test='0') THEN time <= timeRY; ELSE time <= timeTEST; END IF; WHEN GR => r1<='0';r2<='1';y1<='0';y2<='0';g1<='1'; g2<='0'; nx_state <= YR; IF (test='0') THEN time <= timeGR; ELSE time <= timeTEST; END IF; WHEN YR => r1<='0';r2<='1';y1<='1'; y2<='0'; g1<='0'; g2<='0'; nx_state <= RG; IF (test='0') THEN time <= timeYR; ELSE time <= timeTEST; END IF; WHEN YY => r1<='0';r2<='0';y1<='1'; y2<='1'; g1<='0'; g2<='0'; nx_state <= RY; END CASE; END PROCESS; END state_machine_be; ----------------------------------------------------

Như ta th y, s lư ng Flip-flop ã dùng th c hi n m ch là 15 cái: 3 cái cho lưu tr tr ng thái hi n t i, 12 cái còn l i cho b m. có th d dàng th y k t qu mô ph ng, ây ta th c hi n gi m th i gian th c t i 100 l n. K t qu mô ph ng ư c ch ra trong hình dư i ây: + ch ho t ng bình thư ng (stby = 0, test = 0):

- 106 -

ThiÕt kÕ vi m¹ch b»ng VHDL

+

Hình 8.11.a. K t qu mô ph ng TLC ch ki m tra:

ch

hd bình thư ng

Hình 8.11.b. K t qu mô ph ng TLC ch ki m tra Ví d 8.6: B phát tín hi u: Chúng ta mu n thi t k m t m ch mà t tín hi u clock clk ưa ra tín hi u như trong hình dư i ây:

Hình 8.12.D ng tín hi u c n t o. ây m ch ph i ho t ng c 2 sư n c a tín hi u clk.

- 107 -

ThiÕt kÕ vi m¹ch b»ng VHDL
Mã chương trình: ----------------------------------------ENTITY Bo_phat_tin_hieu IS PORT ( clk: IN BIT; outp: OUT BIT); END Bo_phat_tin_hieu; ----------------------------------------ARCHITECTURE state_machine OF Bo_phat_tin_hieu IS TYPE state IS (one, two, three); SIGNAL pr_state1, nx_state1: state; SIGNAL pr_state2, nx_state2: state; SIGNAL out1, out2: BIT; BEGIN ----- Phan mach day cua may 1: --PROCESS(clk) BEGIN IF (clk'EVENT AND clk='1') THEN pr_state1 <= nx_state1; END IF; END PROCESS; ----- Phan mach day cua may 2: --PROCESS(clk) BEGIN IF (clk'EVENT AND clk='0') THEN pr_state2 <= nx_state2; END IF; END PROCESS; ---- Phan mach to hop cua may 1: ----PROCESS (pr_state1) BEGIN CASE pr_state1 IS WHEN one => out1 <= '0'; nx_state1 <= two; WHEN two => out1 <= '1'; nx_state1 <= three; WHEN three => out1 <= '1'; nx_state1 <= one; END CASE; END PROCESS; ---- Phan mac«pt hop cua may 2: ----PROCESS (pr_state2) BEGIN CASE pr_state2 IS WHEN one => out2 <= '1'; nx_state2 <= two; WHEN two => out2 <= '0'; nx_state2 <= three; WHEN three => out2 <= '1'; nx_state2 <= one;

- 108 -

ThiÕt kÕ vi m¹ch b»ng VHDL
END CASE; END PROCESS; outp <= out1 AND out2; END state_machine; ------------------------------------------

K t qu mô ph ng:

Hình 8.13.K t qu mô ph ng cho ví d 8.6 8.4. Ki u mã hoá: t nh phân sang Onehot.

mã hoá tr ng thái c a máy tr ng thái, chúng ta có th ch n m t trong vài ki u có s n. Ki u mã hoá m c nh là nh phân. Ưu i m c a ki u mã hoá này là nó yêu c u s lư ng flip-flop ít nh t. Trong trư ng h p này, v i n m ch flip-flop thì có th chúng ta có th mã hoá ư c 2n tr ng thái. Như c i m c a ki u mã hoá này là nó yêu c u v logic nhi u hơn và nó ch m hơn so v i nh ng ki u khác. Cái cu i cùng là ki u mã hoá onehot, v i ki u mã hoá này, chúng ta c n s d ng 1 flip-flop cho 1 tr ng thái. Vì v y, nó òi h i s lư ng flip-flop l n nh t. Trong trư ng h p này, v i n flip-flop (n bit) ch có th mã hoá ư c n tr ng thái. Nhưng bù l i, phương pháp này l i yêu c u tính toán logic it nh t, và t c nhanh nh t M t ki u n m gi a 2 ki u trên là ki u mã hoá twohot (trong m t tr ng thái ch có 2 bit 1). Vì v y v i n flip-flop (n bit), thì chúng ta có th mã hoá ư c n(n-1)/2 tr ng thái. Ki u mã hoá onehot ư c gi i thi u trong các ng d ng mà s lư ng các flip-flop nhi u như trong các chip FPGA. Nhưng trong các m ch ASIC thì mã nh phân l i ư c ưu tiên hơn. Ví d : Gi s chúng ta có m t máy tr ng thái có 8 trang thái như trong b ng dư i ây:

B ng 8.1.Mã hoá tr ng thái cho máy FSM 8 tr ng thái

- 109 -

ThiÕt kÕ vi m¹ch b»ng VHDL
V i 8 tr ng thái c a máy này thì s lư ng flip-flop ư c yêu c u ng v i các ki u mã hoá s b ng: + 3 (=log28), ng v i ki u mã hoá nh phân. + 5 ( n(n-1)/2= 8 => n = 5 ), ng v i ki u mã hoá twohot + 8, ng v i ki u mã hoá onehot.

- 110 -

ThiÕt kÕ vi m¹ch b»ng VHDL

Chương 9: Thi t k thêm các m ch
Ph n này chúng ta s trình bày các m ch sau: + Barrel shifter + B so sánh không d u và có d u. + B c ng + B chia d u ch m tĩnh. + B i u khi n máy bán hàng. + B nh n d li u n i ti p. + B chuy n i song song sang n i ti p. + SSD + B phát tín hi u + B nh 9.1. Barrel Shifter.

Sơ c a m ch c a b d ch barrel ư c ch ra trong hình 9.1. u vào là vector 8 bit. u ra là phiên b n d ch c a u vào, v i lư ng d ch ư c nh nghĩa b i 8 u vào “shift” (t o n 7). M ch g m có 3 b d ch barrel riêng l , m i m t cái gi ng như trong ví d 6.9. Nhưng chúng ta ph i chu ý r ng, barrel u tiên có ch có 1 u “0” ư c k t n i v i m t b d n kênh, trong khi barrel th 2 có 2 u vào “0” và barrel cu i cùng có t i 4 u vào “0”. vector l n hơn thì chúng ta ph i d 2 u vào là “0”. Ví d n u shift = “001” thì ch barrel u tiên gây ra d ch, còn n u shift = “111” thì t t các u gây ra d ch.

Hình 9.1. B d ch barrel
- 111 -

ThiÕt kÕ vi m¹ch b»ng VHDL
Mã thi t k s như sau:
--------------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; --------------------------------------------ENTITY barrel IS PORT ( inp: IN STD_LOGIC_VECTOR (7 DOWNTO 0); shift: IN STD_LOGIC_VECTOR (2 DOWNTO 0); outp: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END barrel; --------------------------------------------ARCHITECTURE behavior OF barrel IS BEGIN PROCESS (inp, shift) VARIABLE temp1: STD_LOGIC_VECTOR (7 DOWNTO 0); VARIABLE temp2: STD_LOGIC_VECTOR (7 DOWNTO 0); BEGIN ---- Bo dich thu nhat ----IF (shift(0)='0') THEN temp1 := inp; ELSE temp1(0) := '0'; FOR i IN 1 TO inp'HIGH LOOP temp1(i) := inp(i-1); END LOOP; END IF; ---- Bo dich thu 2 ----IF (shift(1)='0') THEN temp2 := temp1; ELSE FOR i IN 0 TO 1 LOOP temp2(i) := '0'; END LOOP; FOR i IN 2 TO inp'HIGH LOOP temp2(i) := temp1(i-2); END LOOP; END IF; ---- Bo dich thu 3 ----IF (shift(2)='0') THEN outp <= temp2; ELSE FOR i IN 0 TO 3 LOOP outp(i) <= '0'; END LOOP; FOR i IN 4 TO inp'HIGH LOOP outp(i) <= temp2(i-4); END LOOP; END IF; END PROCESS; END behavior; ---------------------------------------------

- 112 -

ThiÕt kÕ vi m¹ch b»ng VHDL
K t qu mô ph ng:

Hình 9.2.K t qu mô ph ng cho b d ch barrel 9.2. B so sánh không d u và có d u.

Hình 9.3 hi n lên sơ c a b so sánh. Kích thư c c a vector ư c so sánh là generic (n+1). 3 u ra ph i ư c cung c p là: 1 u ra là a>b, 1 u ra là a = b, u ra còn l i là a < b. 3 gi i pháp ư c gi i thi u : u tiên xét a và b là các s có d u, trong khi 2 gi i pháp còn l i là các s không d u. K t qu mô ph ng s cho chúng ta th y rõ hơn.

Hình 9.3.Mô hình c a b so sánh B so sánh có d u: làm vi c v i s có d u ho c s không d u thì chúng ta u ph i khai báo gói std_logic_arith (c th chúng ta s th y trong o n mã dư i ây). Mã thi t k b so sánh có d u: ---- Bo so sanh co dau: ---------------LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; -- can thiet! ---------------------------------------ENTITY Bo_so_sanh_co_dau IS GENERIC (n: INTEGER := 7); PORT (a, b: IN SIGNED (n DOWNTO 0); x1, x2, x3: OUT STD_LOGIC); END Bo_so_sanh_co_dau; ---------------------------------------ARCHITECTURE arc OF Bo_so_sanh_co_dau IS BEGIN x1 <= '1' WHEN a > b ELSE '0'; x2 <= '1' WHEN a = b ELSE '0'; x3 <= '1' WHEN a < b ELSE '0'; END arc;

- 113 -

ThiÕt kÕ vi m¹ch b»ng VHDL
----------------------------------------

K t qu mô ph ng:

Hình 9.4. K t qu mô ph ng b so sánh có d u B so sánh không d u 1: Ph n mã VHDL sau ây là b n sao c a ph n mã ã ư c trình bày ( b so sánh không d u). ---- Bo so sanh khong dau 1: ----------LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; --rat can thiet! ---------------------------------------ENTITY Bo_so_sanh_khong_dau1 IS GENERIC (n: INTEGER := 7); PORT (a, b: IN UNSIGNED (n DOWNTO 0); x1, x2, x3: OUT STD_LOGIC); END Bo_so_sanh_khong_dau1; ---------------------------------------ARCHITECTURE arc OF Bo_so_sanh_khong_dau1 IS BEGIN x1 <= '1' WHEN a > b ELSE '0'; x2 <= '1' WHEN a = b ELSE '0'; x3 <= '1' WHEN a < b ELSE '0'; END arc; ----------------------------------------

K t qu :

Hình 9.5.1.K t qu b so sánh không d u 1

- 114 -

ThiÕt kÕ vi m¹ch b»ng VHDL
B so sánh không d u 2: B so sánh không d u có th cũng ư c th c hi n v i STD_LOGIC_VECTORS, trong trư ng h p này không c n thi t ph i khai báo std_logic_arith. Mã thi t k s như sau: ---- Bo so sanh khong dau: ----------LIBRARY ieee; USE ieee.std_logic_1164.all; ---------------------------------------ENTITY comparator IS GENERIC (n: INTEGER := 7); PORT (a, b: IN STD_LOGIC_VECTOR (n DOWNTO 0); x1, x2, x3: OUT STD_LOGIC); END comparator; ---------------------------------------ARCHITECTURE unsigned OF comparator IS BEGIN x1 <= '1' WHEN a > b ELSE '0'; x2 <= '1' WHEN a = b ELSE '0'; x3 <= '1' WHEN a < b ELSE '0'; END unsigned;

Mô ph ng k t qu :

Hình 9.5.2. K t qu c a b so sánh không d u2 9.3. B c ng Carry Ripple và b c ng Carry Look Ahead.

Carry ripple và carry look ahead là 2 phương pháp c i n thi t k cácc b c ng. Phương pháp u tiên có thu n l i là yêu c u ph n c ng ít, trong khi cái th hai l i nhanh hơn. + B c ng carry ripple: Hìnhd 9.6 ch ra 1 b c ng ripple cary 4 bit không d u:

- 115 -

ThiÕt kÕ vi m¹ch b»ng VHDL

Hình 9.6. Sơ b c ng ripple carry Trên sơ ta có th th y, v i m i bit, m t ơn v b c ng y s ư c th c hi n. B ng th t c a b c ng y ư c ch ra bên c nh sơ , trong ó a, b là các bít u vào, cin là bit nh vào, s là bit t ng, cout là bit nh ra. T b ng th t ta d dàng tính ư c: s = a xor b xor cin cout = (a and b) xor (a and cin) xor (b xor cin) T công th c trên ta xây d ng chương trình VHDL như sau ( ây chúng ta có th áp d ng cho b t kỳ s lư ng u vào nào):
LIBRARY ieee; USE ieee.std_logic_1164.all; --------------------------------------------ENTITY Bo_cong_carry_ripple IS GENERIC (n: INTEGER := 4); PORT ( a, b: IN STD_LOGIC_VECTOR (n-1 DOWNTO 0); cin: IN STD_LOGIC; s: OUT STD_LOGIC_VECTOR (n-1 DOWNTO 0); cout: OUT STD_LOGIC); END Bo_cong_carry_ripple; --------------------------------------------ARCHITECTURE arc OF Bo_cong_carry_ripple IS SIGNAL c: STD_LOGIC_VECTOR (n DOWNTO 0); BEGIN c(0) <= cin; G1: FOR i IN 0 TO n-1 GENERATE s(i) <= a(i) XOR b(i) XOR c(i); c(i+1) <= (a(i) AND b(i)) OR (a(i) AND c(i)) OR (b(i) AND c(i)); END GENERATE; cout <= c(n); END arc; ---------------------------------------------

K t qu mô ph ng:

Hình 9.7. K t qu mô ph ng cho b c ng ripple carry
- 116 -

ThiÕt kÕ vi m¹ch b»ng VHDL
+ B c ng carry look ahead: Sơ ây: b c ng carry look ahead 4 bit ư c ch ra trong hình 9.8.1 dư i

Hình 9.8.1. Sơ

b c ng carry look ahead

M ch ư c ho t ng d a trên các khái niêm generate và propagate. Chính c i m này ã làm cho b c ng này th c hi n v i t c nhanh hơn so v i b c ng trư c. Gi s 2 u vào là 2 bit a,b thì 2 tín hi u p(propagate) và g(generate) ư c tính như sau: g = a and b p = a or b N u chúng ta xem a, b là các vector: a = a(n-1)…a(1)a(0) ; b = b(n-1)…b(1)b(0) thì g, p ư c tính như sau: p = p(n-1)…p(1)p(0); g = g(n-1)…g(1)g(0) Trong ó: g(i) = a(i) and b(i) p(i) = a(i) or b(i) Lúc này vector nh s là: c = c(n-1)…c(1)c(0), trong ó: c(0) = cin c(1) = c(0)p(0) + g(0) c(2) = c(0)p(0)p(1) + g(0)p(1) + g(1) c(i) = c(i-1)p(i-1) + g(i-1) T công th c tình trên, chúng ta vi t chương trình thi t k b c ng carry look ahead 4 bit như sau:
--------------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; --------------------------------------------ENTITY Bo_cong_carry_look_ahead IS PORT ( a, b: IN STD_LOGIC_VECTOR (3 DOWNTO 0);

- 117 -

ThiÕt kÕ vi m¹ch b»ng VHDL
cin: IN STD_LOGIC; s: OUT STD_LOGIC_VECTOR (3 DOWNTO 0); cout: OUT STD_LOGIC); END Bo_cong_carry_look_ahead; --------------------------------------------ARCHITECTURE Bo_cong_carry_look_ahead Bo_cong_carry_look_ahead IS SIGNAL c: STD_LOGIC_VECTOR (4 DOWNTO 0); SIGNAL p: STD_LOGIC_VECTOR (3 DOWNTO 0); SIGNAL g: STD_LOGIC_VECTOR (3 DOWNTO 0); BEGIN ---- PGU: --------------------------------G1: FOR i IN 0 TO 3 GENERATE p(i) <= a(i) XOR b(i); g(i) <= a(i) AND b(i); s(i) <= p(i) XOR c(i); END GENERATE; ---- CLAU: -------------------------------c(0) <= cin; c(1) <= (cin AND p(0)) OR g(0); c(2) <= (cin AND p(0) AND p(1)) OR (g(0) AND p(1)) OR g(1); c(3) <= (cin AND p(0) AND p(1) AND p(2)) OR (g(0) AND p(1) AND p(2)) OR (g(1) AND p(2)) OR g(2); c(4) <= (cin AND p(0) AND p(1) AND p(2) AND p(3)) OR (g(0) AND p(1) AND p(2) AND p(3)) OR (g(1) AND p(2) AND p(3)) OR (g(2) AND p(3)) OR g(3); cout <= c(4); END Bo_cong_carry_look_ahead; ---------------------------------------------

OF

K t qu mô ph ng:

Hình 9.8.2. K t qu mô ph ng cho b c ng carry look ahead

- 118 -

ThiÕt kÕ vi m¹ch b»ng VHDL
9.4. B chia d u ch m tĩnh. Trư c khi i vào thi t k , chúng ta c n ph i nh c l i thu t toán chia: Thu t toán chia: M c ích c a thu t toán là chúng ta c n tính y = a/b trong ó a, b là nh ng s cùng có (n+1) bit. Thu t toán ư c th hi n trong b ng 9.9, trong ó a = “1011” ( = (11)10) và b = “0011” (=(3)10). K t qu s thu ư c: thương y = “0011” (=(3)10) và s dư r = “0010” (=(2)10). Ch s 3 2 1 0 u vào a 1011 1011 1011 0101 0010 So sánh < < > > u vào b 0011000 0001100 0000110 0000011 y 0 0 1 1 Thao tác cho c t a Không làm gì Không làm gì Tr c t a cho c t b Tr c t a cho c t b

Hình 9.9. Thu t toán chia Gi i thích thu t toán: + u tiên chuy n s chia thành s 2n+1 bit b ng cách thêm vào sau n -1 bit 0 , s b chia v n gi nguyên. + So sánh s b chia v i s chia . N u s b chia l n hơn ho c b ng s chia thì gán y =1 và thay s b chia b ng hi u c a s b chia v i s chia. Ngư c l i thì y =0 + Quá trình th c hi n liên t c cho n khi h t n l n. + Thương là dãy bit c a y, s dư là sô b chia cu i cùng. thi t k b chia này thì chúng ta có 2 phương pháp: C 2 phương pháp u th c hi n theo mã tu n t : Phương pháp th nh t ch th c hi n b ng câu l n if, phương pháp th 2 th c hi n b ng c câu l n if và loop. Mã thi t k b chia s như sau: Thi t k theo phương pháp 1: ----- Phuong phap 1: step-by-step ------------------LIBRARY ieee; USE ieee.std_logic_1164.all; -------------------------------------------------ENTITY Bo_chia IS PORT ( a, b: IN INTEGER RANGE 0 TO 15; y: OUT STD_LOGIC_VECTOR (3 DOWNTO 0); rest: OUT INTEGER RANGE 0 TO 15; err : OUT STD_LOGIC); END Bo_chia;

- 119 -

ThiÕt kÕ vi m¹ch b»ng VHDL
-------------------------------------------------ARCHITECTURE arc OF Bo_chia IS BEGIN PROCESS (a, b) VARIABLE temp1: INTEGER RANGE 0 TO 15; VARIABLE temp2: INTEGER RANGE 0 TO 15; BEGIN ----- Khoi tao va bat loi: ------temp1 := a; temp2 := b; IF (b=0) THEN err <= '1'; ELSE err <= '0'; END IF; ----- y(3): --------------------------IF (temp1 >= temp2 * 8) THEN y(3) <= '1'; temp1 := temp1 - temp2*8; ELSE y(3) <= '0'; END IF; ----- y(2): --------------------------IF (temp1 >= temp2 * 4) THEN y(2) <= '1'; temp1 := temp1 - temp2 * 4; ELSE y(2) <= '0'; END IF; ----- y(1): --------------------------IF (temp1 >= temp2 * 2) THEN y(1) <= '1'; temp1 := temp1 - temp2 * 2; ELSE y(1) <= '0'; END IF; ----- y(0): --------------------------IF (temp1 >= temp2) THEN y(0) <= '1'; temp1 := temp1 - temp2; ELSE y(0) <= '0'; END IF; ----- Phan du: ---------------------rest <= temp1; END PROCESS; END arc; --------------------------------------------------

K t qu mô ph ng:

Hình 9.10.1. K t qu mô ph ng b chia

- 120 -

ThiÕt kÕ vi m¹ch b»ng VHDL

Thi t k theo phương pháp 2: ------ Phuong phap 2:----------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; -------------------------------------------------ENTITY Bo_chia2 IS GENERIC(n: INTEGER := 3); PORT ( a, b: IN INTEGER RANGE 0 TO 15; y: OUT STD_LOGIC_VECTOR (3 DOWNTO 0); rest: OUT INTEGER RANGE 0 TO 15; err : OUT STD_LOGIC); END Bo_chia2; -------------------------------------------------ARCHITECTURE arc OF Bo_chia2 IS BEGIN PROCESS (a, b) VARIABLE temp1: INTEGER RANGE 0 TO 15; VARIABLE temp2: INTEGER RANGE 0 TO 15; BEGIN ----- Khoi tao gia tri va bat loi: ------temp1 := a; temp2 := b; IF (b=0) THEN err <= '1'; ELSE err <= '0'; END IF; ----- thuong: -----------------------------FOR i IN n DOWNTO 0 LOOP IF(temp1 >= temp2 * 2**i) THEN y(i) <= '1'; temp1 := temp1 - temp2 * 2**I; ELSE y(i) <= '0'; END IF; END LOOP; ----- phan du: ---------------------rest <= temp1; END PROCESS; END arc; --------------------------------------------------

K t qu mô ph ng:

Hình 9.10.2.K t qu mô phong b chia th 2

- 121 -

ThiÕt kÕ vi m¹ch b»ng VHDL
9.5. B i u khi n máy bán hàng.

Trong ví d này, chúng ta s thi t k b i u khi n máy bán hàng, máy bán hàng s bán các thanh k o v i giá 25 xu. Chúng ta s thi t k theo mô hình máy FSM. u ra và u vào c a b i u khi n ư c th hi n trong hình 9.11. Tín hi u vào là nickel_in, dime_in, và quarter_in thông báo r ng m t ng ti n tương ng ư c g i vào tài kho n. Ngoài ra còn có 2 u vào i u khi n: u vào reset (rst) và u vào clock (clk). B i u khi n tr l i b ng 3 tín hi u u ra: candy_out ( phân phát thanh k o), nickel_out và dime_out(c p nh t l i thay i). Trên hình 9.11 cũng ch ra hình tr ng thái c a máy FSM. Các s bên trong các vòng tròn bi u di n t ng tài kho n c a khách hàng (ch có các nickel, dime và quarter là ư c ch p nh n).

Hình 9.11.

hình tr ng thái c a b

i u khi n máy bán hàng

Tr ng thái 0 là tr ng thái là tr ng thái không làm gì c . T ó n u 1 ng nickel ư c g i vào tài kho n, máy s chuy n tr ng thái n tr ng thái 5, n u 1 ng dime ư c g i vào tài kho n thì máy chuy n t i tr ng thái 10 ho c n u 1 ng quarter thì máy s chuy n n tr ng thái 25. Tình hu ng tương t s ư c l p l i cho t t c các tr ng thái, cho t i tr ng thai 20. N u tr ng thái 25 ư c xác nh n, thì thanh k o ư c phân phát và không chuy n i. Tuy nhiên n u tr ng thái 40 ư c xác nh n thì a nickel ư c tr l i, b i v y tr ng thái s
- 122 -

ThiÕt kÕ vi m¹ch b»ng VHDL
chuy n t i tr ng thái 35, ó là 1 tr ng thái mà 1 dime ư c tr l i và 1 candy bar ư c phân phát. Có 3 tr ng thái t o ra chu trình kép, ó là t 1 thanh k o ư c phân phát và máy tr l i tr ng thái 0. Bài toán này s ư c chia thành 2 ph n: + Trong ph n u: di n m o cơ b n liên quan n thi t k b i u khi n máy bán hàng (như trong hình 9.11) . + Trong ph n 2: Các ch c năng m r ng ư c thêm vào. ây chúng ta ch nghiên c u ph n m t c a bài toán: Nhìn vào hình tr ng thái c a máy hình 9.11, chúng ta th y có 10 tr ng thái, như v y c n có 4 bit mã hoá các tr ng thái, t c là c n s d ng 4 flip-flop. Mã thi t k s như sau:
-----------------------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; -----------------------------------------------------ENTITY Bo_dieu_khien_may_bh IS PORT ( clk, rst: IN STD_LOGIC; nickel_in, dime_in, quarter_in: IN BOOLEAN; candy_out, nickel_out, dime_out: OUT STD_LOGIC); END Bo_dieu_khien_may_bh; -----------------------------------------------------ARCHITECTURE state_machine OF Bo_dieu_khien_may_bh IS TYPE state IS (st0, st5, st10, st15, st20, st25, st30, st35, st40, st45); SIGNAL present_state, next_state: STATE; BEGIN ---- Lower section of the FSM (Sec. 8.2): --------PROCESS (rst, clk) BEGIN IF (rst='1') THEN present_state <= st0; ELSIF (clk'EVENT AND clk='1') THEN present_state <= next_state; END IF; END PROCESS; ---- Upper section of the FSM (Sec. 8.2): --------PROCESS (present_state, nickel_in, dime_in, quarter_in) BEGIN CASE present_state IS WHEN st0 => candy_out <= '0'; nickel_out <= '0'; dime_out <= '0'; IF (nickel_in) THEN next_state <= st5; ELSIF (dime_in) THEN next_state <= st10; ELSIF (quarter_in) THEN next_state <= st25; ELSE next_state <= st0; END IF; WHEN st5 => candy_out <= '0'; nickel_out <= '0'; dime_out <= '0'; IF (nickel_in) THEN next_state <= st10; ELSIF (dime_in) THEN next_state <= st15;

- 123 -

ThiÕt kÕ vi m¹ch b»ng VHDL
ELSIF (quarter_in) THEN next_state <= st30; ELSE next_state <= st5; END IF; WHEN st10 => candy_out <= '0'; nickel_out <= '0'; dime_out <= '0'; IF (nickel_in) THEN next_state <= st15; ELSIF (dime_in) THEN next_state <= st20; ELSIF (quarter_in) THEN next_state <= st35; ELSE next_state <= st10; END IF; st15 => candy_out <= '0'; nickel_out <= '0'; dime_out <= '0'; IF (nickel_in) THEN next_state <= st20; ELSIF (dime_in) THEN next_state <= st25; ELSIF (quarter_in) THEN next_state <= st40; ELSE next_state <= st15; END IF; st20 => candy_out <= '0'; nickel_out <= '0'; dime_out <= '0'; IF (nickel_in) THEN next_state <= st25; ELSIF (dime_in) THEN next_state <= st30; ELSIF (quarter_in) THEN next_state <= st45; ELSE next_state <= st20; END IF; st25 => candy_out <= '1'; nickel_out <= '0'; dime_out <= '0'; next_state <= st0; st30 => candy_out <= '1'; nickel_out <= '1'; dime_out <= '0'; next_state <= st0; st35 => candy_out <= '1'; nickel_out <= '0'; dime_out <= '1'; next_state <= st0; st40 => candy_out <= '0'; nickel_out <= '1'; dime_out <= '0'; next_state <= st35; st45 => candy_out <= '0'; nickel_out <= '0'; dime_out <= '1'; next_state <= st35;

WHEN

WHEN

WHEN

WHEN

WHEN

WHEN

WHEN

END CASE; END PROCESS; END state_machine; ------------------------------------------------------

- 124 -

ThiÕt kÕ vi m¹ch b»ng VHDL
K t qu mô ph ng:

Hình 9.12.K t qu mô ph ng b 9.6. B nh n d li u n i ti p.

i u khi n máy bán hàng

Sơ kh i c a b nh n d li u n i ti p ư c ch ra trong hình 9.13. Nó bao g m m t u vào d li u n i ti p (din) và m t u ra d li u song song (data(6:0)). Ngoài ra còn có tín hi u i u khi n clk (tín hi u clock). Hai tín hi u giám sát ư c t o ra b i m ch là: tín hi u err (error) và tín hi u data_valid. u vào x lý ch a 10 bít. Bit u tiên là bit b t u, n u bit là 1 thì m ch b t u nh n d li u. 7 bit ti p theo là các bit d li u ho t ng. Bit th 9 là bit ch n l : bit này = ‘0’ n u s lư ng các bit 1 trong d li u la ch n và b ng ‘1’ trong trư ng h còn l i. Bit 10 là bit stop: bit này s mang giá tr là 1 n u quá trình chuy n i là úng. M t l i ư c phát hi n khi bit ch n l không ư c ki m tra ho c bit stop không ph i la ‘1’. Khi quá trình nh n k t thúc mà không có l i nào ư c phát hi n thì d li u ư c lưu tr trong các thanh ghi bên trong s chuy n vào data(6:0) và u ra data_valid ư c xác nh n.

Hình 9.13. Sơ

b nh n d li u n i ti p

thi t k m ch này chúng ta s s d ng m t vài bi n làm các bi n m, bi n xác nh n s bit nh n ư c, bi n lưu tr d li u, bi n tính toán l i và bi n trung gian. Mã thi t k b nh n d li u n i ti p s như sau:
--------------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; --------------------------------------------ENTITY Bo_nhan_du_lieu_nt IS PORT ( din, clk, rst: IN BIT; data: OUT BIT_VECTOR (6 DOWNTO 0);

- 125 -

ThiÕt kÕ vi m¹ch b»ng VHDL
err, data_valid: OUT BIT); END Bo_nhan_du_lieu_nt; --------------------------------------------ARCHITECTURE arc OF Bo_nhan_du_lieu_nt IS BEGIN PROCESS (rst, clk) VARIABLE count: INTEGER RANGE 0 TO 10; VARIABLE reg: BIT_VECTOR (10 DOWNTO 0); VARIABLE temp : BIT; BEGIN IF (rst='1') THEN count:=0; reg := (reg'RANGE => '0'); temp := '0'; err <= '0'; data_valid <= '0'; ELSIF (clk'EVENT AND clk='1') THEN IF (reg(0)='0' AND din='1') THEN reg(0) := '1'; ELSIF (reg(0)='1') THEN count := count + 1; IF (count < 10) THEN reg(count) := din; ELSIF (count = 10) THEN temp := (reg(1) XOR reg(2) XOR reg(3) XOR reg(4) XOR reg(5) XOR reg(6) XOR reg(7) XOR reg(8)) OR NOT reg(9); err <= temp; count := 0; reg(0) := din; IF (temp = '0') THEN data_valid <= '1'; data <= reg(7 DOWNTO 1); END IF; END IF; END IF; END IF; END PROCESS; END arc; -------------------------------------------------

K t qu mô ph ng:

- 126 -

ThiÕt kÕ vi m¹ch b»ng VHDL

Hình 9.14.K t qu mô ph ng b nh n d li u 9.7. B chuy n song song thành n i ti p.

B chuy n song song thành n i ti p là m t lo i ng d ng c a thanh ghi d ch. B chuy n i này s th c hi n vi c g i i m t kh i d li u n i ti p. Vi c s d ng b chuy n i này là r t c n thi t ví d : Trong các con chip ASIC, khi không có các chân dư cho ra ng th i t t c các bit d li u. Khi ó chúng ta c n thi t ph i s d ng b chuy n i song song thành n i ti p. Sơ kh i c a b chuy n i song song thánh n i ti p ư c trình bày trong hình 9.15.

Hình 9.15.B chuy n song song thành n i ti p Trong ó: + d(7:0) là vector d li u g i i + dout là u ra th c t . + clk: u vào c a xung clock + load: u vào xác nh n Vector d ư c lưu tr ng b trong thanh ghi d ch reg. Khi load tr ng thái cao thì d li u ư c n p vào thanh ghi d ch theo thư t bit MSB là bít g n u ra nh t, và u ra là d(7). M i khi load tr l i “0” thì bit ti p theo ư c xu t hi n t i u ra c a m i sư n dương c a xung ng h . Sau khi t t c 8 bit ư c g i i, u ra tr l i m c th p cho n l n chuy n i ti p theo.

- 127 -

ThiÕt kÕ vi m¹ch b»ng VHDL
Mã thi t k như sau:
LIBRARY ieee; USE ieee.std_logic_1164.all; ------------------------------------------------ENTITY Bo_chuyen_dl_ss_nt IS PORT ( d: IN STD_LOGIC_VECTOR (7 DOWNTO 0); clk, load: IN STD_LOGIC; dout: OUT STD_LOGIC); END Bo_chuyen_dl_ss_nt; ------------------------------------------------ARCHITECTURE Bo_chuyen_dl_ss_nt OF Bo_chuyen_dl_ss_nt IS SIGNAL reg: STD_LOGIC_VECTOR (7 DOWNTO 0); BEGIN PROCESS (clk) BEGIN IF (clk'EVENT AND clk='1') THEN IF (load='1') THEN reg <= d; ELSE reg <= reg(6 DOWNTO 0) & '0'; END IF; END IF; END PROCESS; dout <= reg(7); END Bo_chuyen_dl_ss_nt; -------------------------------------------------

K t qu mô ph ng:

Hình 9.16. K t qu mô ph ng cho b chuy n song song thành n i ti p 9.8. Trò chơi trên led 7 thanh.

Chúng ta thi t k trò chơi v i SSD (seven – segment display). Sơ c a m ch ư c ch ra trong hình 9.17. Nó bao g m 2 u vào là clk và stop, và m t u ra là dout(6:0), u ra này s ư c hi n th trên SSD. Chúng ta ph i m b o r ng fdk = 1khz

- 128 -

ThiÕt kÕ vi m¹ch b»ng VHDL

Hình 9.17. Sơ c a SSD M ch c a chúng ta s t o ra m t s chuy n ng liên t c theo chi u kim ng h c a các o n SSD. ng th i nó còn t o ra s d ch chuy n ch ng l p gi a các thanh k nhau. Chúng ta có th bi u di n quy trình c a nó như sau: a->ab->b->bc->c->cd->d->de->e->ef->f->fa->a.

Hình 9.18.

hình tr ng thái

Quá trình s d ng l i khi có tín hi u Stop, và khi ó m ch s tr l i tr ng thái a và ch cho n khi stop xu ng th p tr l i. H th ng c a chúng ta s gi l i các tr ng thái a, b, c, d , e, f trong kho ng th i gian time1 = 80ms và các tr ng thái ab, bc, cd, de, ef, fa là time2 = 30ms. Mã chương trình c a chúng ta s như sau:
-------------------------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; -------------------------------------------------------ENTITY Trochoiled7thanh IS PORT ( clk, stop: IN BIT; dout: OUT BIT_VECTOR (6 DOWNTO 0)); END Trochoiled7thanh; -------------------------------------------------------ARCHITECTURE arc OF Trochoiled7thanh IS CONSTANT time1: INTEGER := 4; -- Gia tri thuc te hien thi la 80

- 129 -

ThiÕt kÕ vi m¹ch b»ng VHDL
CONSTANT time2: INTEGER := 2; -- Gia tri thuc te hien thi is 30 TYPE states IS (a, ab, b, bc, c, cd, d, de, e, ef, f, fa); SIGNAL present_state, next_state: STATES; SIGNAL count: INTEGER RANGE 0 TO 5; SIGNAL flip: BIT; BEGIN ------- Phan mach day cua arc : -----------PROCESS (clk, stop) BEGIN IF (stop='1') THEN present_state <= a; ELSIF (clk'EVENT AND clk='1') THEN IF ((flip='1' AND count=time1) OR (flip='0' AND count=time2)) THEN count <= 0; present_state <= next_state; ELSE count <= count + 1; END IF; END IF; END PROCESS; ------- Phan mach to hop: -----------PROCESS (present_state) BEGIN CASE present_state IS WHEN a => dout <= "1000000"; -- Decimal 64 flip<='1'; next_state <= ab; WHEN ab => dout <= "1100000"; -- Decimal 96 flip<='0'; next_state <= b; WHEN b => dout <= "0100000"; -- Decimal 32 flip<='1'; next_state <= bc; WHEN bc => dout <= "0110000"; -- Decimal 48 flip<='0'; next_state <= c; WHEN c => dout <= "0010000"; -- Decimal 16 flip<='1'; next_state <= cd; WHEN cd => dout <= "0011000"; -- Decimal 24 flip<='0'; next_state <= d; WHEN d => dout <= "0001000"; -- Decimal 8 flip<='1'; next_state <= de; WHEN de => dout <= "0001100"; -- Decimal 12 flip<='0';

- 130 -

ThiÕt kÕ vi m¹ch b»ng VHDL
next_state <= e; WHEN e => dout <= "0000100"; -- Decimal 4 flip<='1'; next_state <= ef; WHEN ef => dout <= "0000110"; -- Decimal 6 flip<='0'; next_state <= f; WHEN f => dout <= "0000010"; -- Decimal 2 flip<='1'; next_state <= fa; WHEN fa => dout <= "1000010"; -- Decimal 66 flip<='0'; next_state <= a; END CASE; END PROCESS; END arc; --------------------------------------------------------

K t qu mô ph ng:

Hình 9.19. K t qu mô ph ng cho trò chơi trên SSD 9.9. B phát tín hi u.

T m t tín hi u clock, chúng ta mong mu n thu ư c m t tín hi u có dang sóng như trong hình 9.20. V i bài toán lo i này, chúng ta có th s d ng phương pháp FSM ho c phương pháp truy n th ng. C 2 phương pháp u ư c chúng ta trình bày dư i ây: Phương pháp FSM:

Hình 9.20 Hình d ng sóng c n phát

- 131 -

ThiÕt kÕ vi m¹ch b»ng VHDL
Tín hi u c a hình 9.20 có th ư c mô hình như m t FSM 8 tr ng thái. S d ng b m t 0 n 7. Chúng ta có th thi t l p m t sóng b ng ‘0’ khi bi n m = ‘0’ ( xung th nh t) và b ng 1 khi bi n m = ‘1’ (xung th hai),…vv…như trong hình 9.20. th c thi ư c b t o sóng này thì yêu c u 4 flip-flop: trong ó có 3 cái lưu tr s m (3 bit), m t cái lưu tr sóng (1 bit ). thi t k b t o sóng này, chúng ta thi t k theo ki u 2, c th s như sau:
----------------------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; ----------------------------------------------------ENTITY Bo_phat_tin_hieu IS PORT (clk: IN STD_LOGIC; wave: OUT STD_LOGIC); END Bo_phat_tin_hieu; ----------------------------------------------------ARCHITECTURE arc OF Bo_phat_tin_hieu IS TYPE states IS (zero, one, two, three, four, five, seven); SIGNAL present_state, next_state: STATES; SIGNAL temp: STD_LOGIC; BEGIN --- Phan mach day: --PROCESS (clk) BEGIN IF (clk'EVENT AND clk='1') THEN present_state <= next_state; wave <= temp; END IF; END PROCESS; --- Phan mach to hop: --PROCESS (present_state) BEGIN CASE present_state IS WHEN zero => temp<='0'; next_state <= one; WHEN one => temp<='1'; next_state <= two; WHEN two => temp<='0'; next_state <= three; WHEN three => temp<='1'; next_state <= four; WHEN four => temp<='1'; next_state <= five; WHEN five => temp<='1'; next_state <= six; WHEN six => temp<='0'; next_state <= seven; WHEN seven => temp<='0'; next_state <= zero; END CASE; END PROCESS; END arc; -----------------------------------------------------

six,

K t qu mô ph ng:

Hình 9.2.1. K t qu mô ph ng t o sóng

- 132 -

ThiÕt kÕ vi m¹ch b»ng VHDL
Phương pháp truy n th ng: Chúng ta thi t k b phát tín hi u theo phương pháp truy n th ng v i câu l nh IF như sau:
--------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; --------------------------------------ENTITY Bo_phat_tin_hieu2 IS PORT (clk: IN BIT; wave: OUT BIT); END Bo_phat_tin_hieu2; --------------------------------------ARCHITECTURE arc OF Bo_phat_tin_hieu2 IS BEGIN PROCESS VARIABLE count: INTEGER RANGE 0 TO 7; BEGIN WAIT UNTIL (clk'EVENT AND clk='1'); CASE count IS WHEN 0 => wave <= '0'; WHEN 1 => wave <= '1'; WHEN 2 => wave <= '0'; WHEN 3 => wave <= '1'; WHEN 4 => wave <= '1'; WHEN 5 => wave <= '1'; WHEN 6 => wave <= '0'; WHEN 7 => wave <= '0'; END CASE; if count = 7 then count := 0; else count := count + 1; end if ; END PROCESS; END arc; ---------------------------------------

K t qu mô ph ng:

Hình 9.22. K t qu mô ph ng t o sóng theo phương pháp truy n th ng 9.10. Thi t k b nh . Trong + + + o n này, chúng ta s thi t k các m ch b nh sau: ROM RAM v i bus d li u vào ra tách r i. ROM v i bus d li u vào ra hai chi u

- 133 -

ThiÕt kÕ vi m¹ch b»ng VHDL
ROM (Read Only Memory): B nh ch c và ghi: Sơ c a ROM ư c ch ra trong hình 9.23. Vì ROM là b nh ch c, không có tín hi u clock, chân cho phép ghi, nó ch có tín hi u vào bus a ch và tín hi u ra là bus d li u.

Hình 9.23.Sơ Mã thi t k ROM như sau:

c a ROM

--------------------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; --------------------------------------------------ENTITY rom IS GENERIC ( bits: INTEGER := 8; -- # of bits per word words: INTEGER := 8); -- # of words in the memory PORT ( addr: IN INTEGER RANGE 0 TO words-1; data: OUT STD_LOGIC_VECTOR (bits-1 DOWNTO 0)); END rom; --------------------------------------------------ARCHITECTURE rom OF rom IS TYPE vector_array IS ARRAY (0 TO words-1) OF STD_LOGIC_VECTOR (bits-1 DOWNTO 0); CONSTANT memory: vector_array := ( "00000000", "00000010", "00000100", "00001000", "00010000", "00100000", "01000000", "10000000"); BEGIN data <= memory(addr); END rom; ---------------------------------------------------

K t qu mô ph ng:

Hình 9.24. K t qu mô ph ng thi t k ROM RAM v i ư ng bus vào ra riêng bi t: Sơ vào ra riêng bi t ư c th hi n trong hình 9.25
- 134 -

c a RAM v i ư ng bus

ThiÕt kÕ vi m¹ch b»ng VHDL

Hình 9.25. RAM v i ư ng d li u tách r i Như chúng ta th y trên hình, RAM có các bus dư li u vào data_in, bus d li u ra data_out, bus a ch , tín hi u clk và tín hi u cho phép c/ghi. Khi tín hi u cho phép ghi/ c ư c xác nh n là ghi thì t i m i xung lên ti p theo c a clk thì d li u u vào (data_in) ph i ư c lưu tr t i v trí addr, và d li u ra ph i ư c c t a ch addr. Mã thi t k RAM s như sau:
----------------------------------------------------------------------------------------library IEEE; use IEEE.STD_LOGIC_1164.all; --------------------------------------------------ENTITY ram IS GENERIC ( bits: INTEGER := 8; -- # of bits per word words: INTEGER := 16); -- # of words in the -------- memory---------PORT ( wr_ena, clk: IN STD_LOGIC; addr: IN INTEGER RANGE 0 TO words-1; data_in: IN STD_LOGIC_VECTOR (bits-1 DOWNTO 0); data_out: OUT STD_LOGIC_VECTOR (bits-1 DOWNTO 0)); END ram; --------------------------------------------------ARCHITECTURE ram OF ram IS TYPE vector_array IS ARRAY (0 TO words-1) OF STD_LOGIC_VECTOR (bits-1 DOWNTO 0); SIGNAL memory: vector_array; BEGIN PROCESS (clk, wr_ena) BEGIN IF (wr_ena='1') THEN IF (clk'EVENT AND clk='1') THEN memory(addr) <= data_in; END IF; END IF; END PROCESS; data_out <= memory(addr); END ram; ---------------------------------------------------

- 135 -

ThiÕt kÕ vi m¹ch b»ng VHDL
K t qu mô ph ng:

Hình 9.26. K t qu mô ph ng RAM có ương d li u vào ra khác nhau. RAM v i ư ng bus song song: Sơ c a RAM v i ư ng bus song song ư c th hi n trong hình 9.27. D li u ư c ghi vào RAM hay ư c c t RAM th c hi n trên cùng 1 ư ng bus.

Hình 9.27. RAM v i ư ng d li u chung Mã thi t k s như sau:
------------------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; ------------------------------------------------ENTITY ramc IS GENERIC ( bits: INTEGER := 8; -- # of bits per word words: INTEGER := 16); -- # of words in the -- memory PORT ( clk, wr_ena: IN STD_LOGIC; addr: IN INTEGER RANGE 0 TO words-1; bidir: INOUT STD_LOGIC_VECTOR (bits-1 DOWNTO 0)); END ramc; ------------------------------------------------ARCHITECTURE arc OF ramc IS TYPE vector_array IS ARRAY (0 TO words-1) OF STD_LOGIC_VECTOR (bits-1 DOWNTO 0);

- 136 -

ThiÕt kÕ vi m¹ch b»ng VHDL
SIGNAL memory: vector_array; BEGIN PROCESS (clk, wr_ena) BEGIN IF (wr_ena='0') THEN bidir <= memory(addr); ELSE bidir <= (OTHERS => 'Z'); IF (clk'EVENT AND clk='1') THEN memory(addr) <= bidir; END IF; END IF; END PROCESS; END arc; -------------------------------------------------

- 137 -

ThiÕt kÕ vi m¹ch b»ng VHDL

Tài li u tham kh o: - Circuit design with VHDL , Voilnei A.Pedroni - VHDL language. - The vhdl – cookbook , Peter J.Ashedo - Thi t k m ch b ng máy tính, Nguy n Linh Giang …..

- 138 -

You're Reading a Free Preview

Tải về
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->