Giáo trình Vi mạch số lập trình (Trình độ: Trung cấp/Cao đẳng nghề)

I. Vị trí, tính chất của mô đun: - Vị trí: Trước khi học mô đun này cần hoàn thành các môn học cơ sở nghề và một số mô đun chuyên môn nghề như: PLC cơ bản, Kỹ thuật Vi điều khiển. - Tính chất: Là mô đun tự chọn trong chương trình đào tạo ngành/ nghề Điện tử công nghiệp. II. Mục tiêu mô đun: - Về kiến thức: + Trình bày được nguyên lý hệ điều khiển lập trình cỡ nhỏ + Phân tích được cấu tạo phần cứng và nguyên tắc hoạt động của bộ lập trình cỡ nhỏ. - Về kỹ năng: + Thực hiện được một số bài toán ứng dụng đơn giản trong công nghiệp. + Kết nối thành thạo phần cứng của bộ lập trình cỡ nhỏ, PC với thiết bị ngoại vi. + Viết chương trình và nạp được chương trình vào bộ lập trình cỡ nhỏ để thực hiện được một số bài toán ứng dụng đơn giản trong công nghiệp. - Về năng lực tự chủ và trách nhiệm: + Chủ động, sáng tạo và đảm bảo an toàn trong quá trình học tập.

