Giáo trình Thiết kế thiết bị điện tử lập trình sử dụng công nghệ FPGA và CPLD
Các CPLDs rất thích hợp trong việc diễn tả các cổng logic phức
tạp với tốc độ làm việc lớn hơn 200 Mhz ( tương đương 5 ns ).
Khuôn mẫu thời gian cho CPLD rất dễ tính toán, bởi thế trước khi
bắt đầu thiết kế bạn có thể tính toán các tốc độ từ đầu vào đến đầu ra
của mình dựa trên khuôn mẫu này. CPLDs đưa ra cách đơn giản
nhất để thực hiện một thiết kế, một thiết kế có thể được mô tả bởi
các sơ đồ nguyên lý hoặc nhập vào một HDL ( Hardware
Description Language - Ngôn ngữ mô tả phần cứng). Đơn giản khi
sử dụng các công cụ phát triển để tối ưu hoá, nạp và mô phỏng thiết
kế. Các công cụ thiết kế sẽ tạo ra một file mà file này (chính là một
file chương trình) được dùng để đưa thêm các chuẩn logic vào trong
một chip CPLD cùng với chức năng mong muốn. Chính vì vậy nó
cung cấp một chuẩn phần cứng mà cho phép các quá trình xử lý, gỡ
rối có thể thực hiện ngay từ khi bắt đầu công việc thiết kế. Giả sử
nếu bạn cần có một một sự thay đổi về thiết kế, bạn có thể đưa sự
thay đổi thiết kế đó vào trong công cụ phát triển CPLD và thực thi
trên nó, sau đó bạn có thể kiểm tra được tức thì ngay sau đó bằng
một phần mềm mô phỏng.
Tóm tắt nội dung tài liệu: Giáo trình Thiết kế thiết bị điện tử lập trình sử dụng công nghệ FPGA và CPLD
1 Lời giới thiệu Khai thác, nghiên cứu cơ bản công nghệ mới là b−ớc không thể thiếu trong việc cải tiến, nâng cao, cũng nh− chế tạo mới các trang thiết bị quân sự và dân sự nhằm đáp ứng việc hiện đại hoá công nghiệp hoá của đất n−ớc. Cùng với sự phát triển v−ợt bậc của nghành công nghệ thông tin, các công nghệ mới về các mạch tích hợp vi điện tử, các mạch tổ hợp logic lập trình đ−ợc ra đời đã làm cho các sản phẩm quân sự cũng nh− dân sự ngày càng hoàn thiện và −u việt hơn. Để tiến một b−ớc xa hơn trong việc cải tiến, chế tạo khí tài quân sự nhằm đáp ứng chiến tranh điện tử hiện đại với tốc độ xử lý cực kỳ cao, đòi hỏi phải có công nghệ tiên tiến phù hợp với tình hình chung của thế giới. Trên cơ sở phát triển từ các chíp PLA, hiện nay công nghệ na nô đã đ−ợc đ−a vào để chế tạo các mạch tích hợp lập trình đ−ợc FPGA và CPLD, nó đã làm cho mạch tích hợp logic lên đến hàng chục triệu cổng, tốc độ đồng hồ lên đến 500 MHz. ứng dụng công nghệ mới vào trong thiết kế chế tạo các thiết bị điện tử lập trình PLIC là một b−ớc cần thiết cho t−ơng lai với một n−ớc đang phát triển nh− Việt Nam. Để đáp ứng đ−ợc tính bảo mật trong quân sự cũng nh− tính phản ứng nhanh trong chiến tranh hiện đại cùng với nhu cầu chuyên dụng hoá, tối −u hoá (thời gian, không gian, giá thành), tính chủ động trong công việc... ngày càng đòi hỏi khắt khe. Việc đ−a ra công nghệ mới trong lĩnh vực chế tạo mạch điện tử để đáp ứng những yêu cầu trên là hoàn toàn cấp thiết mang tính thực tế cao. 2 Công nghệ FPGA (Field Programmable Gate Array) và CPLD (Complex Programmable Logic Device) đã đ−ợc các hãng lớn tập trung nghiên cứu và chế tạo, điển hình là Xilinx và Altera. Để làm chủ công nghệ mới và tổ chức thiết kế sản xuất công nghệ FPGA của Xilinx cho phép chúng ta tự thiết kế những vi mạch riêng, những bộ xử lý số riêng dành cho ứng dụng của chúng ta. Đặc biệt trong lĩnh vực xử lý tín hiệu số, các mạch tích hợp dùng để nhận dạng âm thanh, hình ảnh, cảm biến ... với tính mềm dẻo cao và giá thành thấp. Mặc dù công nghệ FPGA đã xuất hiện từ năm 1985, xong đối với n−ớc ta thì nó vẫn còn rất mới. Do vậy tìm hiểu, làm chủ về công nghệ FPGA là việc làm hoàn toàn cần thiết. Nó không chỉ có ý nghĩa đối với các lĩnh vực Điện tử - Viễn thông, công nghệ thông tin... mà nó có ý nghĩa đặc biệt quan trọng trong lĩnh vực an ninh quốc phòng. Xuất phát từ thực tế đòi hỏi cấp bách đó, bộ môn Tự động và Kỹ thuật tính – Khoa Kỹ thuật điều khiển – Học Viện Kỹ thuật quân sự đã cho xuất bản cuốn sách “Thiết kế thiết bị điện tử lập trình sử dụng công nghệ FPGA và CPLD”, tài liệu này nằm trong loạt các tài liệu đã đ−ợc bộ môn ấn hành, bao gồm Cấu trúc máy tính, Cờu trúc và lập trình cho các hệ xử lý tín hiệu số, cấu trúc và lập trình hệ vi điều khiển. Tài liệu giới thiệu ph−ơng pháp thiết kế CPLD, FPGA cũng nh− ngôn ngữ lập trình, từ đó đi sâu nghiên cứu các giải pháp có liên quan cũng nh− các công cụ hỗ trợ thiết kế, sau đó áp dụng để thiết 3 kế, tích hợp vào loại CPLD và FPGA cụ thể . Tài liệu đ−ợc chia thành 4 ch−ơng: - Ch−ơng 1: Giới thiệu tổng quan tổ chức phần cứng của ASIC. Giới thiệu tổng quan tổ chức các họ thiết bị cũng nh− cấu trúc của chúng (tài liệu giới thiệu cấu trúc ASIC của hãng Xilinx). - Ch−ơng 2: Giải pháp và tổ chức phần mềm đảm bảo. Giới thiệu các phần mềm hỗ trợ thiết kế, ngôn ngữ lập trình. - Ch−ơng 3: Ngôn ngữ lập trình VHDL - Ch−ơng 4: Thiết kế ứng dụng cơ bản. Ch−ơng này đ−ợc thực hiện với việc tích hợp các mạch điện tử trên cơ sở sử dụng ngôn ngữ VHDL, để thiết kế bộ điều khiển động cơ b−ớc trên hai họ thiết bị CPLD và FPGA. Cuốn sách đ−ợc dùng làm giáo trình giảng dạy bậc đại học và sau đại học chuyên ngành điện, điện tử hoặc làm tài liệu tham khảo cho các nghiên cứu sinh và cho những ai quan tâm đến cấu trúc và lập trình ASIC. Cuốn sách đ−ợc biên soạn bởi PGS. TS. Nguyễn Tăng C−ờng và TS. Phan Quốc Thắng, ThS. Phạm Tuấn Hải, KS Lê Trọng Nghĩa, do PGS. TS. Nguyễn Tăng C−ờng chủ biên. Nhân dịp này, tập thể tác giả xin bày tỏ lời cám ơn chân thành nhất đến những ng−ời đã có nhiều đóng góp trong quá trình hoàn thành tài liệu, đến các anh chị em Bộ môn Tự động và Kỹ thuật tính thuộc Khoa Kỹ thuật Điều khiển, Học viện Kỹ thuật Quân sự, đặc biệt phải kể đến sự hỗ trợ hiệu quả của TS. Đỗ Đình Nghĩa. Do kinh nghiệm và thời gian hạn chế, tài liệu này chắc chắn không thể tránh khỏi những thiếu sót. Rất mong nhận đ−ợc các ý kiến đóng góp và xây dựng của bạn đọc gần xa. ý kiến đóng góp xin 4 gửi về địa chỉ: Bộ môn Tự động và Kỹ thuật tính, Khoa Kỹ thuật Điều khiển, Học viện Kỹ thuật Quân sự, 100 Hoàng Quốc Việt, Hà nội; Điện thoại (04)7542281, email: tcuong@hn.vnn.vn. Hà Nội, Ngày 1 tháng 10 năm 2005 Tập thể tác giả 5 Ch−ơng 1 : Giới thiệu tổng quan tổ chức phần cứng của FPGA vμ CPLD 1.1 Giới thiệu công nghệ và giải pháp của Xilinx Vào cuối những năm 70, các bảng mạch đ−ợc thiết kế sẵn cùng với các thiết bị chuẩn logic đ−ợc −a chuộng và thịnh hành . Sau đó một số câu hỏi đ−ợc đ−a ra rằng " Điều gì sẽ xảy ra nếu chúng ta đ−a cho những ng−ời thiết kế khả năng thực hiện kết nối giữa các thiết bị chuẩn logic khác nhau trong một thiết bị lớn hơn ? ". Điều này cho phép những ng−ời thiết kế tích hợp đ−ợc nhiều thiết bị chuẩn logic hơn vào trong một thiết bị. Để có đ−ợc sự linh hoạt trong thiết kế, Ron Cline ng−ời của hãng SigneticsTM đã đ−a ra ý t−ởng bao gồm hai sơ đồ cho phép ng−ời thiết kế có thể lập trình đ−ợc. Hai sơ đồ này cung cấp bất kỳ tổ hợp logic nào của các cổng "AND" và "OR" mà chúng có thể đ−ợc dùng chung với một số giới hạn cổng "AND " thông qua các cổng "OR". Cấu trúc này đã trở nên rất mềm dẻo, nh−ng tại thời điểm đó lớp đệm hình học 10 àm đã tạo ra sự giữ chậm giữa đầu vào và đầu ra rất lớn, chính điều này đã làm 6 cho thiết bị hoạt động t−ơng đối chậm. Và cấu trúc này đ−ợc gọi là cấu trúc của PLA (Programmable Logic Array). Hình 1.1. Cấu trúc của PLA (Programmable Logic Array) Hãng MMI (Sau đó bị mua bởi hãng AMD TM) đã hợp tác với hãng SigneticsTM và là nơi cung cấp nguồn tài liệu thứ hai cho hệ thống mảng logic lập trình PLA (Programmable Logic Array). Nh−ng sau khi sản xuất, cấu trúc này đã bị thay đổi và trở thành cấu trúc logic mảng lập trình đ−ợc PAL (Programmable Array Logic), bởi việc cố định một mảng và chỉ cho phép lập trình trên một mảng còn lại. Cấu trúc PAL mới này rất khác với cấu trúc của PLA ở chỗ là một mảng lập trình đ−ợc bị gắn cố định - mảng các cổng OR . Tuy nhiên, cấu trúc PAL (Programmable Array Logic) này cũng có lợi là thời gian giữ chậm đ−ờng truyền từ đầu vào đến đầu ra ngắn hơn và phần mềm ít phức tạp hơn. Tuy nhiên chúng không mềm dẻo bằng cấu trúc PLA (Programmable Logic Array) . Các cấu trúc khác cũng đ−ợc đ−a ra, chẳng hạn nh− PLD (Programmable Logic Device) - thiết bị logic lập trình đ−ợc. Loại thiết bị này th−ờng đ−ợc gọi là thiết bị logic lập trình đ−ợc đơn giản SPLD ( Simple 7 Programmable Logic Device) và tên này đ−ợc gọi chung cho tất cả các thiết bị logic lập trình đ−ợc nh− : PALs, CPLDs, FPGAs. Cấu trúc của PAL (Programmable Array Logic) . Hình 1.2. Cấu trúc của PAL (Programmable Array Logic) Cấu trúc này có các mắt l−ới của các đ−ờng nối theo chiều ngang và chiều đứng. Tại mỗi điểm giao nhau, chúng đ−ợc nối với nhau bằng một cầu trì. Với sự trợ giúp của các công cụ phần mềm, ng−ời thiết kế có thể lựa chọn mối nối, mối nào không đ−ợc nối thì cầu trì tại điểm đó sẽ bị huỷ đi (Bị nung nóng và thổi đứt). Điều này đ−ợc thực hiện bởi một bộ nạp ch−ơng trình. Theo hình 1.2 các chân đầu vào đ−ợc nối vào các đ−ờng theo chiều đứng, các đ−ờng nằm ngang đ−ợc nối với các cổng AND - OR, lần l−ợt các đ−ờng này đ−ợc nối với các Flip-Flop chuyên dụng (Chẳng hạn nh− Flip-Flop loại D, T, RS). Các PLDs (Programmable Logic Device) trong một IC đóng gói đơn có số cổng nhiều hơn 50 lần các thiết bị logic chuyên biệt. Điều này nó đã thể hiện một sự tiến bộ rõ rệt, đấy là ch−a đề cập đến một số thiết bị cần phải đ−ợc giản l−ợc hoá để có độ tin cậy cao hơn các thiết bị chuẩn logic . Công nghệ PLD đã phát triển từ những ngày còn rất sớm, chẳng 8 hạn nh− công ty Xilinx, họ đã đ−a ra sản phẩm CMOS với nguồn tiêu thụ siêu thấp dựa trên công nghệ bộ nhớ flash. Các PLD flash cho phép khả năng lập trình và xoá bằng điện cho thiết bị nhiều lần đã trở nên thích hợp hơn so với các chíp thế hệ cũ, các loại chip mà với thời gian xoá ch−ơng trình hơn 20 phút bằng tia cực tím . 1.1.1. Complex Programmable Logic Devices (CPLDs) Tạm dịch là các thiết bị logic cho phép lập trình phức hợp, họ thiết bị này là kết quả của việc tăng mật độ của họ SPLDs (Programmable Logic Device) lên nhiều lần. Khái niệm này đ−ợc hiểu nh− sau : tăng một số khối PLD hoặc các macrocell (xin đ−ợc để nguyên nghĩa và giải thích ở phần cấu trúc của CPLD) ở trong một thiết bị đơn cùng với các đ−ờng nối liền đa năng giữa chúng. Các đ−ờng nối của các đơn vị logic đơn có thể đ−ợc thực thi ở trong một khối đơn ( a single block ). Nhiều logic phức tạp yêu cầu cần nhiều khối và sử dụng các đ−ờng nối đa năng giữa chúng để tạo nên các kết nối phức tạp hơn. Hình 1.3. Cấu trúc của CPLD 9 Các CPLDs rất thích hợp trong việc diễn tả các cổng logic phức tạp với tốc độ làm việc lớn hơn 200 Mhz ( t−ơng đ−ơng 5 ns ). Khuôn mẫu thời gian cho CPLD rất dễ tính toán, bởi thế tr−ớc khi bắt đầu thiết kế bạn có thể tính toán các tốc độ từ đầu vào đến đầu ra của mình dựa trên khuôn mẫu này. CPLDs đ−a ra cách đơn giản nhất để thực hiện một thiết kế, một thiết kế có thể đ−ợc mô tả bởi các sơ đồ nguyên lý hoặc nhập vào một HDL ( Hardware Description Language - Ngôn ngữ mô tả phần cứng). Đơn giản khi sử dụng các công cụ phát triển để tối −u hoá, nạp và mô phỏng thiết kế. Các công cụ thiết kế sẽ tạo ra một file mà file này (chính là một file ch−ơng trình) đ−ợc dùng để đ−a thêm các chuẩn logic vào trong một chip CPLD cùng với chức năng mong muốn. Chính vì vậy nó cung cấp một chuẩn phần cứng mà cho phép các quá trình xử lý, gỡ rối có thể thực hiện ngay từ khi bắt đầu công việc thiết kế. Giả sử nếu bạn cần có một một sự thay đổi về thiết kế, bạn có thể đ−a sự thay đổi thiết kế đó vào trong công cụ phát triển CPLD và thực thi trên nó, sau đó bạn có thể kiểm tra đ−ợc tức thì ngay sau đó bằng một phần mềm mô phỏng. CPLD có mức tích hợp rất cao (có nghĩa là một số l−ợng lớn các cổng trên một diện tích) và đ−ợc đóng gói trong một khuôn dạng rất nhỏ. Điều này đã đ−a ra một giải pháp tuyệt vời cho những ng−ời thiết kế cần sản phẩm của mình đ−ợc đóng gói nhỏ gọn với diện tích bo mạch bị giới hạn về không gian. Họ Xilinx CoolRunner CPLDs luôn có mặt trong các đóng gói cùng với các chip đời mới. Chẳng hạn nh− chip CP56 CPLD có khoảng cách các chân là 0,5 mm và với kích th−ớc bao nhỏ không đáng kể 10 6x6mm và điều này cho phép đ−a ra một sản phẩm nhỏ gọn cùng với mức độ tiêu thụ nguồn thấp . 1.1.2. Field Programmable Gate Arrays ( FPGAs) Mảng cổng cho phép lập trình đ−ợc. Năm 1985, công ty Xilinx đã đ−a ra một ý t−ởng mới : Đó là sự kết hợp giữa những điều khiển ng−ời dùng, thời gian đ−a sản phẩm PLD (Programmable Logic Device) ra thị tr−ờng cùng với mật độ tích hợp, giá của các ma trận cổng. Điều này đã cho ra đời thiết bị FPGA và cho đến nay Xilinx vẫn là nhà phân phối số 1 trên toàn thế giới về họ thiết bị này. Một FPGA có cấu trúc của các Logic Cell hoặc các Module và các đ−ờng nối (Xem hình 1.4), các đ−ờng nối này nằm d−ới sự điều khiển của ng−ời thiết kế. Có nghĩa là bạn có thể thiết kế, lập trình và thay đổi mạch của bạn bất cứ khi nào bạn muốn . Với họ FPGA ngày nay khả năng tích hợp của nó đã v−ợt qua giới hạn 10 triệu cổng ( Họ Xilinx VirtexTM- II và VirtexTM- 4 FPGA hiện đang giữ kỷ lục).Với sự giới thiệu của họ sản phẩm Spartan FPGA hiện nay, Xilinx có thể cạnh tranh về ma trận cổng ở mọi khía cạnh nh− giá cả, số l−ợng cổng, số l−ợng vào ra cũng nh− hiệu quả về giá thành. Giả sử lấy Spartan - IIE FPGA với số l−ợng 300.000 cổng làm chuẩn của giá thành, nó có thể cho phép thay thế các sản phẩm ứng dụng theo chuẩn chuyên dụng. Có hai loại FPGA cơ bản : Loại SRAM (Static Random Access Memory) có thể lập trình lại nhiều lần và loại OTP (One - Time Programmable) lập trình một lần. 11 Hình 1.4. Cấu trúc của FPGA Hai loại này khác nhau ở chỗ thực hiện của các logic cell và kỹ thuật tạo sự kết nối giữa chúng trong thiết bị. Loại hay đ−ợc dùng hơn cả là loại SRAM, vì nó có thể lập trình đ−ợc nhiều lần. Thực tế thì SRAM FPGA đ−ợc nạp cấu hình lại mỗi khi bật nguồn, bởi vì FPGA loại này thực chất là một chíp nhớ theo ý muốn. Có một câu hỏi đặt ra là " Tại sao lại cần một chip PROM nối tiếp hoặc bộ nhớ hệ thống? " cùng với mỗi SRAM FPGA . Xem cấu trúc của hai loại với hình vẽ 1.5 và 1.6: 12 Hình 1.5. Cấu trúc SRAM FPGA ( SRAM Logic Cell) - Loại SRAM có thể lập trình lại : + SRAM xác định các đ−ờng kết nối. + SRAM xác định đơn vị logic trong bảng LUT ( Look Up Table ) ( Mỗi một LUT là một bộ tạo chức năng hay bộ tạo hàm với N đầu vào và một đầu ra, có thể thực hiện bất cứ chức năng logic nào với N đầu vào của nó. N th−ờng nằm giữa 2 và 6, thông th−ờng các LUT có 4 đầu vào ). Hình 1.6 . Cấu trúc của OTP FPGA (OTP Logic Cell) - Loại OTP cho phép lập trình một lần : + Các đ−ờng nối không đ−ợc phép nối nh− dạng cầu chì ( Nối cố định ). + Logic là các cổng truyền thống . Trong SRAM Logic Cell, thay vì các cổng thông th−ờng, một LUT ( bộ tạo hàm ) sẽ xác định các đầu ra dựa vào giá trị cuả các đầu vào. Nh− hình 1.5 ta thấy sáu tổ hợp khác nhau của bốn bít vào 13 xác định các giá trị của đầu ra, các bit này cũng đ−ợc dùng để thực thi các kết nối. Trong OTP FPGAs sử dụng kết nối giữa các đ−ờng theo dạng nối ng−ợc ( Có nghĩa ng−ợc với cầu trì, sự kết nối đ−ợc tạo ra và không bị nóng chảy trong suốt thời gian nạp ch−ơng trình), nhằm tạo ra các kết nối cố định trong chip. Hơn nữa, OTP FPGA không cần SPROM nào khác, điều đó có nghĩa là nạp cấu hình vào thẳng FPGA. Tuy nhiên mỗi lần thay đổi một thiết kế bạn phải vứt bỏ đi một chip. Loại OTP Logic Cell có cấu trúc t−ơng tự nh− họ PLD (Programmable Logic Device), bao gồm các cổng và flip - flop chuyên dụng nh− Flip-Flop loại D , T , hay RS . 1.2. Giới thiệu các họ thiết bị của Xilinx Xilinx chia sản phẩm của mình ra rất nhiều họ nh−ng tài liệu sẽ tập trung chính vào việc giới thiệu hai loại FPGA và CPLD cơ bản, xem hình vẽ (Hình2.1). Đó là lọai thiết bị CoolRunner - XPLA3 CPLD, và Spartan 3 FPGA. 14 Hình1.7. Sơ l−ợc các họ thiết bị của Xilinx 1.2.1. Họ Platform FPGAs Hình 1.7 cho ta thấy đ−ợc tổng quan các họ sản phẩm chính cuả Xilinx. ở đây xin chỉ giới thiệu tổng quan và đ−a ra các địa chỉ cần tra cứu về chi tiết kỹ thuật của chúng trên trang Web của hãng Xilinx. Họ Virtex FPGAs : Sản phẩm Virtex-II là hiện thân đầu tiên của Platform FPGA. Nó đã tạo ra một điểm dấu mới trong sự thực thi, cộng thêm hàng loạt các tính năng mới của thiết bị mà từ tr−ớc ch−a có. Đây là thời kỳ mà Xilinx mở rộng tầm chiến l−ợc của mình bằng việc kết hợp với các hãng IBM, ... = HI; uart_STB_I <= HI; uart_ACK_O <= uart_STB_I; end if; -- pin_led <= '0'; else -- charBuf <= "00000000"; uart_STB_I <= LO; uart_ACK_O <= uart_STB_I; pin_led <= '0'; end if; end if; end process; 19 ------------------------------------------ ------------ process (Pushbtn,charBuf,CLK) Begin if Pushbtn = '1' then Start <= '1' ; Cnt_Dir <= '1'; Inc <= '1'; elsif CLK'event and CLK = '1' then case charBuf is when x"53" => -- Start Start <= '0'; when x"42" => -- Stop Start <= '1'; when x"4C" => -- Left Cnt_Dir <= '1'; when x"52" => -- Right Cnt_Dir <= '0'; when x"55" => - - Up Inc <= '0'; when x"44" => -- Down Inc <='1' ; when others => Start <= '1'; Cnt_Dir <= '1' ; Inc <= '1'; end case; end if; end Process; end arch; --------------------------------- 20 UART.vhd-------------------------------- ------------------------------------------ ------------------- -- Title : UART --- -- Project : UART --- -- Clock : 50MHz Using Clock of Board XC3s200 --- -- Author : Pham Tuan Hai_Lop Dieu Khien K15 --- ------------------------------------------ ------------------- ------------------------------------------ ------------------- library ieee; use ieee.std_logic_1164.all; entity UART is generic(BRDIVISOR: INTEGER range 0 to 65535 := 130); port ( CLK_I : in std_logic; RST_I : in std_logic; ADR_I : in std_logic_vector(1 downto 0); DAT_I : in std_logic_vector(7 downto 0); DAT_O : out std_logic_vector(7 downto 0); WE_I : in std_logic; STB_I : in std_logic; ACK_O : out std_logic; -- process signals -- Transmit interrupt: indicate waiting for Byte IntTx_O : out std_logic; IntRx_O : out std_logic; 21 BR_Clk_I : in std_logic; TxD_PAD_O: out std_logic; RxD_PAD_I: in std_logic); end UART; -- Architecture for UART for synthesis architecture Behaviour of UART is ------------------------------------------ ------------------ component Counter generic(COUNT: INTEGER range 0 to 65535); port ( Clk : in std_logic; -- Clock Reset : in std_logic; -- Reset input CE : in std_logic; -- Chip Enable O : out std_logic); -- Output end component; ------------------------------------------ ------------------ component Rx port ( Clk : in std_logic; Reset : in std_logic; Enable : in std_logic; -- Async Read Received Byte . ReadA =1 then no thing to do, ReadA=0 => read ReadA : in Std_logic; RxD : in std_logic; RxAv : out std_logic; DataO : out std_logic_vector(7 downto 0)); end component; ------------------------------------------ ------------------ 22 component Tx port ( Clk : in std_logic; Reset : in std_logic; Enable : in std_logic; -- Asynchronous Load signal =1 then transfer Data in input to Buffer, BufL=1 LoadA : in std_logic; TxD : out std_logic; Busy : out std_logic; DataI : in std_logic_vector(7 downto 0)); -- Byte to transmit end component; ------------------------------------------ ------------------ -- Signals of uart signal RxData : std_logic_vector(7 downto 0); signal TxData : std_logic_vector(7 downto 0); signal SReg : std_logic_vector(7 downto 0); signal EnabRx : std_logic; -- Enable RX unit signal EnabTx : std_logic; -- Enable TX unit -- Data Received =1 Buffer contains a received byte ,=0 Buffer empty or idle signal RxAv : std_logic; -- Transmiter Busy =1 is Busy , =0 Accept a byte to transmit signal TxBusy : std_logic; signal ReadA : std_logic; -- Async Read receive buffer signal LoadA : std_logic; -- Async Load transmit buffer 23 signal Sig0 : std_logic; -- gnd signal signal Sig1 : std_logic; -- vcc signal ------------------------------------------ ------------------ BEGIN sig0 <= '0'; sig1 <= '1'; ------------------------------------------ ------------------------------------- Uart_Rxrate : Counter generic map (COUNT => BRDIVISOR) port map (BR_CLK_I, sig0, sig1, EnabRx); ------------------------------------------ ------------------------------------ Uart_Txrate : Counter generic map (COUNT => 8) port map (BR_CLK_I, Sig0, EnabRx, EnabTx); ------------------------------------------ ------------------------------------- Uart_Tx : Tx port map (BR_CLK_I, RST_I, EnabTX, LoadA, TxD_PAD_O, TxBusy, TxData); Uart_Rx : Rx port map (BR_CLK_I, RST_I, EnabRX, ReadA, RxD_PAD_I, RxAv, RxData); ------------------------------------------ ------------------------------------- IntTx_O <= not TxBusy; -- Flag signal TxBusy=1 Transmiter is Busy ,or IntTx_0 = 0 is Busy IntRx_O <= RxAv; -- RxAv =1 one Byte Received -- RxAv =0 Receiver Buffer empty 24 SReg(0) <= not TxBusy; SReg(1) <= RxAv; SReg(7 downto 2) <= "000000"; ------------------------------------------ ------------------------------------- -- Clocked on rising edge. Synchronous Reset RST_I ------------------------------------------ ------------------------------------- WBctrl : process(CLK_I, RST_I, STB_I, WE_I, ADR_I) variable StatM : std_logic_vector(4 downto 0); begin if Rising_Edge(CLK_I) then -- System Clock rising if (RST_I = '1') then -- if no Reset ReadA <= '0'; -- ReadA Signal =0 LoadA <= '0'; -- LoadA Signal =0 else -- When reset = 0 occured -- Write Byte to Tx if (STB_I = '1' and WE_I = '1' and ADR_I = "00") then -- Get input connect to TxData input signal of Transmiter TxData <= DAT_I; -- Async transmit buffer Load signal , load data into Transmiter LoadA <= '1'; else LoadA <= '0'; end if; -- Read Byte from Rx 25 if (STB_I = '1' and WE_I = '0' and ADR_I = "00") then -- DAT_O <= RxData; -- Out Data to Bus -- Async receive buffer Read signal connects to ReadA input of Receiver ReadA <= '1'; -- Signal is used to read buffer, ReadA=1 => Read else ReadA <= '0'; end if; end if; end if; end process; ------------------------------------------ ------------------------------------- ACK_O <= STB_I; DAT_O <= RxData when ADR_I = "00" else -- Read Byte from Rx SReg when ADR_I = "01" else -- Read Status Reg "00000000"; end Behaviour; -------------------------------------- Rx.vhd----------------------------- ------------------------------------------ ------------------- -- Title : UART --- -- Project : UART --- -- Clock : 50MHz -- - -- Author : Pham Tuan Hai --- ------------------------------------------ ------------------- library ieee; use ieee.std_logic_1164.all; 26 entity Rx is port ( Clk : in std_logic; Reset : in std_logic; Enable : in std_logic; ReadA : in Std_logic; RxD : in std_logic; RxAv : out std_logic; DataO : out std_logic_vector(7 downto 0)); end Rx; ------------------------------------------ ------------------------------------- architecture Behaviour of Rx is signal RReg : std_logic_vector(7 downto 0); signal RRegL: std_logic; begin ------------------------- RxAv process---- ------------------------ RxAvProc : process(RRegL,Reset,ReadA) begin if ReadA = '1' or Reset = '1' then RxAv <= '0'; elsif Rising_Edge(RRegL) then RxAv <= '1'; end if; end process; ----------------------- Rx Process-------- ------------------------- RxProc : process(Clk,Reset,Enable,RxD,RReg) variable BitPos : INTEGER range 0 to 10; variable SampleCnt : INTEGER range 0 to 3; 27 begin if Reset = '1' then RRegL <= '0'; BitPos := 0; elsif Rising_Edge(Clk) then if Enable = '1' then case BitPos is when 0 => RRegL <= '0'; if RxD = '0' then SampleCnt := 0; BitPos := 1; end if; when 10 => BitPos := 0; RRegL <= '1'; DataO <= RReg; when others => if (SampleCnt = 1 and BitPos >= 2) then RReg(BitPos-2)<=RxD ; end if; if SampleCnt = 3 then BitPos := BitPos + 1; end if; end case; -- if SampleCnt = 3 then SampleCnt := 0; else sampleCnt := SampleCnt + 1; end if; -- end if; end if; end process; 28 end Behaviour; ------------------------------------ Tx.vhd-------------------------------- ------------------------------------------ ------------------- -- Title : UART -- - -- Project : UART --- -- Clock : 50MHz -- - -- Author : Pham Tuan Hai --- ------------------------------------------ ------------------- ------------------------------------------ ------------------- library ieee; use ieee.std_logic_1164.all; entity Tx is port ( Clk : in std_logic; Reset : in std_logic; Enable : in std_logic; LoadA : in std_logic; TxD : out std_logic; Busy : out std_logic; DataI : in std_logic_vector(7 downto 0)); end Tx; ------------------------------------------ --------------------------- architecture Behaviour of Tx is ------------------------------------------ --------------------------- component synchroniser port ( 29 C1 : in std_logic; C : in std_logic; O : out Std_logic); end component; signal TBuff : std_logic_vector(7 downto 0); signal TReg : std_logic_vector(7 downto 0); signal TBufL : std_logic; signal LoadS : std_logic; ------------------------------------------ -------------------------------------begin -- Begin of Architech -- Synchronise Load on Clk SyncLoad : Synchroniser port map (LoadA, Clk, LoadS); Busy <= LoadS or TBufL; -- Tx process ------------------------------------------ ----------------------- TxProc : process(Clk, Reset, Enable, DataI, TBuff, TReg, TBufL) variable BitPos : INTEGER range 0 to 10; begin if Reset = '1' then TBufL <= '0'; BitPos := 0; TxD <= '1'; elsif Rising_Edge(Clk) then if LoadS = '1' then TBuff <= DataI; TBufL <= '1'; end if; if Enable = '1' then case BitPos is 30 when 0 => TxD <= '1'; if TBufL = '1' then TReg <= TBuff; TBufL <= '0'; BitPos := 1; end if; when 1 => TxD <= '0'; BitPos := 2; when others => TxD <= TReg(BitPos-2); -- Serialisation of TReg BitPos := BitPos + 1; end case; if BitPos = 10 then -- bit8. next is stop bit BitPos := 0; end if; end if; end if; end process; end Behaviour; ------------------------------- COUNTER.vhd----------------------------- ------------------------------------------ ------------------- -- Title : UART --- -- Project : UART --- -- Clock : 50MHz -- - -- Author : Pham Tuan Hai --- ------------------------------------------ ------------------- 31 ------------------------------------------ ------------------- library IEEE,STD; use IEEE.std_logic_1164.all; entity Counter is generic(Count: INTEGER range 0 to 65535); -- Count revolution port ( Clk : in std_logic; -- Clock Reset : in std_logic; -- Reset input CE : in std_logic; -- Chip Enable O : out std_logic); -- Output end Counter; ------------------------------------------ ---------------------- ------------------------------------------ ---------------------- architecture Behaviour of Counter is begin counter : process(Clk,Reset) -- Variable Cnt is using temple count variable variable Cnt : INTEGER range 0 to Count-1; begin if Reset = '1' then Cnt := Count - 1; O <= '0'; elsif Rising_Edge(Clk) then if CE = '1' then -- if Cnt = 0 then O <= '1'; 32 Cnt := Count - 1; else O <= '0'; Cnt := Cnt - 1; end if; -- else O <= '0'; end if; end if; end process; end Behaviour; -------------------------- Synchroniser.vhd------------------ ------------------------------------------ ------------------- -- Title : UART --- -- Project : UART --- -- Clock : 50MHz --- -- Author : Pham Tuan Hai --- ------------------------------------------ ------------------- ------------------------------------------ ------------------- library IEEE,STD; use IEEE.std_logic_1164.all; entity synchroniser is port ( C1: in std_logic; -- Asynchronous signal C : in std_logic; -- Clock O : out std_logic); -- Synchronised signal end synchroniser; ------------------------------------------ 33 ------------------------- architecture Behaviour of synchroniser is signal C1A : std_logic; signal C1S : std_logic; signal R : std_logic; begin RiseC1A : process(C1,R) begin if Rising_Edge(C1) then C1A <= '1'; end if; if (R = '1') then C1A <= '0'; end if; end process; ------------------------------------------ ------------------------- SyncP : process(C,R) begin if Rising_Edge(C) then if (C1A = '1') then C1S <= '1'; else C1S <= '0'; end if; if (C1S = '1') then R <= '1'; else R <= '0'; end if; end if; if (R = '1') then C1S <= '0'; end if; end process; O <= C1S; 34 end Behaviour; 35 Tμi liệu tham khảo 1. Nguyễn Tăng C−ờng, Phan Quốc Thắng, Vũ Hữu Nghị (2002), Cấu trúc máy tính, Học viện kỹ thuật quân sự, Hà Nội. 2. Nguyễn Tăng C−ờng, Phan Quốc Thắng, Trần Văn Hợp (2002), Cấu trúc các hệ xử lý tín hiệu số, Học viện kỹ thuật quân sự, Hà Nội 3. Nguyễn Tăng C−ờng, Phan Quốc Thắng (2003), Cấu trúc và lập trình họ vi điều khiển 8051, Học viện kỹ thuật quân sự, Hà Nội. 4. Văn Thế Minh (1998), Kỹ thuật vi xử lý, NXB Giáo dục, Hà Nội 5. Đỗ Xuân Tiến (1991), Kỹ thuật vi xử lý, Học viện kỹ thuật quân sự, Hà Nội. 6. David Harris (1955) Structural Design With Verilog Harvey Mudd College. 7. Donnamaie E. White (2002), Logic Design for Array-Based Circuits, Original Hardcover – Still, London. 8. Don Davis (Winter 2002), “Architectural Synthesis: Unleashing the 36 Power of FPGA System-Level Design”, Xcell Journal, (Issue 44), pages 30–34, Xilinx, United States of America. 9. Giovanni De Micheli, Rajesh K. Gupta (3/1997), “Hardware/Software Co-Design”, Proceedings of the IEEE, (Vol. 85, No 3), pages 349 – 64. 10. Daniel Tabak (1995), Advanced Microprocesors, McGraw- Hill, United States of America. 11. Donnamaie E. White (2002), Logic Design for Array-Based Circuits, Original Hardcover – Still, London. 12. Don Davis (Winter 2002), “Architectural Synthesis: Unleashing the Power of FPGA System-Level Design”, (Issue 44), pages 30 – 34, 13. Michael John Sebastian Smith (1997), Application-Specific Integrated Circuits, Hardcover (www.Amazon.com), United States of America. 14. Peter J.Ashenden (1990), The VHDL CooKBook, University of Adelaide, 37 South Australia. 15. Roger Lipsett & Carl Schaefer (1989), VHDL: Hardware Description and Design, Kluwer Academic Publishers, United States of America. 16. Nguồn tham khảo từ Internet xlnx/xil_ans_brower.jsp xlnx/xweb/xil_publications_index.jsp
File đính kèm:
- giao_trinh_thiet_ke_thiet_bi_dien_tu_lap_trinh_su_dung_cong.pdf