NỘI DUNG THIẾT KẾ MÔ HÌNH THỰC HÀNH VI MẠCH SỐ LẬP TRÌNH Chương 1 – TỔNG QUAN VỀ PHƯƠNG PHÁP THIẾT KẾ VI MẠCH SỬ DỤNG NGÔN NGỮ MÔ TẢ PHẦN CỨNG (HDL ) Chương 2 – TÌM HIỂU VỀ NGÔN NGỮ MÔ TẢ PHẦN CỨNG VHDL Chương 3 – TÌM HIỂU TỔNG QUAN VỀ FPGA Chương 4 – THIẾT KẾ MÔ HÌNH THỰC HÀNH VI MẠCH SỐ LẬP TRÌNH FPGA
Trang 1BỘ CÔNG THƯƠNG
TRƯỜNG ĐHCN HÀ NỘI
Cộng Hòa xã hội chủ nghĩa việt nam Độc lập – tự do – hạnh phúc -o0o -
BÁO CÁO THỰC TẬP TỐT NGHIỆP
Sinh viên : PHẠM SỸ LỢI……… Lớp :CĐ – ĐT5-K13….………
Khoa, Trung tâm: ĐIỆN TỬ……… Giáo viên hướng dẫn : ĐÀO THỊ PHƯƠNG MAI… ………
NỘI DUNG
THIẾT KẾ MÔ HÌNH THỰC HÀNH VI MẠCH SỐ LẬP TRÌNH
Chương 1 – TỔNG QUAN VỀ PHƯƠNG PHÁP THIẾT KẾ VI MẠCH
SỬ DỤNG NGÔN NGỮ MÔ TẢ PHẦN CỨNG (HDL )
Chương 2 – TÌM HIỂU VỀ NGÔN NGỮ MÔ TẢ PHẦN CỨNG VHDL
Chương 3 – TÌM HIỂU TỔNG QUAN VỀ FPGA
Chương 4 – THIẾT KẾ MÔ HÌNH THỰC HÀNH VI MẠCH SỐ LẬP TRÌNH FPGA
Ngày giao đề tài : …10/02/2014… Ngày hoàn thành :…29/03/2014……….…………
LỜI NÓI ĐẦU
Thiết kế vi mạch số lập trình là môn học kế tiếp của chương trình Điện tử số Nộidung chính của chương trình môn học tập trung vào hai vấn đề kiến thức chính Thứ
Trang 2nhất là bài toán thiết kế về mặt chức năng cho các khối số có mật độ tích hợp lớn cỡLSI, VLSI và lớn hơn Vấn đề thứ hai là giới thiệu căn bản về các công nghệ giúp hiệnthực hóa thiết kế chức năng thành sản phẩm ứng dụng, trong đó tập trung chính vàocông nghệ FPGA, một nền tảng công nghệ mới đã và đang phát triển rất mạnh hiệnnay Khác với bài toán tổng hợp và phân tích trong Điện tử số chủ yếu là bài toán chocác mạch cỡ SSI, MSI, các bài toán ở đây có hướng tới các ứng dụng cụ thể thực tiễnvới quy mô lớn hơn và buộc phải sử dụng các công cụ trợ giúp thiết kế trên máy tính
và ngôn ngữ thiết kế VHDL Chương trình Thiết kế logic số nhắm vào trang bị kiếnthức cơ sở ngành cho tất cả các đối tượng sinh viên thuộc chuyên ngành kỹ thuật Điện
tử viễn thông, Điều khiển tự động Trước khi học môn này các sinh viên này phải họcqua các môn cơ sở ngành gồm Cấu kiện điện tử, Điện tử số, Kỹ thuật Vi xử lý trong
đó hai môn đầu là bắt buộc Thiết kế logic số là một môn học mang tính thực hành caonên trong cấu trúc chương trình sẽ dành nhiều thời gian hơn cho thực hành thí nghiệmcũng như bắt buộc sinh viên khi kết thúc môn học phải thực hiện các đồ án bài tậpthiết kế cỡ vừa và lớn theo nhóm dưới dạng Bài tập lớn hoặc Đồ án môn học Kiếnthức và kỹ năng của sinh viên sẽ giúp ích rất lớn cho các bài toán chuyên ngành và Đồ
án tốt nghiệp sau này bởi trong các ứng dụng xử lý số đang dần chiếm vai trò quantrọng trong các hệ thống kỹ thuật Bên cạnh những công cụ truyền thống là Vi xử lý,máy tính thì thiết kế phần cứng trên FPGA hoặc trên nền các công nghệ tương tự đang
là một hướng phát triển mang lại hiệu năng vượt trội và khả năng ứng dụng thích nghitốt hơn
Trong quá trình thực hiện đề tài em đã cố gắng rất nhiều ,song do kiến thức còn hạn chế nên không thể tránh khỏi những thiếu sót Em rất mong nhận được những ý kiến đóng góp, phê bình , hướng dẫn của các Thầy Cô , bạn bè … để đề tài được hoàn thiện hơn
Em xin chân thành cám ơn sự ủng hộ nhiệt tình của lãnh đạo Khoa điện tử,giáo viênhướng dẫn cô Đào Thị Phương Mai đã giúp đỡ em thực hiện được bài thực tập tốtnghiệp này
Hà Nội, ngày…… tháng…….năm 2011
Sinh viên thực hiện
Trang 3Chương 1 : Tổng quan về phương pháp thiết kế vi mạch sử dụng ngôn ngữ
mô tả phần cứng ( VHDL)
Chương mở đầu có nhiệm vụ cung cấp cho người học những kiến thức, khái niệm cơbản về thiết kế các khối số, trong đó có những kiến thức được nhắc lại với những bổxung phù hợp với mục đích môn học Người học được giới thiệu qua về cách thứcthiết khối làm việc với tín hiệu số được thiết kế chế tạo, phân loại các dạng vi mạch số
và các tham số cơ bản cần quan tâm khi thiết kế hay làm việc với vi mạch số Chươngnày cũng giới thiệu qua về sự phát triển của một lớp các IC khả trình phần cứng từPROM cho tới FPGA Mục đích của phần này giúp cho người học có một cái nhìntổng quan về lịch sử của thiết kế logic số trước khi tập trung vào các vấn đề kiến thứcchính ở các chương sau là ngôn ngữ mô tả phần cứng VHDL và công nghệ FPGA
I Các khái niệm chung
1.1 Transitor
Là linh kiện bán dẫn có khả năng làm việc như một công tắc bật tắt hoặc dùng đểkhuếch đại tín hiệu Transitor là phần tử cơ bản của mọi vi mạch số tích hợp, từ cáccổng logic đơn giản AND, OR, NOT đến các loại phức tạp như các mạch điều khiểnngoại vi, vi điều khiển, vi xử lý… Transitor được làm từ vật liệu bán dẫn(sermiconductor), là vật liệu vừa có khả năng dẫn điện vừa có khả năng làm việc nhưnhững vật liệu cách điện, khả năng này thay đổi tùy theo kích thích từ bên ngoài nhưnhiệt độ, ánh sáng, trường điện từ, dòng điện… Chất bán dẫn dùng để cấu tạo transitorthường là Germany (Ge) hoặc Silicon (Si) được kích tạp một lượng nhỏ Photpho(P)hoặc Boron (B) với mục đích tăng mật độ electron (kiểu N) tự do hoặc tăng mật độ lỗtrống (kiểu P) tương ứng trong tinh thể bán dẫn Cấu trúc nguyên lý của các dạngtransitor được trình bày ở hình dưới đây:
Hình 1-1 Cấu trúc transitor lưỡng cực BJTS, đơn cực FETs, diode Transitor lưỡngcực BJT (Bipolar Junction Transitor) sử dụng nhiều trong thập kỷ 80s, đặc điểm củaBJT là tốc độ chuyển mạch nhanh nhưng nhược điểm là mức tiêu thụ năng lượng lớnngay cả trong trạng thái nghỉ và chiếm nhiều diện tích Sau đó BJTs dần được thay thế
Trang 4bằng transitor đơn cực FETs(Field Effect Transitors) làm việc trên hiệu ứng trường vàkênh dẫn chỉ dùng một loại bán dẫn loại p hoặc n MOSFETs (Metal-oxide-sermiconductor Field-Effect-Transitors) là transitor FETs nhưng dùng cực Cổng metal(về sau lớp metal được thay bằng polysilicon) phủ trên một lớp oxide cách điện và lớpnày phủ trên vật liệu bán dẫn, tùy theo loại vật liệu bán dẫn mà transitor này có tên gọi
là NMOS (kênh dẫn n) và PMOS (kênh dẫn p) CMOS (Complementary-SymmetryMetal-Oxide Sermiconductor) là transitor tạo thành từ việc ghép cặp bù PMOS vàNMOS, có nhiều ưu điểm so với các dòng transitor cũ như hiệu điện thế làm việcthấp, độ chống nhiễu cao, tiêu tốn ít năng lượng và cho phép tích hợp trong IC số vớimật độ cao CMOS là công nghệ transitor được sử dụng rộng rãi nhất hiện nay
1.2 Vi mạch số
Vi mạch số tích hợp Còn được gọi là IC – Intergrated Circuits, chip, là cấu trúc mạchđiện được thu nhỏ bằng cách tích hợp chủ yếu từ các transitor với mật độ cao, ngoài racòn có thể có các linh kiện điện thụ động khác trên một khối bán dẫn mỏng Các vimạch tích hợp đều có một số lượng tín hiệu đầu vào và đầu ra để thực hiện một chứcnăng cụ thể nào đó Trong khuôn khổ giáo trình này chủ yếu nghiên cứu về vi IC số,tức là dạng IC chỉ làm việc với các tín hiệu số
diện tích của khối tinh thể bán dẫn Theo mật độ tích hợp chia ra các loại vi mạch sau:
- Vi mạch cỡ nhỏ SSI (Small scale integration), có hàng chục transitor trong một vimạch - Vi mạch cỡ vừa MSI (Medium scale integration), có hàng trăm transitor trongmột vi mạch - Vi mạch cỡ lớn LSI (Large scale integration), có hàng ngàn đến hàngchục ngàn transitor trong một vi mạch - Vi mạch cực lớn VLSI (Very large scaleintegration), có hàng vạn, hàng triệu, hàng chục triệu transitor và lớn hơn trong một vi
Trang 5mạch, tới thời điểm hiện nay đã xuất hiện nhưng vi mạch có độ tích hợp đến hàng tỷtransitor - Vi mạch siêu lớn ULSI (Ultra large scale intergration), vi mạch có độ tíchhợp với mức độ hàng triệu transitor trở lên - WSI (Wafer-scale-Intergration) là giảipháp tích hợp nhiều vi mạch chức năng trên một tấm silicon (wafer) để tăng hiệu suấtcũng như giảm giá thành sản phẩm, ví dụ hệ vi xử lý nhiều nhân được tích hợp bằngWSI - SoC (System-on-a-Chip) Khái niệm chỉ một hệ tính toán, xử lý mà tất cả cáckhối chức năng số và cả tương tự được thiết kế để tích hợp vào trong một chip đơn.Trong khuôn khổ chương trình này sẽ dành thời lượng chính cho việc nghiên cứu cơbản về công nghệ, phương pháp, quá trình thiết kế các vi mạch cỡ LSI, VLSI
1.3 Cổng logic
Cổng logic hay logic gate là cấu trúc mạch điện (sơ đồ khối hình ) được lắp ráp từcác linh kiện điện tử để thực hiện chức năng của các hàm logic cơ bản y = f(xn, xn-1, , x1, x0) Trong đó các tín hiệu vào xn-1, xn-2, , x1, x0 của mạch tương ứng vớicác biến logic xn-1, xn-2, , x1, x0 của hàm Tín hiệu ra y của mạch tương ứng vớihàm logic y Với các cổng cơ bản thường giá trị n ≤ 4
Giá trị của các tín hiệu vào và ra chỉ có hai mức là mức thấp (Low - L) và mức cao(High - H) tương ứng với với hai giá trị 0 và 1 của các biến logic và hàm logic Ví dụ:Một cổng NOT loại CMOS (hình 1.4) tương ứng hàm NOT hai biến Q = not A
1.4 Mạch điện cổng NOT
Trên sơ đồ dễ nhận thấy rằng, chỉ khi A có mức tích cực cao thì transitor trên đóngcòn transitor dưới mở, Q có mức tích cực thấp, khi A có mức tích cực thấp thìtransitor trên mở và dưới đóng nên Q có mực tích cực cao, như vậy mạch điện với sơ
đồ trên thực hiên vai trò của cổng NOT Các mạch logic đều được biểu diễn bằng các
hệ hàm logic và do đó có thể phát biểu là: Mọi mạch logic đều có thể xây dựng từ cáccổng logic cơ bản Đối với các cổng logic cơ bản đó thì có hai tham số thời gian cơbản:
Trang 6-Tham số thời gian của cổng NOT Thời gian trễ lan truyền Tpd (Propagation delay) làthời gian tối thiểu kể từ thời điểm bắt đầu xảy ra sự thay đổi từ đầu vào X cho tới khi
sự thay đổi này tạo ra ra thay đổi xác định tại đầu ra Y, hay nói một cách khác cho tớikhi đầu ra Y ổn định giá trị
-Tcd (Contamination delay) là khoảng thời gian kể từ thời điểm xuất hiện sự thay đổicủa đầu vào X cho tới khi đầu ra Y bắt đầu xảy ra sự mất ổn định Sau giai đoạn mất
ổn định hay còn gọi là giai đoạn chuyển tiếp tín hiệu tại đầu ra sẽ thiết lập trạng tháixác định vững bền Như vậy Tpd > Tcd và khi nhắc đến độ trễ của cổng thì là chỉ tớigiá trị Tpd 1.4 Phần tử nhớ
1.4.1 D-Latch
và D flip-flop Latch và Flip-Flop là các phần tử nhớ quan trọng trong thiết kế VLSI,
sơ đồ cấu tạo chi tiết và mô tả đã được trình bày kỹ trong phần Kỹ thuật số Ở phầnnày chỉ nhắc lại những tính chất cơ bản nhất của các Flip-Flop và bổ xung thêm cáctham số thời gian thực của các phần tử này
Bảng 1-1 D-Flip flop và D-latch D-flip flop D-latch
D-Latch là phần tử nhớ làm việc theo mức xung, cụ thể khi tín hiệu Clock bằng 1 thìgiá trị Q đầu ra bằng giá trị đầu vào, khi tín hiệu Clock = 0 thì giá trị đầu ra không đổi.Nói một cách khác D-latch làm việc như một cửa đóng mở giữa tín hiệu Q và D tươngứng với mức điện áp của xung Clock D-flip-flop là phần tử nhớ làm việc theo sườnxung, có hai dạng sườn là sườn lên (rising edge) khi xung thay đổi từ 0->1 và sườnxuống (falling edge) khi xung thay đổi từ 1->0 Khi không có yêu cầu gì đặc biệt thìFlip-flop làm việc với sườn xung lên thường được sử dụng Khác với D-latch giá trị
Trang 7đầu ra của Flip- Flop chỉ thay vào thời điểm sườn xung Với cách làm việc như vậygiá trị đầu ra sẽ không thay đổi trong suốt thời gian một chu kỳ xung nhịp dù cho tínhiệu đầu vào thay đổi D Flip-flop rất hay được dùng trong mạch có nhớ vì vậy đôi khinói đến phần tử nhớ thường ngầm hiểu là D Flip-flop
Hình 1-6 Đồ thị thời gian của D Flip-flop và D Latch Đối với D-flip-flop và D-latchnhớ thì có hai tham số thời gian hết sức quan trọng là Tsetup, và Thold Đây là tham
số thời gian đối với dữ liệu đầu vào cổng Din để đảm bảo việc truyền dữ liệu sangcổng ra Qout là chính xác, cụ thể đối với Flip-flop Tsetup: là khoảng thời gian cầnthiết cần giữ ổn định đầu vào trước sườn tích cực của xung nhịp Clock Thold: Làkhoảng thời gian tối thiểu cần giữ ổn định dữ liệu đầu vào sau sườn tích cực của xungnhịp Clock
Hình 1-7 Tham số thời gian của D-Flip-Flop
1.4.2 Các flip-flop khác - RS Flip-flop:
Trang 8Bảng 1-2
RS Flip-flop có đầu vào là hai tín hiệu Reset và Set Set =1 thì tín hiệu đầu ra nhận giátrị 1 không phụ giá trị hiện tại Q, Reset =1 thì đầu ra Q = 0 không phụ thuộc giá trịhiện tại Q Đối với RS-flipflop không đồng bộ thì giá trị Q thay đổi phụ thuộc R/Sngay tức thì, còn đối với RS flip-flop đồng bộ thì tín hiệu Q chỉ thay đổi tại thời điểmsườn xung Clock Trạng thái khi R= 1, S= 1 là trạng thái cấm vì khí đó đầu ra nhậngiá trị không xác định, thực chất sẽ xảy ra sự thay quá trình ―chạy đua‖ hay tự daođộng giá trị Q từ 0 đến 1 và ngược lại với chu kỳ bằng độ trễ chuyển mạch của flip-flop - JK-flip-flop
Bảng 1-3
0 0 Qprev 0 1 0 1 0 1 1 1 NOT Qprev Theo bảng chân lý JK-flip flip hoạt động khálinh hoạt thực hiện chức năng giống như D-flip flop hoặc RS flip-flop, trạng thái khíJ=0, K=1 là Reset, J=1, K=0 là Set Tuy không có đầu vào dữ liệu D nhưng để JK flip-flop làm việc như một D-flip flip thì tín hiệu D nối với J còn K cho nhận giá trị đốicủa J - T- flip-flop
Bảng 1-4 T Flip-flop T Q Qnext 0 0 0 0 1 1 1 0 1 1 1 0
Trang 9Khi T bằng 1 thì giá trị Qnextbằng đảo của giá trị trước Qprev khi T = 0 thì giá trị đầu
ra không thay đổi
1.5 Mạch logic tổ hợp
Mạch logic tổ hợp (Combinational logic circuit) là mạch mà giá trị tổ hợp tín hiệu ratại một thời điểm chỉ phụ thuộc vào giá trị tổ hợp tín hiệu vào tại thời điểm đó Hiểumột cách khác mạch tổ hợp không có trạng thái, không chứa các phần tử nhớ mà chỉchứa các phần tử thực hiện logic chức năng như AND, OR, NOT … Đối với mạch tổhợp tham số thời gian trễ Tdelay là khoảng thời gian lớn nhất kể từ thời điểm xácđịnh tất cả các giá trị đầu vào cho tới thời điểm tất cả các kết quả ở đầu ra trở nên ổnđịnh Trên thực tế với vi mạch tích hợp việc thời gian trễ rất nhỏ nên việc tìm tham số
độ trễ của mạch được thực hiện bằng cách liệt kê tất cả các đường biến đổi tín hiệu cóthể từ tất cả các đầu vào tới tất cả đầu ra sau đó dựa trên thông số về thời gian của cáccổng và độ trễ đường truyền có thể tính được độ trễ của các đường truyền này và tìm
ra đường truyền có độ trễ lớn nhất, giá trị đó chính là Tdelay
Hình 1-8 Độ trễ của mạch tổ hợp Minh họa cho độ trễ trong mạch tổ hợp như ở hình1-8 Về lý thuyết để xác định độ trễ của mạch cần liệt kê tất cả các đường tín hiệu từ 4đầu vào In1, In2, In3, In4 đến 2 đầu ra Out1, Out2 Đối với mỗi cặp đầu ra đầu vàotồn tại nhiều đường truyền khác nhau vì vậy tổng số lượng các đường truyền nàythường rất lớn Chính vì thế đối với những mạch tổ hợp lớn thì việc xác định độ trễđều phải thực hiện bằng sự hỗ trợ của máy tính Ví dụ để xác định độ trễ của haiđường truyền 1 và 2 trên hình vẽ: đường 1 lần lượt đi qua các cổng NOT, AND_4,NOR, AND_3, OR Đường 2 lần lượt đi qua cổng NOT, AND, OR_4, AND_4, OR_4
Độ trễ của các đường truyền này tính bằng độ trễ của các cổng nó đi qua cộng với độtrễ dây dẫn (TWrite)
T1 = TNOT + TAND_4 + TNOR + TAND_3 + T AND_3 + TWire1 (1.1) T2 =TNOT + TAND + TOR_4 + TAND_4 + T OR_4 + TWire2 (1.2) Do độ trễcủa cổng nhiều đầu vào lớn hơn độ trễ của cổng ít đầu vào nên mặc dù số cổng đi quatrên đường truyền như nhau nhưng đường truyền 2 sẽ có độ trễ lớn hơn đường 1 Cácđường truyền có độ trễ lớn nhất được gọi là Critical paths Các đường truyền này cầnđặc biệt quan tâm trong quá trình tối ưu hóa độ trễ của mạch
Trang 101.6 Mạch logic tuần tự
Mạch logic dãy (Sequential logic circuits) còn được gọi là mạch logic tuần tự là mạch
số mà tín hiệu ra tại một thời điểm không những phụ thuộc vào tổ hợp tín hiệu đầuvào tại thời điểm đó mà còn phụ thuộc vào tín hiệu vào tại các thời điểm trước đó.Hiểu một cách khác mạch dãy ngoài các phần tử tổ hợp có chứa các phần tử nhớ và nólưu trữ lớn hơn một trạng thái của mạch Tham số thời gian của mạch tuần tự đượctính khác với mạch tổ hợp, sự khác biệt đó có quan hệ mật thiết với đặc điểm của tínhiệu đồng bộ Clock Ví dụ với một mạch tuần tự điển hình dưới đây Mạch tạo từ hailớp thanh ghi sử dụng Flip-flop A và B, trước giữa và sau thanh ghi là ba khối logic tổhợp Combinational logic 1, 2, 3, các tham số thời gian cụ thể như sau: Td1, Td2, Td3
Là thời gian trễ tương ứng của 3 khối mạch tổ hợp 1, 2, 3 Tsa, Tsb là thời gian thiếtlập (Tsetup) của hai Flipflop A, B tương ứng Tclk-q là khoảng thời gian cần thiết để
dữ liệu tại đầu ra Q xác định sau thời điểm kích hoạt của sườn Clock
Hình 1-9 Tham số thời gian của mạch tuần tự Đối với mạch đồng bộ thì sẽ là lý tưởngnếu như điểm kích hoạt (sườn lên hoặc sườn xuống) của xung nhịp Clock tới các Flip-flop cùng một thời điểm Tuy vậy trên thực tế bao giờ cũng tồn tại độ trễ giữa haixung Clock đến hai Flip-flop khác nhau Tskew là độ trễ lớn nhất của xung nhịp Clockđến hai Flip-flop khác nhau trong mạch Thời gian chênh lệch lớn nhất giữa tín hiệuxung nhịp , thời gian trễ này sinh ra do độ trễ trên đường truyền của xung Clock từ Ađến B Trên thực tế Tskew giữa hai Flip-flop liên tiếp có giá trị rất bé so với các giá trị
độ trễ khác và có thể bỏ qua, nhưng đối với những mạch cỡ lớn khi số lượng Flip-flopnhiều hơn và phân bố xa nhau thì giá trị Tskew có giá trị tương đối lớn Những tham
số trên cho phép tính toán các đặc trưng thời gian của mạch tuần tự đó là: - Thời giantrễ trước xung nhịp Clock tại đầu vào Tinput_delay = Td1 + Tsa(1.3) - Thời gian trễ sau xung nhịp Clock tại đầu ra Toutput_delay = Td3 + Tclk_q(1.4) - Chu kỳ tối thiểu của xung nhịp Clock, hay là khoảng thời gian tối thiểu đảmbảo cho dữ liệu trong mạch được xử lý và truyền tải giữa hai lớp thanh ghi lien tiếp
mà không xảy ra sai sót Nếu xung nhịp đầu vào có chu kỳ nhỏ hơn Tclk_min thìmạch sẽ không thể hoạt động theo thiết kế Tclk_min = Tclk-q + Td2 + Tsb + Tskew(1.5) - Từ đó tính được xung nhịp tối đa của vi mạch là Fmax = 1/ Tclk_min =1/( Tclk-q + Td2 + Tsb + Tskew)
1.7 Các phương pháp thể hiện thiết kế
Trang 11Có hai phương pháp cơ bản được sử dụng để mô tả vi mạch số là mô tả bằng sơ đồlogic (schematic) và mô tả bằng ngôn ngữ mô tả phần cứng HDL (HardwareDescription Language) Mô tả bằng sơ đồ: vi mạch được mô tả trực quan bằng cáchghép nối các phần tử logic khác nhau một cách trực tiếp giống như ví dụ ở hình vẽdưới đây Thông thường các phần tử không đơn thuần là các đối tượng đồ họa mà còn
có các đặc tính vật lý gồm chức năng logic, thông số tải vào ra, thời gian trễ… Nhữngthông tin này được lưu trữ trong thư viện logic thiết kế Mạch vẽ ra có thể được môphỏng để kiểm tra chức năng và phát hiện và sửa lỗi một cách trực tiếp
Hình 1-10 Mô tả mạch số bằng sơ đồ Ưu điểm của phương pháp này là cho ra sơ đồcác khối logic rõ ràng thuận tiện cho việc phân tích mạch, tuy vậy phương pháp nàychỉ được sử dụng để thiết kế những mạch cỡ nhỏ, độ phức tạp không cao Đối vớinhững mạch cỡ lớn hàng trăm ngàn cổng logic thì việc mô tả đồ họa là gần như khôngthể và nếu có thể cũng tốn rất nhiều thời gian, chưa kể những khó khăn trong côngviệc kiểm tra lỗi trên mạch sau đó Mô tả bằng HDL: HDL cho phép mô tả vi mạchbằng các cú pháp tương tự như cú pháp của ngôn ngữ lập trình Có ba ngôn ngữ mô tảphần cứng phổ biến hiện nay là: Verilog: Ra đời năm 1983, do hai kỹ sư Phil Moorby
và Prabhu Goel làm việc tại Automated Integrated Design Systems (sau này thuộc sởhữu của Cadence) Verilog được IEEE chính thức tiêu chuẩn hóa vào năm 1995 và sau
Trang 12đó là các phiên bản năm 2001, 2005 Đây là một ngôn ngữ mô tả phần cứng có cấutrúc và cú pháp gần giống với ngôn ngữ lập trình C, ngoài khả năng hỗ trợ thiết kếlogic thì Verilog rất mạnh trong việc hỗ trợ cho quá trình kiểm tra thiết kế VHDL:VHDL viết tắt của Very-high-speed intergrated circuits Hardware Description Language, hay ngôn ngữ mô tả cho các mạch tích hợp tốc độ cao VHDL lần đầu tiênđược phát triển bởi Bộ Quốc Phòng Mỹ nhằm hỗ trợ cho việc thiết kế những vi mạchtích hợp chuyên dụng (ASICs) VHDL cũng được IEEE chuẩn hóa vào các năm 1987,
1991, 2002, và 2006 và mới nhâts 2009 VHDL được phát triển dựa trên cấu trúc củangôn ngữ lập trình Ada Cấu trúc của mô tả VHDL tuy phức tạp hơn Verilog nhưngmang tính logic chặt chẽ và gần với phần cứng hơn AHDL: Altera HDL được pháttriển bởi công ty bán dẫn Altera với mục đích dùng thiết kế cho các sản phẩm FPGA
và CPLD của Altera AHDL có cấu trúc hết sức chặt chẽ và là ngôn ngữ rất khó sửdụng nhất so với 2 ngôn ngữ trên Bù lại AHDL cho phép mô tả thực thể logic chi tiết
và chính xác hơn Ngôn ngữ này ít phổ biến tuy vậy nó cũng được rất nhiều chươngtrình phần mềm hỗ trợ mô phỏng biên dịch Bên cạnh các ngôn ngữ trên thì một loạtcác ngôn ngữ khác đã và đang phát triển cũng hỗ trợ khả năng mô tả phần cứng, đángchú ý là System Verilog là phiên bản mở rộng của Verilog hướng của C++ như hỗ trợcác kiểu dữ liệu khác nhau, sử dụng Class và nhiều hàm hệ thống bậc cao SystemCkhông hoàn toàn phải là một HDL mà là một dạng mở rộng của C++ cho phép hỗ trợkiểm tra các thiết kế bằng VHDL hay Verilog
2 Yêu cầu đối với một thiết kế logic
Yêu cầu đối với một thiết kế IC bao gồm: Yêu cầu chức năng: mạch gồm có các đầuvào đầu ra như thế nào, thực hiện nhiệm vụ gì… Yêu cầu về mặt công nghệ: Mạchthiết kế sử dụng nền công nghệ bán dẫn nào PLD, ASIC, FPGA… Yêu cầu về mặt tàinguyên: Giới hạn về số lượng cổng, số lượng transitors, về diện tích quy đổi chuẩn, vềkích thước của IC thiết kế Yêu cầu về khả năng làm việc (performance): là yêu cầu vềcác tham số thời gian của mạch bao gồm độ trễ cổng vào, độ trễ cổng ra, độ trễ logicvới mạch tổ hợp, các xung nhịp làm việc, số lượng xung nhịp cho một chu trình xử lý
dữ liệu, số lượng dữ liệu xử lý trên một đơn vị thời gian
3 Yêu cầu về mức tiêu hao năng lượng (power consumtion)
Yêu cầu về chi phí cho quá trình thiết kế và chế tạo (design cost) Các yêu cầu kể trên
có quan hệ mật thiết với nhau và thông thường chúng không thể đồng thời đạt được tối
ưu Ví dụ năng lượng tiêu thụ của mạch muốn nhỏ thì số lượng cổng sử dụng hạn chế
và sẽ hạn chế tốc độ làm việc, hoặc việc sử dụng các công nghệ rẻ tiền hơn hoặc dùngcác cổng công xuất thấp cũng là nhân tố giảm hiệu năng làm việc của mạch Trongthực tế Các IC phục vụ các mục đích khác nhau thì có yêu cầu khác nhau và người lập
kế hoạch thiết kế chế tạo IC cần phải cân đối giữa các tiêu chí để có một phương ántối ưu nhất Ví dụ cùng là vi xử lý nhưng nếu dùng thì không có yêu cầu đặc biệt vềmặt tiêu hao năng lượng do nguồn cấp là cố định, khi đó Chip phải được thiết kế để cóhiệu suất làm việc tối đa Trong khi vi xử lý cho máy tính xách tay thì cần phải thiết
kế để có mức tiêu thụ năng lượng thấp nhất có thể hoặc để có thể hoạt động ở nhiềumức tiêu thụ năng lượng khác nhau nhằm kéo dài thời gian sử dụng Chip điều khiểncho các thiết bị di động thì cần phải tối ưu hết mức mức tiêu tốn năng lượng bằng cáchthu gọn thiết kế, giảm thiểu những tập lệnh không cần thiết và sử dụng các phần tử tiếtkiệm năng lượng nhất
Trang 13Hình 1-11 Phân loại thiết kế vi mạch số Design Automation Máy tính là một sảnphẩm đặc trưng nhất của nền công nghiệp sản xuất chế tạo bán dẫn nhưng ngay saukhi ra đời đã trở thành công cụ đắc lực cho việc thiết kế mô phỏng IC nói riêng và cácthiết bị khác nói chung Tự động hóa thiết kế không những giúp đơn giản hóa và rútngắn đáng kể thời gian thiết kế sản phẩm mà còn đem lại những khả năng mà quátrình thiết kế thủ công bởi con người không làm được đó là: Khả năng làm việc vớinhững thiết kế phức tạp tới cỡ hàng nghìn đến hàng tỷ transitor Khả năng xử lý nhữngbài toán tối ưu với nhiều tiêu chí và nhiều điều kiện ràng buộc phức tạp Khả năng tựđộng tổng hợp thiết kế từ các mức trừu tượng cao xuống các mức trừu tượng thấp hơnmột cách chính xác, nhanh chóng Đơn giản hóa việc lưu trữ và trao đổi dữ liệu thiết
kế Các phần mềm hỗ trợ thiết kế gọi chung là CAD Tools, trong lĩnh vực thiết kếASIC có 3 hệ thống phần mềm phổ biến của Cadence®, Synopsys®, Magma® DesignAutomation Inc Trong thiết kế trên FPGA phổ biến có Xilinx, Altera
Trong tự động hóa thiết kế IC thường phân biệt thành những quy trình như
sau:
Full-custom ASIC: là quy trình thiết kế IC có mức độ chi tiết cao nhất nhằm thu đượcsản phẩm có hiệu quả làm việc cao nhất trong khi vẫn đạt tối ưu về mặt tài nguyêntrên nền một công nghệ bán dẫn nhất định Để đạt được mục đích đó thiết kế khôngnhững được tối ưu ở những mức cao mà còn được tối ưu ở mức độ bố trí transitor vàkết nối giữa chúng, ví dụng hai khối logic cùng thực hiện hàm OR nhưng phân bố ởhai vị trí khác nhau thì được cấu trúc bằng các mạch transitor khác nhau, phụ thuộcvào các thông số khác như tải đầu vào đầu ra, vị trí, ảnh hưởng các khối liền kề…Chính vì thế Full-custom ASIC đôi khi còn được gọi là random-logic gate networksnghĩa là mạch tạo bởi những cổng không đồng nhất Semi-custom ASIC design: Phân
Trang 14biệt với Full-custom ASIC design, khái niệm này chỉ quy trình thiết kế mà mức độchi tiết không đạt đến tối đa, thông thường thiết kế đạt chi tiết đến mức cổng logichoặc cao hơn Do Full-custom ASIC có độ phức tạp cao nên không những chi phí choquá trình thiết kế rất lớn mặt khác thời gian dành cho thiết kế có thể kéo dài hàng vàinăm trở lên, trong thời gian đó có thể đã có những công nghệ mới ra đời, mỗi mộtthay đổi nhỏ kéo theo việc phải làm lại gần như toàn bộ thiết kế và phát sinh thêm chiphí rất nhiều do vậy lợi nhuận sản phẩm bán ra thấp hay thậm chí thua lỗ Semi-custom ASIC cân bằng giữa chi phí thiết kế và lợi nhuận thu được sản phẩm bằngcách đẩy nhanh và giảm thiểu chi phí cho quá trình thiết kế, dĩ nhiên bù lại sản phẩmlàm ra không đạt được mức tối ưu lý thuyết như Full-custom design Có nhiều dạngSemi-custom design nhưng một trong những kiểu cơ bản mà thường được sử dụng làthiết kế trên cơ sở thư viện cổng chuẩn (Standard Cell Library), thư viện này là tậphợp của các cổng logic như AND, OR, XOR, thanh ghi… và vì chúng có cùng kíchthước chiều cao nên được gọi là cổng chuẩn ASIC based on Programmable Device:Thiết kế ASIC trên cơ sở IC khả trình Chíp khả trình (Programmable device) đượchiểu là IC chứa những phần tử logic có thể được lập trình can thiệp để tái cấu trúcnhằm thực hiện một chức năng nào đó Quá trình tái cấu trúc thực hiện thông quangôn ngữ mô tả phần cứng nên thường được gọi ngắn gọn là lập trình IC khả trìnhđược chia thành các dạng sau: SPLD (Simple Programmable Logic Device) Nhómnhững IC khả trình PROM, PAL, PLA, GAL Đặc điểm chung của nhóm này là chứamột số lượng cổng tương đương từ vài chục (PROM) đến vài trăm (PAL, GAL) cổng,nhóm này sử dụng cấu trúc của bộ nhớ ROM để lưu cấu hình IC, (vì vậy nhóm nàycòn gọi là Memory-based PLD), cấu trúc này bao gồm một mảng ma trận AND vàmột mảng ma trận OR có thể cấu trúc được Trong các chip dạng này lại chia làm hai,thứ nhất là loại chỉ lập trình một lần, và loại có khả năng tái lập trình dùng các côngnghệ như EEPROM hay EPROM Cấu trúc cụ thể và nguyên lý làm việc của PROM,PAL, PLA, GAL, FPGA, CPLD sẽ được lần lượt được trình bày chi tiết ở phần tiếptheo CPLD (Complex Programmable Logic Device) CPLD là IC lập trình phức tạpthường được ghép từ nhiều các SPLD trên một chip đơn Số cổng tương đương củaCPLD đạt từ hàng nghìn đến hàng chục nghìn cổng FPGA (Field-Programmable GateArray) là IC khả trình cấu trúc từ mảng các khối logic lập trình được Nếu như đối vớicác PLD khác việc tái cấu trúc IC được thực hiện trong điều kiện của nhà máy sảnxuất bán dẫn, quá trình này cần những mặt nạ cho quang khắc nên sử dụng lớp nhữngPLD này được gọi chung bằng thuật ngữ Mask-Programmable Device FPGA phânbiệt chính với các loại trên ở khả năng tái cấu trúc IC bởi người dùng cuối hay chính
là người lập trình IC
4 Kiến trúc của các IC khả trình
Trong Kỹ thuật số ta đã chỉ ra mọi hàm logic tổ hợp đều có thể biểu diển dưới dạngchuẩn tắc tuyển tức là dưới dạng tổng của các tích đầy đủ, hoặc chuẩn tắc hội, tức làdạng tích của các tổng đầy đủ Hai cách biểu diễn này là hoàn toàn tương đương.Nguyên lý này cho phép hiện thực hóa hệ hàm logic tổ hợp bằng cách ghép hai mảng
ma trận nhân (AND) và ma trận cộng (OR) Nếu một trong các mảng này có tính khảtrình thì IC sẽ có tính khả trình Ta sẽ lần lượt nghiên cứu cấu trúc của một số loại IChoạt động trên nguyên lý này
4.1 Kiến trúc PROM, PAL, PLA, GAL
Trang 154.1.1 PROM
PROM (Programmable Read-Only Memory) được phát minh bởi Wen Tsing Chownăm 1956 khi làm việc tại Arma Division của công ty American Bosch Arma tạiGarden, New York PROM được chế tạo theo đơn đặt hàng từ lực lượng không quâncủa Mỹ lúc bấy giờ với mục đích có được một thiết bị lưu trữ các tham số về mục tiêumột các an toàn và linh động Thiết bị này dùng trong máy tính của hệ thống phóngtên lửa Atlas E/F và được giữ bí mật trong vòng vài năm trước khi Atlas E/F trở nênphổ biến PROM là vi mạch lập trình đầu tiên và đơn giản nhất trong nhóm các vimạch bán dẫn lập trình được (Programmable Logic Device) PROM có số đầu vàohạn chế, thông thường đến 16 đến 32 đầu vào, vì vậy chỉ thực hiện được những hàmđơn giản Cấu trúc của PROM tạo bởi ma trận tạo bởi mảng cố định các phần tử ANDnối với mảng các phần tử OR lập trình được
Hình 1-12 Cấu trúc PROM Tại mảng nhân AND, các đầu vào sẽ được tách thành haipha, ví dụ a thành pha thuận a và nghịch , các chấm (•) trong mảng liên kết thể hiệnkết nối cứng, tất cả các kết nối trên mỗi đường ngang sau đó được thực hiện phéplogic AND, như vậy đầu ra của mỗi phần tử AND là một nhân tử tương ứng của cácđầu vào Ví dụ như hình trên thu được các nhân tử T1,T3 như sau: Các nhân tử đượcgửi tiếp đến mảng cộng OR, ở mảng này ―X‖ dùng để biểu diễn kết nối lập trìnhđược Ở trạng thái chưa lập trình thì tất cả các điểm nối đều là X tức là không kết nối,tương tự như trên, phép OR thực hiện đối với toàn bộ các kết nối trên đường đứng và
Trang 16gửi ra các đầu ra X, Y, Z, Tương ứng với mỗi đầu ra như vậy thu được hàm dướidạng tổng của các nhân tử, ví dụ tương ứng với đầu ra Y: + (1.6)
Tính khả trình của PROM được thực hiện thông qua các kết nối antifuse (cầu chìngược) Antifuse là một dạng vật liệu làm việc với cơ chế như vật liệu ở cầu chì (fuse)nhưng theo chiều ngược lại Nếu như cầu chì trong điều kiện kích thích (quá tải vềdòng điện) thì nóng chảy và ngắt dòng thì antifuse trong điều kiện tương tự như tácđộng hiệu thế phù hợp sẽ biến đổi từ vật liệu không dẫn điện thành dẫn điện Ở trạngthái chưa lập trình thì các điểm nối là antifuse nghĩa là ngắt kết nối, khi lập trình thìchỉ những điểm nối xác định bị ―đốt‖ để tạo kết nối vĩnh viễn Quá trình này chỉ đượcthực hiện một lần và theo một chiều vì PROM không thể tái lập trình được Những ICdạng PROM có khả năng tái lập trình là UEPROM (Ultraviolet- Eraseable PROM) sửdụng tia cực tím và EEPROM (Electric-Eraseable PROM) sử dụng hiệu điện thếngưỡng cao để thiết lập lại các kết nối trong ma trận lập trình
Trang 17Hình 1-13 Cấu trúc PAL Đầu ra của macrocell cũng thông qua cổng 3 trạng thái cóthể lập trình được để nối với cổng giao tiếp của PAL Tín hiệu điều khiển của Mux4
có thể được lập trình để cho phép dẫn tín hiệu lần lượt qua các đầu vào 0,1,2,3 củaMux4 và gửi ra ngoài cổng giao tiếp IO, tùy thuộc vào cấu hình này mà tín hiệu tại IO
có thể bị chặn (không gửi ra), dẫn trực tiếp từ mảng OR, thông qua thanh ghi Register.Nhờ cấu trúc macrocell PAL có thể được sử dụng không những để thực hiện các hàmlogic tổ hợp mà cả các hàm logic tuần tự
Hình 1-14 PLA PLA (Programable Logic Array) ra đời năm 1975 và là chíp lập trìnhthứ hai sau PROM Cấu trúc của PLA không khác nhiều so với cấu trúc của PAL,ngoại trừ khả năng lập trình ở cả hai ma trận AND và OR Nhờ cấu trúc đó PLA cókhả năng lập trình linh động hơn, bù lại tốc độ của PLA thấp hơn nhiều so với PROM
và PAL và các sản phẩm cùng loại khác Thực tế PLA được ứng dụng không nhiều vànhanh chóng bị thay thế bởi những công nghệ mới hơn như PAL, GAL, CPLD…
Trang 18Hình 1-15 Cấu trúc PLA
4.1.3 GAL
GAL (Generic Array Logic) được phát triển bởi Lattice Semiconductor company vàonăm 1983, cấu trúc của GAL không khác biệt PAL nhưng thay vì lập trình sử dụngcông nghệ antifuse thì ở GAL dùng CMOS electrically erasable PROM, chính vì vậyđôi khi tên gọi GAL ít được sử dụng thay vì đó GAL được hiểu như một dạng PALđược cải tiến
4.2 Kiến trúc CPLD, FPGA
4.2.1 CPLD
Tất cả các chip khả trình PROM, PAL, GAL, thuộc nhóm SPLD (SimpleProgrammable Logic Devices) những IC này có ưu điểm là thiết kế đơn giản, chi phíthấp cho sản xuất cũng như thiết kế, có thể chuyển dễ dàng từ công nghệ này sangcông nghệ khác tuy vậy nhược điểm là tốc độ làm việc thấp, số cổng logic tươngđương nhỏ do đó không đáp ứng được những thiết kế phức tạp đòi hỏi nhiều về tàinguyên và tốc độ CPLD (Complex Programmable Logic Devices) được Altera tiênphong nghiên cứu chế tạo đầu tiên nhằm tạo ra những IC khả trình dung lượng lớnMAX5000, MAX7000, MAX9000 là họ những CPLD tiêu biểu của hãng này Sau sựthành công của Altera một loạt các hãng khác cũng bắt tay vào nghiên cứu chế tạoCPLD, Xilinx với các sản phẩm XC95xx series, Lattice với isp Mach 4000 serise,ispMarch XO…
Trang 19
Hình 1-16 Cấu trúc CPLD Một cách đơn giản nhất có thể hiểu CPLD được cấu trúcbằng cách ghép nhiều các chíp SPLD lại, thông thường là PAL Tuy vậy về bản chất
độ phức tạp của CPLD vượt xa so với các IC nhóm SPLD và cấu trúc của các CPLDcũng rất đa dạng, phụ thuộc vào từng hãng sản xuất cụ thể Dưới đây sẽ trình bàynguyên lý chung nhất của các chip họ này CPLD được tạo từ hai thành thành phần cơbản là nhóm các khối logic (Logic block) và một ma trận kết nối khả trình PIM(Programmable Interconnect Matrix) Logic block là các SPLD được cải tiến thườngchứa từ 8 đên 16 macrocells Tất cả các Logic block giống nhau về mặt cấu trúc PIM
là ma trận chứa các kết nối khả trình, nhiệm vụ của ma trận này là thực hiện kết nốigiữa các LB và các cổng vào ra IO của CPLD Về mặt lý thuyết thì ma trận này có thểthực hiện kết nối giữa hai điểm bất kỳ CPLD thông thường sử dụng các công nghệlập trình của EEPROM, điểm khác biệt là đối với CPLD thường không thể dùngnhững programmer đơn giản cho PAL, PLA… vì số chân giao tiếp của CPLD rất lớn
Để thực hiện cấu hình cho CPLD mỗi một công ty phát triển riêng cho mình một bộcông cụ và giao thức, thông thường các chip này được gắn trên một bo mạch in và dữliệu thiết kế được tải vào từ máy vi tính Tuy vậy các quy trình nạp trên đang dần bịthay thế bởi giao thức chuẩn JTAG (Join Test Action Group) chuẩn, đây cũng là giaothức dùng để cấu trúc cho FPGA mà ta sẽ nghiên cứu kỹ hơn ở chương kế tiếp Nhờ
kế thừa cấu trúc của SPLD nên CPLD không cần sử dụng bộ nhớ ROM ngoài để lưucấu hình của IC, đây là một đặc điểm cơ bản nhất phân biệt CPLD với các IC khảtrình cỡ lớn khác như FPGA
Trang 204.2.2 FPGA
Về cấu trúc chi tiết và cơ chế làm việc của FPGA sẽ được dành riêng giới thiệu trongchương sau Ở đây chỉ giới thiệu kiến trúc tổng quan nhất của IC dạng này FPGAđược cấu thành từ các khối logic (Logic Block) được bố trí dưới dạng ma trận, chúngđược nối với nhau thông qua hệ thống các kênh kết nối lập trình được Hệ thống nàycòn có nhiệm vụ kết nối với các cổng giao tiếp IO_PAD của FPGA
Hình 1-17 Kiến trúc tổng quan của FPGA FPGA là công nghệ IC lập trình mới nhất
và tiên tiến nhất hiện nay Thuật ngữ Field-Programmable chỉ quá trình tái cấu trúc IC
có thể được thực hiện bởi người dùng cuối, trong điều kiện bình thường Ngoài khảnăng đó FPGA có mật độ tích hợp logic lớn nhất trong số các IC khả trình với số cổngtương đương lên tới hàng trăm nghìn, hàng triệu cổng FPGA không dùng các mảnglập trình giống như trong cấu trúc của PAL, PLA mà dùng ma trận các khối logic.Điểm khác biệt cơ bản thứ ba của FPGA so với các IC kể trên là ở cơ chế tái cấu trúc,toàn bộ cấu hình của FPGA thường được lưu trong một bộ nhớ động (RAM), chính vìthế mà khi ứng dụng FPGA thường phải kèm theo một ROM ngoại vi để nạp cấu hìnhcho FPGA mỗi lần làm việc Kiến trúc và cách thức làm việc của FPGA sẽ đượcnghiên cứu cụ thể ở chương thứ 3 của giáo trình này
Trang 21Câu hỏi ôn tập chương 1 1 Transitor khái niệm, phân loại 2 Khái niệm, phân loại vimạch số tích hợp 3 Cổng logic cơ bản, tham số thời gian của cổng logic tổ hợp 4.Các loại Flip-flop cơ bản, tham số thời gian của Flip-flop 5 Khái niệm mạch logic tổhợp, cách xác định độ trễ trên mạch tổ hợp, khái niệm critical paths 6 Khái niệmmạch dãy, cách tính thời gian trễ trên mạch dãy, khái niệm RTL, phương pháp tănghiệu suất mạch dãy 7 Các yêu cầu chung đối với thiết kế mạch logic số 8 Các phương pháp thể hiện thiết kế mạch logic số 9 Các công nghệ thiết kế mạch logic số,khái niệm, phân loại 10 Trình bày sơ lược về các công nghệ thiết kế IC số trên chipkhả trình 11 Nguyên lý hiện thực hóa các hàm logic trên các IC khả trình dạngPROM, PAL, PLA, GAL 12 Khái niệm thiết kế ASIC, các dạng thiết kế ASIC 13.Khái niệm FPGA, đặc điểm FPGA.
CHƯƠNG 2: Tìm hiểu về ngôn ngữ mô tả phần cứng VHDL
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ạingôn ngữ mô tả phần cứng được phát triển dùng cho trương trình VHSIC( Very HighSpeed 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 đầutiên được công bố vào tháng 8-1985 Sau đó VHDL được đề xuất để tổ chức IEEExem xét thành một tiêu chuẩn chung Năm 1987 đã đưa ra tiêu chuẩn về VHDL( tiêuchuẩn IEEE-1076-1987) VHDL được phát triển để giải quyết các khó khăn trongviệ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ữđộc lậ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êuchuẩ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ềunhà 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ênxuố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ạicô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ệ:
Trang 22VHDL 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ùngVHDL 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ácnhau tuỳ thuộc công nghệ chế tạo phần cứng mới ra đời nó có thể được áp dụng ngaycho các hệ thống đã thiết kế
- Thứ tư là khả năng mô tả mở rộng:
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ứccổ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ộtbả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ạytrê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ùngtuân theo tiêu chuẩn VHDL Cũng như một nhóm thiết kế có thể trao đổi mô tả mứccao 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ácthiế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êntrong 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 Giới thiệu công nghệ (và ứng dụng) thiết kế mạch bằng VHDL
1.2.1 Ứ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 GateArrays) và ứng dụng trong ASICs(Application Specific Integrated Circuits) Khichú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ạchhoặ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:
- Giai đoạn 1 :
Chúng ta bắt đầu thiết kế bằng viết mã VHDL Mã VHDL này sẽ được 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ẽ được 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:
Trang 23Bướ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 trongquá trình chế tạo
1.2.4 Chuyển mã VHDL vào mạch
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:
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ệnphươ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 đíchcô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:
Trang 24
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ậptrình được (PLD, FPGA), thì 2 kết quả cho cout thoả mãn là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ônluô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
Trang 252.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ộtLIBRARY 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ặcCOMPONENTS, đượ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.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ị USEieee.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ởichươ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:
Trang 26std_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ênquan 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épmộ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ệuSTD_LOGIC_VECTOR để được thực hiện chỉ khi dữ liệu là kiểu SIGNED
std_logic_signed : chứa các hàm cho phép làm việc với dữ liệuSTD_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ặcra) 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ọaitrừ 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;
ARCHITECTURE là một mô tả mạch dùng để quyết mạch sẽ làm việc 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)
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;
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ếtquả 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ếntrú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 khaibá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
Ý nghĩa của ARCHITECTURE trên, 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à
Trang 27mô 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ínhiệ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 andB); Else Z <= not (ABAR and B); End if; End process; END arc_behavioral;
+ Mô tả kiến t r c theo mô hình hoạt động :
2.4 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 isArchitecture_declarative_part beginall_concurrent_statements end [architecture ][architecture_simple_name]; Khai báo các thành phần: ComponentTê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ổngNAND được định nghĩa tương tự như ví dụ với cổng NOT, sau đó mô tả sơ đồ mócnối các phần tử NAND tạo thành trigơ RS Ví dụ1:
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 COMPONENTnand đị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 đổivalues
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 AndPort(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 ả k i ế n t
r ú c t h e o m ô h ì n h t ổ n g h ơ p
Trang 28Đó 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 isComponent Xor2 Port( P1, P2 : in bit; PZ : out bit); End compenent; SignalS1 :bit; Begin X1 : Xor2 port map(A,B,S1); Process (A,B,Cin) VariableT1,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: DFFvới Reset không đồng bộ:
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ườncủ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) Khirst = ‘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ình2.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:
Kết quả mô phỏng:
Hình 2.6: Kết quả mô phỏng của ví dụ 2.1
-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ũngcho 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à clkhướ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
Trang 29cho 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ể đượcchọ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
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 <= aNAND 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
Phần 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 quacá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: Định nghĩa các kiểu dữ liệu BIT, BOOLEAN,INTEGER và REAL
• Gói std_logic_1164 của thư viện ieee : Định nghĩa kiểu dữ liệu STD_LOGIC vàSTD_ULOGIC
• Gói std_logic_arith của thư viện ieee : Định nghĩa SIGNED và UNSIGNED, cộngthê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 chophé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 đượckhai 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à MSBDự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ị đếnmộ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ớitiệu trong chuẩn IEEE 1164: ‘X’ không xác định ( bắt buộc)
Trang 30‘0’ mức thấp ( bắt buộc) ‘1’ mức cao ( bắt buộc) ‘Z’ trở kháng cao ‘W’ không xácđịnh (yếu) ‘L’ mức thấp ( yếu) ‘H’ mức cao ( yếu) ‘-’ không quan tâm
Ví dụ: SIGNAL x: STD_LOGIC; x được khai báo như một ký tự số ( vô hướng), tínhiệu thuộc kiểu STD_LOGIC SIGNAL y: STD_LOGIC_VECTOR (3 DOWNTO0) := "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ậpgiá 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 đượcgiả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ứclogic đối lập được tự động giải quyết theo Bảng 3.1
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ẩnIEEE 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ế
• SIGNED và UNSIGNED: các kiểu dữ liệu được định nghĩa trong gói std_logic_arithcủa thư viện ieee Chúng có hình thức giống như STD_LOGIC_VECTOR, nhưngngọ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âncủa số thập phân 47 x4 <= B"101111" như trên x5 <= O"57" biểu diễn bát phâncủ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 readyTHEN 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ácnhau: SIGNAL a: BIT; SIGNAL b: BIT_VECTOR(7 DOWNTO 0); SIGNAL c:STD_LOGIC; SIGNAL d: STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL e:
Trang 31INTEGER 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)
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ệungười dùng định nghĩa được chỉ ra dưới đây bao gồm integer và enumerated Kiểuinteger 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ĩatrước bởi kiểu NATURAL TYPE my_integer IS RANGE -32 TO 32; Một tập concá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 đếmngười dùng đinh nghĩa: TYPE bit IS ('0', '1'); Được định nghĩa trước bởi kiểu BITTYPE my_logic IS ('0', '1', 'Z'); Một tập con của std_logic mà người dùng địnhnghĩa TYPE bit_vector IS ARRAY (NATURAL RANGE <>) OF BIT; đã được 3.13.3 Các kiểu dữ liệu tiền định nghĩa
mức.không giới hạn NATURAL RANGE <>, on the other hand, indicates that theonly restriction is that the range must fall within the NATURAL range TYPEstate IS (idle, forward, backward, stop); Một kiểu dữ liệu , điển hình của các máytrạ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áncho 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) Kiểu dữ liệu con là một kiểu dữ liệu đikè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 nhaukhô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ó
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 akiể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; khicolor=(red, green, blue, white), thì my_color=(red, green, blue) SUBTYPEsmall_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;
Trang 32SIGNAL 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), 2chiề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íchthướ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ệuVHDL đượ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ợptrong 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)
Như có thể thấy, không hề có định nghĩa trước mảng 2D hoặc 1Dx1D, mà khi cầnthiế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 (newARIABLE họăc CONSTANT có thể được khai báo sử dụng kiểu dữ liệu đó TYPE)cần phải được định nghĩa đầu tiên, sau đó là tín hiệu mới (new SIGNAL), new VCúpháp dưới đây sẽ được dùng: Để chỉ định một kiểu mảng mới: TYPE type_name ISARRAY (specification) OF data_type; Để tạo sử dụng kiểu mảng mới: SIGNALsignal_name: type_name [:= initial_value]; Trong cú pháp ở trên, một SIGNAL đượckhai báo Tuy nhiên nó cũng có thể là một CONSTANT hoặc một VARIABLE Giatrị 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ànchỉ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 vectortrở 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 để xây dựng mảng 1Dx1D ở trên còn được thực hiện như sau: TYPEmatrix IS ARRAY (0 TO 3) OF STD_LOGIC_VECTOR(7 DOWNTO 0);
* Ví dụ mảng 2D:
Trang 33Mả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:
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ựchiện như trong ví dụ phía dưới đây: :="0001"; for 1Darray :=('0','0','0','1') for 1D array :=(('0','1','1','1'), ('1','1','1','0')); for1Dx1D or 2D array
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épgá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ấungoặ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,2DOWNTO 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 - xSTD_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)(4DOWNTO 0); - legal (same type, - same size) w(1,5 DOWNTO 1)<=v(2)(4DOWNTO 0); - illegal (type mismatch)
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ộtchiề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ộtmạch điện ( mà được xây dựng thành ENTITY), chúng ta có thể phải cần định rõ cácPORT như là mảng các VECTOR Khi các khai báo TYPE không được cho phéptrong một ENTITY, giải pháp để khai báo kiểu dữ liệu người dùng định nghĩa trongmột PACKAGE, mà có thể nhận biết toàn bộ thiết kế Một ví dụ như sau: Có thể thấytrong 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 8bit 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ĩamy_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:
Trang 34-Package: LIBRARY ieee; USE ieee.std_logic_1164.allPACKAGE my_data_types ISCONSTANT b: INTEGER := 7; TYPE vector_array IS ARRAY (NATURALRANGE <>) OF STD_LOGIC_VECTOR(b DOWNTO 0);
END my_data_types;
3.6 Kiểu bản ghi (Records)
Bản ghi tương tự như mảng, với điểm khác rằng chúng chứa các đối 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óistd_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ốngnhư 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ểuSIGNED đượ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ụngkiể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ớiSTD_LOGIC_VECTOR, chúng chấp nhận các phép toán số học Ở một khía cạnhkhá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ệ và không hợp lệ đối với kiểu dữ liệu signed/unsigned:LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; gói cầnthiết 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);
v <= a + b; hợp lệ (phép toán số học OK) w <= a AND b; không hợp lệ (phéptoán logic không OK)
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 SIGNALa: IN STD_LOGIC_VECTOR (7 DOWNTO 0); SIGNAL b: INSTD_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; baogồ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
Trang 35STD_LOGIC_VECTOR (7 DOWNTO 0); v <= a + b; hợp lệ (phép toán số họcOK), 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ệnieee 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; y <= 2*x + 5; lỗi, không phùhợp kiểu y <= long(2*x + 5); OK, kết quả được chuyển đổi thành kiểu long
Nhiều hàm chuyển đổi dữ liệu có thể được tìm trong gói std_logic_arith của thư việnieee:
o
c o n v _ i n t e g e r ( 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ằngSTD_LOGIC_VECTOR không được kể đến
c o n v _ u n s i g n e d ( 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ị UNSIGNED với kích
* 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 (7DOWNTO 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ồmviệc sử dụng các gói std_logic_signed và std_logic_unsigned từ thư viện ieee Các góinà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
3.9 Tóm tắt
Trang 36Cá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 địnhnghĩ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 TYPEmem1 IS ARRAY (0 TO 3, 7 DOWNTO 0) OF STD_LOGIC; 2D array TYPEmem2 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; 1Dsignal 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 scalarassignments: 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 indexingw1(0,0) <= x(3); same types (STD_LOGIC), correct indexing
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,647UNSIGNED From 0 to þ2,147,483,647 User-defined integer type Subset ofINTEGER User-defined enumerated type Collection enumerated by user SUBTYPESubset of any type (pre- or user-defined) ARRAY Single-type collection of any typeabove RECORD Multiple-type collection of any types above Data Types 39TLFeBOOK 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); sametypes (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;
Trang 37index 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)(7DOWNTO 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 arrayassignments: - x <= y; type mismatch y(5 TO 7) <= z(6 DOWNTO 0); wrongdirection 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 arrayw2(0, 7 DOWNTO 0) <= "11110000"; index should be 1Dx1D Example of datatype 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à bitvector
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 bitvector (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ớithiệ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
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:
Trang 38
Hình 3.2.a K ết quả mô phỏng cho đoạn mã 1của ví dụ 3.2
- 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 ENDadder1; - 1 Solution 2: out=INTEGER 2 LIBRARY ieee; 3 USEieee.std_logic_1164.all; 4 USE ieee.std_logic_arith.all; 5 - 6 ENTITY adder2 IS 7PORT ( 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
Trang 39* Kết quả mô phỏng trên Active HDL 6.1
Ví dụ: SIGNAL x : STD_LOGIC; VARIABLE y : STD_LOGIC_VECTOR(3DOWNTO 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
** Toán tử lấy mũ MOD Phép chia lấy phần nguyên REM Phép chia lấyphần dư ABS Phép lấy giá trị tuyệt đối
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ánhnhỏ 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ơnhoặc bằng 4.1.5 Toán tử dịch
Trang 40Cú 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 RllToán tử dịch phải Điền 0 vào phía trái
4.2 Thuộc tính
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ủamảng d’RIGHT Trả về chỉ số bên phải nhất của mảng d’LENGTH Trả về kíchthướ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 i IN RANGE (0 TO 7) LOOP FOR i IN x'RANGE LOOP FOR i INRANGE (x'LOW TO x'HIGH) LOOP FOR i IN 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
d’POS(val) Trả về vị trí có giá trị là val d’LEFTOF(value) Trả về giá trị ở
vị trí bên trái của value d’VAL(row,colum) 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ộtSIGNAL 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ốicùng s’LAST_ACTIVE: Trả về thới gian kể từ lần cuối cùng s = 1s’LAST_VALUE: Trả về giá trị của s trước sự kiện trước đó Trong các thuộc tínhtrê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 (NOTclk'STABLE AND clk='1') WAIT UNTIL (clk'EVENT AND clk='1'); IFRISING_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:
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 tacũng có thể xây dựng chồng các toán tử toán học Để xây dựng chồng
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ộngmột số INTEGER với một BIT