pdf125 trang | Chia sẻ: Tiểu Khải Minh | Ngày: 19/02/2024 | Lượt xem: 127 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Giáo trình Vi mạch số lập trình (Trình độ: Trung cấp/Cao đẳng nghề), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
v Timing Simulation (Mô phỏng có tham số thời gian): Sau bước Place and Route người thiết kế có thể thực hiện mô phỏng thiết kế ở mức cổng logic đã được định vị trí và định tuyến trên CPLD, để thực hiên mô phỏng hoạt động của thiết kế mà có tính đến các tham số thời gian trễ, thời gian thiết lập, của các cổng logic trong CPLD. Bước này rất quan trọng với những thiết kế phức tạp, tốc độ lớn. v Configuration (Cấu hình): Gọi chương trình điều khiển việc nạp cấu hình, thực hiện kết nối thiết bị nạp (cáp nạp) đến CPLD và nạp file cấu hình cho CPLD. Với CPLD của hãng Xilinx, quá trình lập trình có thể thực hiện ngay trong hệ thống nhờ công cụ JTAG, hoặc sử dụng bộ lập trình thiết bị chuyên dụng, ví dụ như công cụ JTAG Data I/O, theo chuẩn IEEE/ANSI 1149.1_1190. Công cụ JTAG là một bộ 60 các nguyên tắc thiết kế, hỗ trợ quá trình kiểm tra, lập trình cho thiết bị và gỡ rối trên chip, trên bo mạch và trên hệ thống. Khả năng lập trình trên hệ thống là ưu điểm của CPLD, cho phép hàn trực tiếp thiết bị lên PCB. Nếu có thay đổi trong thiết kế, sẽ không phải tháo thiết bị ra khỏi bo mạch, mà đơn giản chỉ phải lập trình lại trên hệ thống. 61 BÀI 3: CÁC PHÉP TOÁN SỐ CỦA BỘ LẬP TRÌNH CỠ NHỎ Mục tiêu: - Trình bày được các phép toán so sánh, các phép toán số. - Lập trình, kết nối, chạy thử các phép toán so sánh,phép toán số, trong các bài toán thực tế. - Chủ động, sáng tạo và đảm bảo an toàn trong quá trình học tập. Nội dung chính: 3.1.Chức năng truyền dẫn 3.1.1. Truyền Byte, Word, Doubleword. Xilinx đã cung cấp các công cụ thiết kế hoàn chỉnh, cho phép thực hiện thiết kế trên các thiết bị logic khả trình của Xilinx. Các công cụ này kết hợp cộng nghệ tiên tiến với giao diện đồ họa linh hoạt, dễ sử dụng để người thiết kế có thể có được thiết kế tối ưu. Bộ công cụ phần mềm hiện tại đang sử dụng rộng rãi là ISE với nhiều phiên bản phần mềm khác nhau, các phiên bản sau được hỗ trợ thêm các dòng thiết bị mới. Trong chương này trình bày chi tiết về cách cài đặt và sử dụng phần mềm ISE 12.1 (phiên bản phần mềm 2010). Xilinx cũng cung cấp ISE dưới dạng các gói phần mềm có cấu hình khác nhau với giá thành khác nhau, tiêu biểu là ISE WebPACK và ISE Foundation: v ISE WebPACK: bản miễn phí có thể dùng để thiết kế cho tất cả các họ CPLD và một số họ FPGA của Xilinx. v Gói phần mềm Foundation: có thể thiết kế cho tất cả các loại FPGA và CPLD của Xilinx. Ngoài ra, Xilinx còn phát triển các bộ công cụ phần mềm tiện ích khác như System Generator hỗ trợ cho các thiết kế DSP, hay EDK (Embeded Development Kit) hỗ trợ cho các thiết kế nhúng. Ta có thể tải phần mềm ISE WebPACK từ trang web: Để cài đặt chương trình ISE WebPACK 12.1 ta tiến hành các bước sau: v Từ folder chứa phần mềm ta kich đúp vào file setup, và làm theo các bước sau: 62 - Chọn Next Hình 5.1 - Đánh dấu tick vào ô: i accept the terms of this software licence - Sau đó kích Next Hình 5.2 63 - Đánh dấu tick vào ô: i accept the terms of this software licence - Sau đó kích Next Hình 5.3 - Chọn ISE WebPACK sau đó nhấn Next Hình 5.4 64 - Chọn Next Hình 5.5 - Kích vào cửa sổ Browse để chọn đường dẫn chứa chương trình cài đặt sau đó kích Next Hình 5.6 65 - Kích Install Hình 5.7 - Sau khi chọn Install, chương trình bắt đầu được cài đặt như hình 5.8. Ta đợi cho đến khi quá trình cài đặt hoàn thành Hình 5.8 66 - Sau khi quá trình cài đặt hoàn thành, hộp thoại quản lý cấu hình của Xilinx sẽ xuất hiện để ta chọn các loại license khác nhau như hình 5.9. Hình 5.9 Ta có thể chọn một trong năm dạng license. v Start Now! -30 Day trial (No Bitstream): cho phép ta sử dụng miễn phí trong 30 ngày, và không tạo được Bitstream. v Get Free ISE Webpack License: Nhận license ISE WebPACK từ trang web của Xilinx. v Start 30 Day Evalation: Sử dụng phiên bản evaluation trong 30 ngày v Get My Purchased License (s): Mua license của Xilinx v Local Existing License (s): chọn tới đường dẫn chứa license có sẵn trong máy tính được cài đặt. Với license có sẵn trong máy tính ta chọn Locate Existing License (s), sau đó chọn Next, khi đó sẽ xuất hiện hộp thoại như hình 5.10. 67 Hình 5.10 - Ta kích vào Copy License, sau đó chọn đến đường dẫn chứa file License như hình 5.11, sau đó nhấn Open để hoàn thành quá trình cài đặt. Hình 5.11 68 Sau khi cài đặt xong, ta kích vào biểu tượng Xilinx ISE Design Suite 12.1 trên màn hình máy tính (hình 5.12a) hoặc vào Start -> All Programs -> Xilinx ISE Design Suite 12.1 -> ISE Design Tool -> Project Navigator (hình 5.12b) để khởi động ISE. (a) (b) Hình 5.12– Khởi động ISE 12.1 Sau khi khởi động ISE sẽ xuất hiện giao diện chương trình ISE với các cửa sổ soạn thảo như hình 5.13. Cửa sổ soạn thảo Cửa sổ thông báo Cửa sổ quản lý source và project Hình 5.13 – Giao diện chương trình ISE 12.1 69 Tạo Project trên ISE Để tạo project trên ISE ta vào File -> New Project, khi đó sẽ xuất hiện hộp thoại như hình 5.14. Hình 5.14 v Tại vùng Name: ta đặt tên của project v Location và Working Directory: tên thư mục chứa project - Sau đó chọn Next, sẽ xuất hiện hộp thoại thiết lập cho project như hình 5.15. - Sau khi đã thiết lập cho project, nếu ta muốn thay đổi thiết lập thì kích chuột phải vào cửa sổ quản lý project và chọn Design Properties. Hình 5.15 – Cửa sổ thiết lập cho project Trong đó: 70 v Family: ta chọn họ linh kiện v Device: chọn tên linh kiện v Package: chọn dạng đóng gói của linh kiện v Speed: chọn tốc độ v Synthesis Tool: chọn công cụ tổng hợp v Simulator: chọn công cụ mô phỏng, có thể sử dụ Isim VHDL/Verilog đã được tích hợp sẵn trong ISE hay công cụ mô phỏng Modelsim. v Preferred Language: ngôn ngữ viết chương trình, ở đây ta viết bằng chương trình Verilog, do đó ta chọn Verilog. - Sau đó kích Next và finish thì quá trình tạo một project hoàn thành như hình 5.16 Hình 5.16 71 - Để add chương trình có sẵn vào project ta kích chuột phải vào cửa sổ quản lý project, sau đó chọn Add Source như hình 5.17. Khi đó sẽ xuất hiện hộp thoại để ta add source chương trình đã tạo ra trước đó vào project. Hình 5.17 – Add source chương trình có sẵn vào project - Để thêm một source chương trình mới vào project ta kích chuột phải vào cửa sổ quản lý project, sau đó chọn New Source. Khi đó sẽ xuất hiện hộp thoại như hình 5.18. Ta đặt tên soure mới vào File name. Hình 5.18 – Thêm new source vào project Trong đó: v IP (CORE Generator & Architecture Wizard): tạo IP CORE có sẵn từ ISE v Schematic: tạo một schematic mới v Verilog Module: tạo một soure chương trình Verilog mới v Verilog Test Fixture: tạo soure chương trình mô phỏng Verilog mới v VHDL Module: Tạo source chương trình VHDL mới 72 v VHDL Test Bench: tạo testbench cho module VHDL Ở đây, ta viết chương trình bằng ngôn ngữ Verilog cho nên ta quan tâm chủ yếu là IP (CORE Generator & Architecture Wizard), Verilog Module và Verilog Test Fixture. - Để tạo Verilog Module mới ta chọn Verilog Module, đặt tên vào ô file name sau đó kích Next, sẽ xuất hiện hộp thoại như hình 5.19 để ta khai báo các ngõ vào ra. Ta kích Next để bỏ qua bước này. Hình 5.19 – Đặt tên ngõ vào ra của new source - Sau đó kích finish thì một source chương trình mới được tạo ra như hình 5.20. Hình 5.20 – Màn hình soạn thảo của new source 73 - Để tạo source chương trình mô phỏng bằng Verilog ta làm tương tự như tạo source chương trình Verilog mới, nhưng thay vì chọn Verilog Module ta chọn Verilog Test Fixture, sau đó chọn Next sẽ xuất hiện hộp thoại như hình 5.21. Ta chọn module cần tạo file mô phỏng (ở đây là soure chương trình a), sau đó kích Next và finish thì một source chương trình mô phỏng cho chương trình a sẽ được tạo ra như hình 5.22. Hình 5.21 Hình 5.22 – Cửa sổ soạn thảo chương trình mô phỏng 74 3.2. Chức năng so sánh 3.2.1. Chức năng dịch chuyển Modelsim là công cụ hỗ trợ mô phỏng của Mentor Graphics Corporation, cho phép mô phỏng kết quả thực thi thiết kế trên ISE, mô tả cho ta thấy dạng sóng, số liệu,của các tín hiệu trong chương trình. Modelsim có nhiều dạng khác nhau như Modelsim SE, Modelsim PE,và mỗi dạng có nhiều phiên bản khác nhau như Modelsim SE 6.1a, Modelsim SE 6.3b, Modelsim SE 6.5a, Modelsim PE 6.1a, Modelsim- pe_student_edition 10.1a,Trong đó Modelsim-pe_student_edition là phiên bản cung cấp license miễn phí cho sinh viên nghiên cứu và học tập (download từ website: Để cài đặt Modelsim-pe_student_edition 10.1a, ta kích đúp vào file chương trình modelsim-pe_student_edition.exe, khi đó chương trình Modelsim-pe_student_edition sẽ bắt đầu được cài đặt (hình 5.23). Hình 5.23 - Bắt đầu cài đặt modelsim-pe_student_edition Sau khi quá trình cài đặt được khởi tạo, sẽ xuất hiện hộp thoại như hình 5.24, ta chọn Next để tiếp tục quá trình cài đặt. 75 Hình 5.24 Sau khi chọn Next sẽ xuất hiện hộp thoại như hình 5.25, ta tiếp tục chọn Yes để tiếp tục quá trình cài đặt. Hình 5.25 76 Sau khi chọn Yes, sẽ xuất hiện hộp thoại như hình 5.26, hộp thoại này cho phép ta thay đổi đường dẫn chứa chương trình cài đặt. Sau khi thay đổi xong ta chọn Next. Hình 5.26 – Chọn đường dẫn chứa chương trình cài đặt - Chọn Next Hình 5.27 77 - Sau khi chọn Next, chương trình chính bắt đầu được cài đặt như hình 5.28, ta đợi cho đến khi chương trình cài đặt được hoàn thành. Hình 5.28 - Sau khi quá trình cài đặt hoàn thành, chương trình hỏi ta có tạo Shortcut trên desktop không (hình 5.29) , nếu ta muốn tạo thì chọn Yes, còn không muốn tạo thì chọn No. Hình 5.29 78 - Chọn Yes để add đường dẫn cho chương trình modelsim vừa được cài đặt (hình 5.30). Hình 5.30 – Add đường dẫn cho modelsim - Sau khi add đường dẫn xong, ta chọn finish để kết thúc quá trình cài đặt modelsim, đồng thời tại thời điểm đó chương trình sẽ dẫn đường link tới website của Mentor Graphics Corporation để ta điền thông tin yêu cầu license. Hình 5.31 – Kết thúc cài đặt và yêu cầu license Sau khi đã nhận được license qua email, ta copy license vào thư mục chương trình modelsim vừa cài đặt, sau đó thiết lập môi trường biến và license cho modelsim theo các bước như sau: 79 v Kích chuột phải vào My computer, chọn Properties (hình 5.32). Hình 5.32 v Sau khi hộp thoại System Properties xuất hiện, ta vào Advanced, chọn Enviroment Variables (hình 5.33). Hình 5.33 80 v Từ hộp thoại Enviroment Variables ta chọn New (hình 5.34), sau đó: - Tại vùng Variable name: ta điền: LM_LICENSE_FILE - Tại vùng Variable value: ta chọn đường dẫn tới file license đã nhận trước đó. - Sau đó nhấn Ok để kết thúc việc thiết lập license. Hình 5.34 Chú ý là, để yêu cầu và nhận được license qua email, thì trong quá trình cài đặt máy tính phải được kết nối internet. Sau khi cài đặt xong modelsim, ta có thể khởi động modelsim bằng nhiều cách khác nhau: v Ta vào: Start -> All Program -> Modelism PE Student Edition 10.1a -> Modelsim v Khởi động modelsim bằng cách kích vào biểu tượng của modelsim trên desktop (hình 5.35) Hình 5.35 – Biểu tượng Modelsim trên desktop v Khởi động modelsim bằng cách link từ ISE 3.2.2. Chức năng chuyển đổi( Converter) Mô phỏng trên ISE: Phần mềm ISE cung cấp cho ta một công cụ hỗ trợ mô phỏng tích hợp sẵn trong ISE là Isim (VHDL/Verilog). 81 Để thiết lập link mô phỏng gọi chương trình ISim có sẵn trong ISE, ta khởi động ISE lên, sau đó kích chuột phải vào cửa sổ quản lý project chọn Design Properties, khi đó một cửa sổ mới được mở ra như hình 5.36. Hình 5.36 – Thiết lập cho project Tại mục Simulator ta chọn ISim (VHDL/Verilog), sau đó nhấn ok. Để bắt đầu quá trình mô phỏng, trên ISE ta chọn Simulation, sau đó chọn file chương trình cần mô phỏng như hình 5.37. 82 Hình 5.37 – Chọn file cần mô phỏng Sau khi chọn file chương trình cần mô phỏng, ta kích đúp vào biểu tượng mô phỏng Simulate Behavioral Model trong cửa sổ Processes để gọi chương trình mô phỏng ISim như hình 5.38. Hình 5.38 – Gọi chương trình mô phỏng Sau khi gọi chương trình mô phỏng ISim, cửa sổ giao diện chương trình ISim sẽ được mở lên với các các vùng soạn thảo như hình 5.39. 83 Giá trị của tín hiệu hiện thời Vùng lệnh Vùng quản lý source Dạng sóng của tín hiệu mô phỏng Vùng quản lý tên của tín hiệu Hình 5.39 – Giao diện chương trình ISim Vùng quản lý Source: cho phép ta truy cập vào nội dung của source chương trình. Để đọc nội dung của một source chương trình, ta kích đúp vào tên của source chương trình cần đọc thì nội dung của source đó sẽ hiện ra (hình 5.40). Hình 5.40 – Đọc nội dung của source chương trình 84 Vùng quản lý tên của tín hiệu (Name), vùng giá trị hiện thời của tín hiệu (Value) và vùng dạng sóng của tín hiệu mô phỏng cho phép ta theo dõi, phân tích và thao tác trên dạng sóng của tín hiệu. Để copy, xóa, cắt hay sửa lại tên của tín hiệu nào thì ta kích chuột phải vào tên hay dạng sóng của tín hiệu đó như hình 5.41. Trong đó: - Cut: cho phép ta cắt tín hiệu - Copy: cho phép copy tín hiệu - Delete: cho phép xóa tín hiệu - Rename: sửa tên của tín hiệu Hình 5.41 – Thao tác trên dạng sóng của tín hiệu Khi khởi tạo mô phỏng, thì mặc định dữ liệu sẽ được hiện dưới dạng kiểu dữ liệu nhị phân, để thay đổi kiểu dữ liệu của tín hiệu nào ta kích chuột phải vào tín hiệu đó, sau đó chọn Radix, khi đó sẽ xuất hiện một danh sách các kiểu dữ liệu để ta lựa chọn như hình 5.42. 85 Trong đó: - Binary: kiểu nhị phân - Hexadecimal: kiểu thập lục phân - Unsigned Decimal: kiểu thập phân không dấu - Signed Decimal: kiểu thập phân có dấu - Octal: kiểu octal - ASCII: kiểu mã ASCII Hình 5.42 – Chọn kiểu dữ liệu cho tín hiệu Mặc định, khi khởi tạo thì màu sắc của tất cả các dạng sóng là giống nhau. Do đó, nếu trong quá trình mô phỏng có nhiều dạng sóng thì vấn đề quan sát trở nên khó khăn, vì vậy ISim cho phép ta thay đổi màu sắc của dạng sóng để dễ dàng quan sát hơn. Để thay đổi màu của dạng sóng, ta kích chuột phải vào dạng sóng cần quan sát, sau dó chọn Signal Color, khi đó sẽ hiện ra một danh sách các màu sắc để ta lựa chọn như hình 5.43. Hình 5.43 – Thay đổi màu sắc của dạng sóng tín hiệu 86 Trong quá trình quan sát dạng sóng, nếu có quá nhiều dạng sóng, lúc đó ta muốn quan sát dạng sóng nào thì ta kích chuột phải vùng quản lý tên dạng sóng và chọn Find (hình 5.44a), sau đó gõ tên dạng sóng cần quan sát vào vùng Find, sau đó nhấn enter sẽ hiện ra dạng sóng mà ta cần tìm (hình 5.44b). (a) (b) Hình 5.44 – Tìm dạng sóng Để biết được tín hiệu mà ta đang quan sát được xử lý ở đâu trong chương trình thì ta kích chuột phải vào dạng sóng đó (hình 5.45a) sau đó chọn Go To Source Code, khi đó chương trình sẽ chỉ tới tín hiệu mà ta cần biết xử lý ở đâu trong chương trình (hình 5.45b). (a) (b) Hình 5.45 – Link từ dạng sóng tới chương trình 87 Đối với những tín hiệu nhiều bit, khi đó trạng thái mà ta quan sát được là giá trị của nhiều bit. Để quan sát giá trị của từng bit ta kích vào tín hiệu đó như hình 5.46. Hình 5.46 – Quan sát giá trị của từng bit Trong trường hợp ta chưa quan sát được trạng thái của dạng sóng mà ta cần quan sát do thời gian của mô phỏng ngắn hơn thời điểm trạng thái đó xuất hiện, lúc đó để quan sát trạng thái này, ta vào Simulation chọn Run All (hình 5.47a), sau đó muốn ngừng mô phỏng lúc nào ta vào Simlation và chọn break (hình 5.47b). (a) (b) Hình 5.47 – (a): Chạy mô phỏng Run All, (b): Ngừng mô phỏng 88 Nếu ta không muốn chạy mô phỏng Run All, thì ta chạy mô phỏng theo từng bước cho đến khi có được số liệu mà ta cần quan sát. Để chạy mô phỏng từng bước ta vào Simulation và chọn Step hoặc Run như hình 5.48. Hình 5.48 – Chạy mô phỏng từng bước Để chia dạng sóng thành những khoảng thời gian nhỏ đều nhau, ta chọn Add Marker, khi đó tín hiệu sẽ được chia thành các khoảng thời gian nhỏ đều nhau như hình 5.49(a). Trong quá trình quan sát, nếu ta muốn xóa Add Marker nào ta kích chuột phải vào Add Marker đó và chọn Delete Marker (hình 5.49b), còn nếu muốn xóa hết Add Marker thì ta chọn Delete All Markers (hình 5.49b). (a) (b) Hình 5.49 – Chia tín hiệu quan sát thành các khoảng thời gian bằng nhau 89 Khi ta muốn nới rộng dạng sóng quan sát ở vùng nào, ta kéo và giữ chuột giữa ở vùng đó (hình 5.50a), khi đó dạng sóng ở vùng đó sẽ được nới rộng ra hình (5.50b). (a) (b) Hình 5.50 – Nới rộng dạng sóng Ngoài ra ISim còn hỗ trợ nhiều chức năng khác nữa như; zoom in, zoom out,..và một số chức năng khác để thao tác trên dạng sóng như những phần mềm khác. Mô phỏng trên modelsim: Để thiết lập link mô phỏng gọi chương trình modelism_pe_student, ta khởi động ISE lên, sau đó kích chuột phải vào cửa sổ quản lý project chọn Design Properties, khi đó một cửa sổ mới được mở ra như hình 5.51. 90 Hình 5.51 – Thiết lập chọn chương trình mô phỏng Tại mục Simulator ta chọn Modelsim_PE Verilog sau đó nhấn ok. Để bắt đầu quá trình mô phỏng, trên ISE ta chọn Simulation, sau đó chọn file chương trình cần mô phỏng như hình 5.52. Hình 5.52 – Chọn file cần mô phỏng Sau khi chọn file chương trình cần mô phỏng, ta kích đúp vào biểu tượng mô phỏng Simulate Behavioral Model trong cửa sổ Processes để gọi chương trình mô phỏng modelsim_pe_student như hình 5.53. Hình 5.53 – Gọi chương trình mô phỏng 91 Sau khi gọi chương trình mô phỏng modelim_pe_student, cửa sổ giao diện chương trình modelsim_pe_student sẽ được mở lên với các các vùng soạn thảo như hình 5.54. Vùng lệnh Vùng quản lý source Dạng sóng của tín hiệu mô phỏng Vùng quản lý tên của tín hiệu Vùng quản lý dạng sóng Vùng hiển thị tín hiệu I/O và các tín hiệu khác Giá trị hiện thời của tín hiệu Vùng hiển thị source chương trình Hình 5.54 – Giao diện chương trình modelsim_pe_student Vùng quản lý Source: cho phép ta truy cập vào nội dung của source chương trình. Để đọc nội dung của một source chương trình, ta kích đúp vào tên của source chương trình cần đọc thì nội dung của source đó sẽ hiện ra ở vùng hiển thị source chương trình như hình 5.55. Hình 5.55 – Đọc nội dung của source chương trình 92 Vùng quản lý tên của tín hiệu, vùng giá trị hiện thời của tín hiệu và vùng dạng sóng của tín hiệu mô phỏng cho phép ta theo dõi, phân tích và thao tác trên dạng sóng của tín hiệu. Để copy, xóa, cắt hay sửa lại tên của tín hiệu nào thì ta kích chuột phải vào tên hay dạng sóng của tín hiệu đó sau đó chọn Edit như hình 5.56. Trong đó: - Cut: cho phép ta cắt tín hiệu - Copy: cho phép copy tín hiệu - Delete: cho phép xóa tín hiệu - Paste: dán tín hiệu đã cắt hoặc copy Hình 5.56 – Thao tác trên dạng sóng của tín hiệu Khi khởi tạo mô phỏng, thì mặc định dữ liệu sẽ được hiện dưới dạng kiểu dữ liệu nhị phân, để thay đổi kiểu dữ liệu của tín hiệu nào ta kích chuột phải vào tín hiệu đó, sau đó chọn Radix, khi đó sẽ xuất hiện một danh sách các kiểu dữ liệu để ta lựa chọn như hình 5.57. 93 Trong đó: - Binary: kiểu nhị phân - Octal: kiểu dữ liệu octal - Decimal: kiểu thập phân có dấu - Hexadecimal: kiểu thập lục phân - Unsigned: kiểu thập phân không dấu - ASCII: kiểu mã ASCII - Time: kiểu time Hình 5.57 – Chọn kiểu dữ liệu cho tín hiệu Mặc định, khi khởi tạo thì màu sắc của tất cả các dạng sóng là giống nhau. Do đó, nếu trong quá trình mô phỏng có nhiều dạng sóng thì vấn đề quan sát trở nên khó khăn, vì vậy modelsim cho phép ta thay đổi màu sắc của dạng sóng để dễ dàng quan sát hơn. Để thay đổi màu của dạng sóng, ta kích chuột phải vào dạng sóng cần quan sát, sau đó chọn Properties như hình 5.58a, khi đó sẽ xuất hiện hộp thoại như hình 5.58b. Từ hộp thoại này, trong vùng Wave Color, ta chọn Colors sẽ hiện ra danh sách bảng màu để ta chọn màu sắc cần thay đổi, còn muốn thay đổi màu của tên dạng sóng thì trong vùng Name Colors ta chọn Color để thay đổi màu của tên dạng sóng. (a) (b) 94 Hình 5.58 – Thay đổi màu sắc của dạng sóng tín hiệu Để quan sát dạng sóng ở dạng tín hiệu analog thì ta kích chuột phải vào tên dạng sóng, sau đó chọn Format -> Analog như hình 5.59. Để quay lại dạng sóng dưới dạng tín hiệu số ta chọn Literal. Chú ý là tín hiệu 1 bit không quan sát được dưới dạng tín hiệu analog. Hình 5.59 – Lựa chọn quan sát tín hiệu dưới dạng số hoặc tương tự Trong quá trình quan sát dạng sóng, nếu có quá nhiều dạng sóng, lúc đó ta muốn quan sát dạng sóng nào thì ta sử dụng công cụ tìm kiếm dạng sóng đó. Để tìm kiếm dạng sóng, ta vào Edit -> Find, khi đó sẽ xuất hiện ô tìm kiếm dạng sóng như hình 5.60, ta gõ tên dạng sóng cần tìm thì chương trình sẽ link tới tên dạng sóng đó 95 Hình 5.60 – Tìm dạng sóng Đối với những tín hiệu nhiều bit, khi đó trạng thái mà ta quan sát được là giá trị của nhiều bit. Để quan sát giá trị của từng bit ta kích vào tín hiệu đó như hình 5.61 96 Hình 5.61 – Quan sát giá trị của từng bit Trong trường hợp ta chưa quan sát được trạng thái của dạng sóng mà ta cần quan sát do thời gian của mô phỏng ngắn hơn thời điểm trạng thái đó xuất hiện, lúc đó để quan sát trạng thái này, ta vào Simulation ->Run-> Run All (hình 5.62a), sau đó muốn ngừng mô phỏng lúc nào ta sẽ vào Simlation và chọn break (hình 5.62b). (a) (b) Hình 5.62 – (a): Chạy mô phỏng Run All, (b): Ngừng mô phỏng 97 Trong trường hợp sau khi ngừng mô phỏng, ta muốn chạy tiếp chương trình mô phỏng ta vào Simulation - >Run-> Run All và chọn Continue. Hình 5.63 – Chạy tiếp chương trình mô phỏng Nếu ta không muốn chạy mô phỏng Run All, thì ta chạy mô phỏng theo từng bước cho đến khi có được số liệu mà ta cần quan sát. Để chạy mô phỏng từng bước ta vào Simulation và chọn Run 100 hoặc Run-Next như hình 5.64. Hình 5.64 – Chạy mô phỏng từng bước Để phân chia dạng sóng thành những khoảng khác nhau, ta kích vào Insert Cursor (hình 5.65) khi đó các cursor được thêm vào như hình 5.65. Trong trường hợp muốn xóa các cursor thì ta kích vào Delete Cursor. 98 Hình 5.65 – Chia dạng sóng thành các khoảng khác nhau Khi ta muốn nới rộng dạng sóng quan sát ở vùng nào, ta giữ và kéo chuột giữa ở vùng đó (hình 5.66a), khi đó dạng sóng ở vùng đó sẽ được nới rộng ra hình (5.66b). (a) (b) Hình 5.66 – Nới rộng dạng sóng Để đọc dữ liệu của một tín hiệu trong quá trình thực thi mô phỏng thì ta kích chuột phải vào dạng sóng chọn Add -> To List -> Selected Items như hình 5.67. 99 Hình 5.67 – Đọc dữ liệu của tín hiệu Khi đó sẽ xuất hiện hộp thoại List – Default (hình 5.68) hiển thị các giá trị của tín hiệu trong quá trình mô phỏng. Hình 5.68 – Đọc dữ liệu của tín hiệu mô phỏng 100 Để biết tín hiệu mình đang xử lý ở trong Dataflow thì ta kích chuột phải vào dạng sóng và chọn Add -> To Dataflow -> Selected Items như hình 5.69. Hình 5.69 – Lựa chọn tín hiệu tới Dataflow Khi đó cửa sổ Dataflow được mở ra, hiển thị cho ta biết tín hiệu mà chúng ta muốn biết trong Dataflow như hình 5.70. Hình 5.70 – Hiển thị tín hiệu trong Dataflow 101 Để hiển thị toàn bộ tín hiệu và sơ đồ kết nối schematic từ chương trình mà ta đã viết, thì ta chọn toàn bộ tín hiệu, sau đó vẫn chọn Add -> To Dataflow -> Selected Items như ở bước trên, thì toàn bộ tín hiệu và kết nối schematic từ chương trình mà ta đã viết xuất hiện như hình 5.71. Hình 5.71 – Hiển thị tất cả các tín hiệu và schematic trong Dataflow Dataflow cũng chính là nơi chỉ ra cho ta thấy sơ đồ mạch điện thiết kế của chương trình mà ta đã viết. Để hiển thị dạng sóng trong cửa sổ Dataflow, ta chọn Show Wave như hình 5.72. Hình 5.72 chọn Show Wave trong Dataflow Khi đó, trong cửa sổ Dataflow sẽ hiển thị dạng sóng mô phỏng như hình 5.73. 102 Hình 5.73 – Hiển thị dạng sóng trong Dataflow Trong cửa sổ Dataflow, khi ta kích vào chân tín hiệu hay một khối trong schematic thì trong vùng quản lý dạng sóng sẽ link tới tín hiệu hay khối đó và ngược lại. Để tao tác hiển thị toàn bộ hay một phần schematic trong Dataflow ta có thể thực hiện các công cụ thao tác như trong hình 5.74. Thao tác để hiển thị toàn bộ hay một phần sơ đồ mạch Hình 5.74 – Thao tác để hiển thị toàn bộ hay một phần mạch trong Dataflow 103 Để xuất tín hiệu ra dưới dạng file ảnh, thì ta vào Edit -> Export -> Image, khi đó một hộp thoại xuất hiện như hình 5.75, ta điền tên cần lưu vào ô File name, và chọn nơi để lưu phai ảnh, sau đó nhấn Save. Hình 5.75 – Xuất dạng sóng ra file ảnh Để xem và biết các khối lệnh, thanh ghi,đã sử dụng trong chương trình, thì trong modelsim ta chọn Capacity, khi đó cửa sổ Capacity sẽ hiện ra cho ta thấy số lượng các khối lệnh, thanh ghi,đã sử dụng trong chương trình như hình 5.76 Hình 5.76 – Cửa sổ Capacity 104 Để tao tác các bước mô phỏng, ngừng mô phỏng,..trước đó thì ta có thể vào của sổ quản lý lệnh như hình 5.77, sau đó dùng phím di chuyển lên xuống trên bàn phím để chọn lệnh sau đó nhấn enter thì chương trình sẽ được thực thi. Hình 5.77 – Gọi lệnh từ cửa sổ lệnh trong modelsim Ngoài những thao tác trong việc sử dụng phần mềm modelsim như đã trình bày ở trên, thì modelsim còn hỗ trợ nhiều chức năng và nhiều phím tắt khác,người học có thể khai thác thêm trên phần mềm modelsim. 3.3. Đồng hồ thời gian Trong giai đoạn Translate, thì Netlist của chương trình được biên dịch thành dạng EDIF (Electronic Device Interchangeable Format) hoặc định dạng NGC (một định dạng netlist riêng của Xilinx), sau đó kết hợp với hai file quy định ràng buộc của thiết kế. v NFC (Native Constraint File): chứa những thông tin vật lý về thời gian, tốc độ, các tham số vật lý ký sinh,của chip FPGA là đối tượng sẽ tiến hành cấu hình. v UCF (User Contraint File): chữa những ràng buộc yêu cầu từ phía người dùng thiết kế với vi mạch của mình. UCF được xem là một phần quan trọng trong thiết kế, nếu như mô tả chức năng chỉ qui định mạch định làm gì thì trong file UCF sẽ chứa những yêu cầu đòi hỏi về tốc độ (timing contraint) cũng như mức độ sử dụng tài nguyên. Các yêu cầu này là cơ sở cho các quá trình biên dịch trong ISE tối ưu hóa thiết kế. Để có thể viết được những yêu cầu này thì người thiết kế trước hết phải rất hiểu thiết kế của mình, chẳng hạn như trong thiết kế có dùng những tín hiệu xung nhịp như thế nào, khu vực tổ hợp nào có khả năng gây ra thời gian trễ nhất và ước tính được giá trị của độ trễ. Việc gán chân trong FPGA do người dùng thiết kế, do đó trong file UCF có chứa các qui định về việc gán chân tương thích với thiết bị. Cách gán chân này phụ thuộc vào từng loại FPGA và từng mạch ứng dụng FPGA cụ thể. Việc gán chân trong Verilog được thực hiện theo cấu trúc câu lệnh như sau: (*LOC = “Chân thiết bị”*) loại_tín_hiệu tên_tín_hiệu; Trong đó: v Chân thiết bị: là chân của FPGA thực tế 105 v Loại tín hiệu: là tín hiệu ngõ vào (input), ngõ ra (output) hay tín hiệu vào/ra (inout). v Tên tín hiệu: là tên mà người thiết kế đặt trong module. Chú ý là, nếu tín hiệu có bao nhiêu bit thì số chân phải được gán tương ứng bằng với số bit của tín hiệu. Tên của chân ta được phép gán tùy ý theo cấu hình chân của FPGA được dùng trong thiết kế. Để hiểu rõ hơn việc gán chân cho FPGA ta xem xét ví dụ sau: Ví dụ: module tichhop_led (clk, dem); (*LOC = "P78"*) input clk; //--- gán chân P78 cho tín hiệu clk -- -- (* LOC ="P129,P128,P127,P126,P123,P122,P120,P119"*) output [7:0] dem; //-------gán các chân P129, P128, P127, P126, P123, P122, // P120, P119 //-------cho tín hiệu “dem” có 8 ngõ vào---------------------- - reg clk1; reg [7:0] dem; reg [3:0] dem1; reg [3:0] dem2; integer N; always @ (posedge clk) begin begin if (N<1000000) begin clk1=clk1; N=N+1; end else begin clk1=~clk1; N=0; if(dem1==9) begin dem1=0; 106 if(dem2==9) dem2=0; else dem2= dem2+1; end else begin dem1= dem1+1; dem2=dem2; end end end dem ={dem1,dem2}; end endmodule Trong ví dụ trên, tín hiệu “clk” được gán với chân “P78”, tín hiệu “dem [7:0]” có 8 bit, do đó được gán tương ứng với các chân “P129, P128, P127, P126, P123, P122, P120, P119”. Trong đó tín hiệu “dem” tại vị trí bit thứ 8, tức là “dem[7]” được gán với chân “P129”,, và tín hiệu “dem” tại vị trí bit thứ nhất, tức là “dem[0]” được gán với chân “P119”. Việc gán này là do tùy ý người thiết kế, nếu ta không thích gán bit “dem[7]” với chân “P129” thì ta có thể gán với chân khác. Tín hiệu clock được gán tùy ý, nhưng FPGA có hỗ trợ các chân clock thì ta nên gán các tín hiệu clock với các chân clock mà FPGA hỗ trợ để hệ thống hoạt động tốt hơn. 107 BÀI 4:LẮP ĐẶT MÔ HÌNH ĐIỀU KHIỂN BẰNG LẬP TRÌNH CỠ NHỎ Mục tiêu: - Phân tích qui trình công nghệ của một số mạch máy sản xuất. - Lập trình được một số mạch ứng dụng thường gặp trong thực tế. - Nạp chương trình, vận hành và kiểm tra mạch hoạt động theo yêu cầu kỹ thuật - Chủ động, sáng tạo và đảm bảo an toàn trong quá trình học tập. Nội dung chính: 4.1. Giới thiệu Trong một thời gian dài, các ngôn ngữ lập trình như Pascal, C,thường được dùng để thực hiện các chương trình máy tính, và chúng đã phát triển một cách kỳ điệu. Tương tự thế, trong lĩnh vực hệ thống số, các nhà thiết kế cảm thấy cần phải có một ngôn ngữ chuẩn để mô tả các mạch số, chính vì vậy mà ngôn ngữ mô tả phần cứng HDL (Hardware Description Languages) ra đời. Ngôn ngữ mô tả phần cứng HDL là ngôn ngữ lập trình mềm dùng để mô tả hoạt động mong muốn của phần cứng. HDL tạo điều kiện để mô tả phần cứng ở mức hành vi trừu tượng và mô hình cấu trúc phần cứng. Trong mô hình hành vi trừu tượng, ngôn ngữ mô tả phần cứng tạo điều kiện để dễ dàng cho việc mô tả trừu tượng hành vi của phần cứng đối với các mục đích đặc tả (chỉ rõ chi tiết kỹ thuật). Hành vi này không bị chi phối bởi các khía cạnh cấu trúc hoặc thiết kế của ý định phần cứng. Mô hình cấu trúc phần cứng có khả năng được mô hình hóa trong ngôn ngữ mô tả phần cứng mà không cần quan tâm đến hành vi của thiết kế. Hành vi của phần cứng có thể được mô hình và được miêu tả ở mức trừu tượng khác nhau trong suốt quá trình thiết kế. Các mô hình mức cao mô tả một cách trừu tượng hoạt động của phần cứng, trong khi đó các mô hình mức càng thấp sẽ bao gồm càng nhiều chi tiết hơn, chẳng hạng như suy ra được cấu trúc của phần cứng. Với HDL các nhà thiết kế mạch ngày nay trở thành các nhà lập trình để tạo ra các IC chuyên dụng, rút ngắn thời gian để thiết kế một IC chuyên dụng. Cách nối dây HDL có nhiều ưu điểm so với kiểu thiết kế mạch truyền thống: 108 v Các thiết kế có thể được mô tả một cách rất trừu tượng bằng cách sử dụng HDL. Các nhà thiết kế có thể viết mô tả RTL mà không cần lựa chọn một đặc tính công nghệ sản xuất nào, vì các công cụ tổng hợp logic có thể tự động chuyển đổi thiết kế qua một công nghệ sản xuất bất kỳ theo yêu cầu. Nếu một công nghệ mới xuất hiện, các nhà thiết kế cũng không cần thiết kế lại mạch của họ. Họ dễ dàng đưa mô tả RTL vào công cụ tổng hợp logic và tạo ra một netlist mức cổng mới, sử dụng đặc tính công nghệ sản xuất mới. Công cụ tổng hợp logic sẽ tối ưu mạch điện trong phạm vi điều chỉnh phù hợp với công nghệ mới. v Bằng cách thiết kế với HDL, chức năng kiểm tra thiết kế có thể diễn ra sớm hơn trong chu trình thiết kế. Từ khi người thiết kế làm việc ở mức RTL, họ đã có thể tối ưu và thay đổi mô tả RTL cho đến khi nó đạt được mức chức năng mong muốn. Hầu hết các lỗi thiết kế được giới hạn tại điểm này, điều này có ý nghĩa làm giảm thời gian của chu kỳ thiết kế bởi vì xác suất gặp lỗi sau thời điểm tạo netlist hoặc layout vật ý là rất nhỏ. v Việc thiết kế với HDL tương tự như chương trình máy tính. Một mô tả văn bản với các đoạn giải thích làm cho việc phát triển và sửa lỗi mạch dễ dàng hơn. Nó cũng tạo nên một hình dung của thiết kế, so sánh với sơ đồ mạch mức cổng. Nền tảng của thiết kế HDL đã có, cùng với sự tăng nhanh độ phức tạp của các mạnh điện và công cụ EDA tinh vi, HDL bây giờ là phương thức tối ưu cho các thiết kế số lớn, hầu như không một nhà thiết kế mạch số nào bỏ qua nền tảng thiết kế HDL. 4.3. Các mô hình và bài tập ứng dụng 4.3.1. Điều khiển van điện từ 2 cuộn dây a. Lời giải thích: Các chú thích được đưa vào với mục đích giải thích các câu lệnh, hay chỉ rõ mục đích, nhằm tăng tính dễ đọc, dễ sửa lỗi và phát triển chương trình. Có hai cách viết chú thích. v Cách 1: Chú thích được viết trên một hàng thì bắt đầu với ký hiệu “ // ” và lời chú thích v Cách 2: Chú thích trên nhiều hàng thì bắt đầu chú thích với ký hiệu “/*” và kết thúc với ký hiệu “ */ ” Ví dụ: // chú thích trên một hàng /* chú thích trên nhiều hàng */ b. Hằng số: Có hai kiểu viết hằng số trong Verilog là sized và unsized. 109 Hằng số kiểu sized: khai báo hằng số kiểu sized thì ta quan tâm đến tầm giá trị của hằng số. Có thể coi hằng số có kiểu sized như hằng số có kiểu. Dạng biểu diễn: ‘ Trong đó: v : được biểu diễn dưới dạng số thập phân để chỉ số bit tối đa của hằng số. v : chỉ hệ cơ số v : Chứa giá trị hằng số và phải phù hợp với <base format> Ví dụ: 4’b1111; //đây là số nhị phân 4 bit 12’habc; //đây là số thập lục phân 12 bit 16’d255; // đây là số thập phân 16 bit Hằng số kiểu unsized: Khai náo hằng số kiểu unsized thì không quan tâm đến tầm giá trị của hằng số. Ta có thể coi hằng số kiểu unsized như hằng số không có kiểu. Dạng biểu diễn: ‘ Nếu không có thì ngầm định là thập phân. Do không khai báo nên số bit tối đa phụ thuộc vào trình mô phỏng, trình biên dịch và có giá trị bit tối thiểu là 32 bit. Ví dụ: 23456; // đây là số thập phân 32 bit ‘hc3; // đây là số hex 32 bit ‘o21; // đây là số octan 32 bit c. Giá trị tùy định và tổng trở cao: Verilog có hai ký hiệu biểu diễn giá trị tùy định và tổng trở cao, là những giá trị quan trọng trong thiết kế mạch số: Giá trị tùy định ký hiệu là “ x ”, và giá trị tổng trở cao ký hiệu là “ z ”. Ví dụ: 12’h13x; //đây là số hex 12 bit, 4 bit thấp có giá trị tùy định 2’bzz; //đây là số nhị phân 2 bit có giá trị tổng trở cao d. Số âm: Số âm có thể được biểu diễn bằng cách đặt một dấu trừ phía trước trị số chỉ kích thước. Các hằng số kích thước luôn luôn dương. Giá trị không hợp lệ khi ta đặt dấu trừ giữa và . Ví dụ: -6’d3; //số âm 3 110 -4’d-2; //cách biểu diễn không hợp lệ e. Chuỗi ký tự: Là một loạt các ký tự nằm trong dấu ngoặc kép “ ”. Chuỗi phải nằm trong một hàng và không chứa ký tự Enter. Các ký tự trong chuỗi có thể là mã thoát, chuỗi được xử lý như các giá trị liên tục trong bảng mã ASCII. f. Kí tự gạch dưới và dấu hỏi: Một kí tự gạch dưới “-” được chấp nhận bất kỳ đâu trong một số ngoại trừ ký tự đầu tiên. Ký tự gạch dưới được cho vào dùng để tăng tính dễ đọc của các con số và được bỏ đi trong trình biên dịch của Verilog. Một dấu chấm hỏi “?” trong Verilog được sử dụng thay cho z trong biểu diễn số. Ví dụ: 12’b1111_0000_1100; //dùng thêm các ký tự gạch dưới cho dễ đọc 4’b10?? ; //tương dươi với 4’b10zz 4.3.2. Điều khiển hệ thống cung cấp khí nén. a. Giá trị thiết lập: Trong Verilog hỗ trợ bốn giá trị (bảng 6.1) và tám mức độ mạnh để mô tả các chức năng của phần cứng thực. Bảng 6.1: Các giá trị thiết lập 0 Mức không, hoặc điều kiện không thỏa 1 Mức một, hoặc điều kiện đúng X Giá trị tùy định Z Trạng thái tổng trở cao, hoặc trạng thái động Tám mức thường được sử dụng để giải quyết xung đột giữa các tín hiệu khác nhau trong mạch số. Giá trị 0 và 1 có thể có thêm mức độ ưu tiên theo bảng 6.2. Bảng 6.2: Các mức ưu tiên Mức ưu tiên Độ ưu tiên 111 Mức ưu tiên Loại Cao nhất Supply Driving Strong Driving Pull Driving Large Storage Weak Driving Medium Storage Small Storage hightz High Impedance Thấp nhất Hai tín hiệu có mức độ ưu tiên cùng điều khiển một đường dây, tín hiệu có độ ưu tiên cao sẽ được chọn. Ví dụ, nếu hai tín hiệu có độ ưu tiên là strong1 và weak0 xung đột, kết quả được giải quyết là strong1. Nếu hai tín hiệu có mức ưu tiên bằng nhau, thì kết quả là không xác định. b. Kiểu net: Dùng để mô tả sự kết nối trong các mạch phần cứng thực. Kiểu net thực sự là tên của các đường kết nối trong mạch. Kiểu net thường được khai báo bằng từ khóa wire. Giá trị mặc định là z và có độ rộng là 1 bit. Chú ý là net không phải là từ khóa, mà là một lớp dữ liệu như wire, wand, wor, tri, triand, trior, trireg,trong đó, wire được sử dụng thường xuyên nhất wire Ví dụ: wire a; //khai báo dây a trong mạch c. Kiểu reg: Biến kiểu reg dùng để lưu trữ giá trị như một thanh ghi. Giá trị được lưu trữ cho đến khi có giá trị khác ghi đè lên nó. Không được nhầm lẫn kiểu thanh ghi trong Verilog với các thanh ghi phần cứng trong mạch thực. Trong Verilog, thanh ghi có nghĩa là một biến lưu dữ liệu, không cần xung clock như thanh ghi phần cứng. Giá trị các thanh ghi có thể thay đổi bất kì lúc nào. Các kiểu thanh ghi thông thường được khai báo bởi từ khóa reg. Giá trị mặc định là x, độ rộng mặc định là 1 bit. reg ; 112 Ví dụ: reg a; //khai báo biến a để lưu dữ liệu initial begin a = 1’b1; //cho biến a lưu giá trị 1 #100 a = 1’b0; //sau 100 đơn vị thời gian cho a lưu giá trị 0 end d. Kiểu Vector: Net và reg có thể được khai báo như một vector (độ rộng nhiều bit). Biến kiểu vector khai báo dạng sau [MSB:LSB], bit có trọng số cao nhất luôn luôn nằm bên trái ngoặc vuông. [MSB:LSB] ; Ví dụ: wire [7:0] a; //khai báo biến a kiểu net với độ rộng 8 bit reg [9:0] b; //khai báo biến b kiểu reg với độ rộng 10 bit e. Kiểu mảng: Mảng là một biến cấu trúc trong đó có nhiều phần tử cùng kiểu, mỗi phần tử là một biến của mảng. Mỗi biến thành phần này là một biến bình thường và chỉ để phân biệt giữa phần tử này với phần tử kia. Như vậy, để truy xuất tới một phần tử của mảng ta cần biết được chỉ số của nó. Verilog chỉ cho phép biến mảng có kiểu là reg, integer, time, real, realtime và vector. Verilog chỉ cho phép định nghĩa mảng một chiều, số phần tử trên một chiều gọi là kích thước của chiều đó. [MSB:LSB] ; Ví dụ: reg [7:0] port_a [0:7]; /* khai báo kiểu mảng có 8 phần tử, mỗi phần tử có độ rộng 8 bit */ integer counter [0:7]; /* khai báo kiểu mảng có 8 phần tử, mỗi phần tử có độ rộng 1 bit */ counter [4]; //truy suất phần tử thứ 5 của mảng counter f. Các kiểu dữ liệu Real, Integer và Time Register: Integer là kiểu dữ liệu thường được dùng cho việc đếm. Các biến được khai báo bằng từ khóa integer. Mặc dù có thể sử dụng reg theo cách tương tự, nhưng sẽ thuận lợi hơn nếu sử dụng integer cho mục đích đếm, mặc định độ 113 rộng của integer phụ thuộc vào độ rộng đơn vị nhớ của hệ thống, ít nhất là 32 bit. integer ; Ví dụ: integer counter; //mục đích thông thường sử dụng trong bộ đếm Real là các biến số thực được khai báo bằng từ khóa real, các biến số thực không có giới hạn, giá trị mặc định là 0. Khi giá trị biến được chuyển sang dạng số nguyên, số thực được làm tròn đến giá trị số nguyên nhỏ nhất. real ; Ví dụ: real a; //khai báo biến số thực a initial begin a = 4e10; //a được gán giá trị theo số mũ a = 2.13; //a được gán giá trị 2.13 end Time là một kiểu dữ liệu đặc biệt dùng để khai báo biến kiểu thời gian. Một biến thời gian được khao báo bằng từ khóa time. Độ rộng của biến ít nhất là 64 bit. Hàm chức năng $time được dùng để lấy thời gian mô phỏng tức thời. time ; Ví dụ: time save_s; //khai báo một biến thời gian initial save_s = $time; //lưu lại thời gian mô phỏng tức thời g. Kiểu chuỗi: Chuỗi được lưu trong reg. Mỗi biến phải đủ rộng để chứa chuỗi, mỗi kí tự trong chuỗi dài 1 byte. Nếu độ rộng thanh ghi chứa chuỗi rộng hơn chiều dài chuỗi thì verilog sẽ lấp đầy bằng giá trị 0. Nếu độ rộng thanh ghi nhỏ hơn, verilog sẽ bỏ bớt kí tự chuỗi. Vì vậy, phải luôn khai báo chuỗi có độ rộng lớn hơn hoặc bằng độ rộng cần thiết. Ví dụ: reg [8*8:1] bien_chuoi; //khai báo biến rộng 9 byte initial bien_chuoi = “hello hdl”; //chuỗi có thể chứa trong biến 114 chuỗi có thể chứa những mã thoát sau: Bảng 6.3: Bảng mã thoát Mã thoát Chức năng \n Xuống dòng \t Tab %% % \\ \ \” ” h. Khai báo hằng số Verilog cho phép khai báo hằng số trong module bằng từ khóa parameter. Các giá trị hằng số có thể thay đổi trong quá trình thực hiện module bằng việc dùng phát biểu defparam. Trong verilog còn có hằng số cục bộ, là hằng số được định nghĩa bằng từ khóa localparam, giá trị của nó không bị thay đổi bằng phát biểu defparam, và được sử dụng để bảo vệ chống lại việc vô ý định lại giá trị hằng số. parameter = ; Ví dụ: parameter a = 5; //định nghĩa hằng port a localparam b = 4’h5, c =4’h8; //định nghĩa hằng số cục bộ4.3.3 Đieቹ u khieቻ n hệ thoቷ ng cung caቷ p thuỷ lực a. Chỉ thị hệ thống: Verilog cung cấp các chỉ thị để hệ thống thực hiện các nhiệm vụ như hiển thị lên màng hình, theo dõi giá trị của các đường dây, dừng, và kết thúc chương trình. Các chỉ thị bắt đầu bằng $. Ở đây, trình bày các chỉ thị hệ thống thường dùng nhất. Để hiển thị thông tin ta dùng hàm $dislay, lúc này hệ thống sẽ hiển thị giá trị của biến, hoặc chuỗi hay biểu thức. Cách dùng: $dislay (p1,p2,,pn); P1,p2,..,pn có thể là chuỗi hay biến, hoặc biểu thức. Dạng $dislay rất giống với printf trong ngôn ngữ C. Chuỗi hiển thị được định dạng theo các quy định cho trong bảng 6.4 Bảng 6.4: Bảng chỉ thị hệ thống Mã định dạng Hiển thị 115 %d hay %D Hiển thị giá trị theo cơ số 10 %b hay %B Hiển thị giá trị theo kiểu nhị phân %s hay %S Hiển thị chuỗi %h hay %H Hiển thị biến theo cơ số 16 %c hay %C Hiển thị kí tự ASCII %m hay %M Hiển thị theo thứ bậc %v hay %V Hiển thị theo mức ưu tiên 5o hay %O Hiển thị theo hệ cơ số 8 %t hay %T Hiển thị thời gian hiện hành %e hay %E Hiển thị theo kiểu khoa học (ví dụ 3e10) %f hay %F Hiển thị số thực theo kiểu thập phân %g hay %G Hiển thị số thực theo kiểu khoa học hoặc thập phân, sao cho ngắn nhất Để theo dõi thông tin, verilog cung cấp một cơ chế theo dõi sự thay đổi của tín hiệu, đó là chỉ thị $monitor. Cách dùng: $monitor (p1,p2,..,pn); Định dạng của $monitor cũng giống như $dislay, $monitor chỉ cần gọi một lần, sẽ hiển thị liên tục các giá trị của biến hay tín hiệu khi có bất kì sự thay đổi nào. Chỉ một danh sách theo dõi hoạt động tại một thời điểm, nếu có nhiều hơn một chỉ thị $monitor trong quá trình mô phỏng, thì chỉ thị $monitor cuối cùng sẽ hoạt động. Hai chỉ thị thường được sử dụng để mở hoặc tắt các chức năng theo dõi là $monitoron và $monitoroff. Quá trình theo dõi mặc định được bắt đầu cùng với việc mô phỏng, nhưng có thể được mở và tắt trong quá trình mổ phỏng bằng hai chỉ thị trên. Để dừng và kết thúc mô phỏng, verilog cung cấp chỉ thị $stop. Cách dùng: $stop; Chỉ thị $stop được sử dụng để dừng quá trình để sửa lỗi, thay đổi tín hiệu trong thiết kế,..đưa quá trình mô phỏng vào chế độ treo. Chỉ thị $finish dùng để kết thúc mô phỏng. Cách dùng: $finish; 116 b. Chỉ thị biên dịch: Verilog cung cấp một số chỉ thị biên dịch. Tất cả các chỉ thị được định nghĩa bởi cấu trúc ‘. Hai chỉ thị biên dịch hữu ích nhất là ‘define và ‘inclucde. ‘define dùng để định nghĩa macro trong verilog, nó giống như #define trong ngôn ngữ C. ‘include dùng để cho phép đưa vào một file mã nguồn verilog trong chương trình khác trong quá trình biên dịch. Cách làm việc giống như #include trong C. Chỉ thị này thường dùng để thêm vào nội dung toàn cục hoặc các định nghĩa thông dụng. 4.3.4. Điều khiển hệ thống thông gió a.Các thành phần trong một module: Module là một cấu trúc cơ bản của ngôn ngữ verilog. Mọi thành phần trong verilog đều chứa trong module. Một module có khả năng giao tiếp với các module khác thông qua các port. Cấu trúc bên trong của module này không thể truy suất từ các module khác, đây là một tính chất rất linh hoạt của verilog giúp người thiết kế có thể thay đổi cấu trúc bên trong của module mà không làm ảnh hưởng đến các thiết kế khác. Cấu trúc của một module trong verilog như hình 6.3. Hình 6.3 – Cấu trúc module trong verilog Định nghĩa một module bắt đầu bằng từ khóa module và phải kết thúc bằng từ khóa endmodule. Mỗi module phải có tên riêng đại diện cho module đó, khai báo các port (nếu có), tùy chọn khai báo các thông số (parameter) phải đặt ở đầu module. Port list và port chỉ có khi module có bất kì cổng giao tiếp với môi trường bên ngoài. Có năm thành phần bên trong module là: khai 117 báo biến, các câu lệnh mức dataflow, tạo các module thấp hơn, khối lệnh hành vi, và nhiệm vụ - chức năng của module. Các thành phần có thể đặt bất kỳ đâu, bất kỳ vị trì nào bên trong module. Verilog cho phép ghép nhiều module được định nghĩa trong cùng một file. Các module có thể được định nghĩa tại bất kì vị trí nào của file. b.Port : Port cung cấp giao diện, qua đó module có thể truyền thông với môi trường bên ngoài. Các thành phần bên trong module không nhìn thấy được từ môi trường bên ngoài. Sự thay đổi các thành phần bên trong không ảnh hưởng đến môi trường bên ngoài, miễn là giao diện không bị thay đổi. Điều này cung cấp tính linh hoạt mạnh cho người thiết kế. Danh sách các port là tùy chọn, và được khai báo khi định nghĩa module. Nếu module không trao đổi bất kỳ tín hiệu nào với bên ngoài, thì ta không cần danh sách các port. Tất cả các port trong danh sách port đều phải được khai báo trong module, mỗi port trong khai báo có thể thuộc một trong ba dạng sau: Từ khóa Loại port input Port ngõ vào output Port ngõ ra inout Port hai chiều (vào/ra) Lưu ý là các port input và inout thường được khai báo dưới dạng wire, nếu port output lưu trữ giá trị của port thì phải được khai báo dưới dạng reg. Có nhiều quy luật chi phối các kết nối port khi các module được thể hiện bên trong module khác, Trình mô phỏng sẽ báo lỗi nếu ta vi phạm các quy luật kết nối port. Các quy luật được tóm tắt như sau: Hình 6.4 – Nguyên tắc kết nối port 118 v Input: ở bên trong thì port input luôn luôn có kiểu net, còn bên ngoài port input có thể được kết nối đến một biến kiểu reg hoặc kiểu net. v Ouput: ở bên trong port output có kiểu reg hoặc kiểu net, còn bên noài port output phải luôn luôn được nối với biến kiểu net và không được nối với biến kiểu reg. v Inout: ở bên trong port inout phải luôn luôn có kiểu net, còn ở bên ngoài port inout phải luôn luôn được nối với kiểu net. v Tương thích độ rộng: việc nối các mục bên trong và bên ngoài có kích thước khác nhau là hợp lệ khi thực hiện nối port giữa các module, và lúc này sẽ có kèm theo cảnh báo (warning). v Port không kết nói: verilog cho phép port duy trì không kết nối. Một vài port ngõ ra có thể chỉ đơn thuần dùng để gỡ rối. Để kết nối đến tín hiệu bên ngoài, thì verilog hỗ trợ hai phương pháp thực hiện kết nối giữa các tín hiệu được chỉ rõ trong thể hiện module và các port trong định nghĩa module. Hai phương pháp này không được trộn lẫn với nhau. v Kết nối theo danh sách thứ tự: kết kết nối này cho thấy sự tương tác 1–1 rất trực quan. Cụ thể, tín hiệu trong module chính phải truyền vào module con theo đúng thứ tự các port đã được module con định nghĩa sẵn. Ví dụ: module Top; //Declare connection variables reg [3:0]A,B; reg C_IN; wire [3:0] SUM; wire C_OUT; //Instantiate fulladd4, call it fa_ordered. //Signals are connected to ports in order (by position) fulladd4 fa_ordered(SUM, C_OUT, A, B, C_IN); ... ... Endmodule v Kết nối theo tên: các tín hiệu của module chính truyền vào module con không cần đúng thứ tự, mà phải phù hợp với tên. Đây là ưu điểm 119 của verilog, bởi vì danh sách các port có thể rất dài, khi đó việc kết nối theo vị trí rất dễ bị lỗi. Ví dụ: // kết nối đến module con theo tên fulladd4 fa_byname(.c_out(C_OUT), .sum(SUM), .b(B), .c_in(C_IN), .a(A),); // Các port không sử dụng có thể bỏ qua, không cần viết tên vào fulladd4 fa_byname(.sum(SUM), .b(B), .c_in(C_IN), .a(A),); 4.3.5. Điều khiển động cơ thuận nghịch Loại cổng AND/OR: Các cổng and/or có nhiều ngõ vào và một ngõ ra. Tên đầu tiên trong danh sách các port kết nối với cổng là một ngõ ra, và các tên còn lại là các ngõ vào. Các cổng and/or cơ bản trong verilog là and, or, xor, nand, nor và xnor. Kí hiệu của các cổng and/or hai ngõ vào và một ngõ ra như hình 6.5. Hình 6.5 – Ký hiệu các loại cổng and/or Người thiết kế dễ dàng thêm các ngõ vào khi thực hiện các cổng tương ứng. Ta có thể không cần chỉ rõ tên thể hiện của các cổng, điều này cho phép thực hiện vài trăm cổng mà không cần đặt tên. Ví dụ: wire OUT, IN1, IN2; // các cổng cơ bản and a1(OUT, IN1, IN2); nand na1(OUT, IN1, IN2); or or1(OUT, IN1, IN2); 120 nor nor1(OUT, IN1, IN2); xor x1(OUT, IN1, IN2); xnor nx1(OUT, IN1, IN2); // có nhiều hơn 2 ngõ, đây là cổng nand 3 ngõ vào nand na1_3inp(OUT, IN1, IN2, IN3); // cổng không cần tên and (OUT, IN1, IN2); Bảng 6.5 – Bảng sự thật các cổng Loại cổng Bufif/Notif: Cổng bufif/notif có một ngõ vào và có một hoặc nhiều ngõ ra. Các cổng cơ bản được cung cấp bởi verilog là bufif và notif, ngõ vào là in và ngõ ra là out. Các loại cổng bufif/notif được thể hiện trong verilog là bufif1, notif1, bufif0 và notif0. 121 Hình 6.6 – Ký hiệu các loại cổng bufif và notif Các loại cổng này chỉ truyền tín hiệu khi có tín hiệu điều khiển, và sẽ ở trạng thái tổng trở cao khi không có tín hiệu điều khiển. Ví dụ: //cổng bufif. bufif1 b1 (out, in, ctrl); bufif0 b0 (out, in, ctrl); //cổng notif notif1 n1 (out, in, ctrl); notif0 n0 (out, in, ctrl); Các ví dụ: v Bộ dồn kênh 4-1 (4-1 multiplexer): Sơ đồ cổng logic Mô tả trực quan các cổng trong verilog: // bộ dồn kênh 4-1, với các ngõ in/out như trong sơ đồ cổng module mux4_to_1 (out, i0, i1, i2, i3, s1, s0); // khai báo các in/out output out; 122 input i0, i1, i2, i3; input s1, s0; // Khai báo các dây nối bên trong wire s1n, s0n; wire y0, y1, y2, y3; // hiện thực các cổng //Tạo các tín hiệu s1n và s0 not (s1n, s1); not (s0n, s0); // Các cổng and 3 ngõ vào and (y0, i0, s1n, s0n); and (y1, i1, s1n, s0); and (y2, i2, s1, s0n); and (y3, i3, s1, s0); // Cổng or 4 ngõ vào. or (out, y0, y1, y2, y3); endmodule v Bộ cộng 1 bit: Sơ đồ cổng logic Mô tả trong verilog: // Khai báo bộ cộng 1 bit module fulladd (sum, c_out, a, b, c_in); // Khai báo các cổng IO output sum, c_out; input a, b, c_in; // Các dây nối bên trong wire s1, c1, c2; // Hiện thực các cổng logic xor (s1, a, b); 123 and (c1, a, b); xor (sum, s1, c_in); and (c2, s1, c_in); xor (c_out, c2, c1); endmodule

Các file đính kèm theo tài liệu này:

  • pdfgiao_trinh_vi_mach_so_lap_trinh_trinh_do_trung_capcao_dang_n.pdf