VHDL viết tắt của VHSIC HDL (Veryhighspeedintergratedcircuit Hardware Description Language) hay ngôn ngữ mô tả phần cứng cho các vi số mạch tích hợp tốc độ cao. Các ưu điểm chính của VHDL có thể liệt kê ra là: Tính công cộng: VHDL là ngôn ngữ được chuẩn hóa chính thức của IEEE ,do đó được sự hỗ trợ của nhiều nhà sản xuất thiết bị . Được hỗ trợ bởi nhiều công nghệ: VHDL có thể sử dụng mô tả nhiều loại vi mạch khác nhau trên những công nghệ khác nhau từ các thư viện rời rạc, CPLD, FPGA, tới thư viện cổng chuẩn cho thiết kế ASIC. Tính độc lập với công nghệ Khả năng mô tả mở rộng Khả năng trao đổi, tái sử dụng: Việc VHDL được chuẩn hóa giúp cho việc trao đổi các thiết kế giữa các nhà thiết kế độc lập trở nên hết sức dễ dàng. Bản thiết kế VHDL được mô phỏng và kiểm tra có thể được tái sử dụng trong các thiết kế khác mà không phải lặp lại các quá trình trên. Giống nhƣ phần mềm thì các mô tả HDL cũng có một cộng đồng mã nguồn mở cung cấp, trao đổi miễn phí các thiết kế chuẩn có thể ứng dụng ở nhiều hệ thống khác nhau.
Trang 1
Các bước thiết kế mạch bằng VHDL và mô phỏng trên Basys 3 – Artix 7
- Tạo dự án
- Tổng hợp thiết kế
- Tạo thực thi thiết kế
- Thiết kế các ràng buộc (constraints) và điều khiển
- Tối ưu thực thi thiết kế
1) Tạo một dự án mới (project)
B1: Start -> All Apps -> Xilinx Design Tools -> Vivado 2015.4
B2: Tạo dự án mới
File menu > New Project hoặc chọn icon “Create New Project”
Trang 2B3: Next
B4: Chọn thư mục lưu dự án, nhập tên dự án ->Next
Trang 3
B5: Chọn RTL Project ->Next
Trang 4B6: Cửa sổ cho phép them các file nguồn/tạo file v o dự n (tạm thời chưa thực hiện);
chọn trường Target language: VHDL; simulator language: VHDL -> Next
Trang 5
B7: Cửa sổ để thêm IP có sẵn vào dự án (dự án này chưa cần) ->Next
Trang 6B8: Cửa số Add Constraints window (thêm sau) -> Next
Trang 7
B9: Cửa sổ device selection window, chọn các thuộc tính trong các trường như sau:
1 Select: - Parts (default option)
2 Product Category: - General Purpose
Trang 8Cửa sổ dự án mới:
Trang 10B11: Tạo các file nguồn mới: có 3 cách
Cách 1: Sử dụng công cụ Flow navigator toolbar trên phía trái của cửa sổ quản lý dự
án project manager window để tạo nguồn mới: Kích chọn biểu tượng add sources để
thêm hoặc tạo nguồn mới
Cách 2: Sử dụng project manager, kích phải chuột Design Sources và chọn add
sources
Trang 11Cách 3: Sử dụng tổ hợp ph m tắt Alt+A
Sau khi xuất hiện cửa sổ Add Source chọn mục add or create design sources -> Next
Trang 12B12:Trong cửa sổ add or create design sources, chọn Create File, trong File
Type: VHDL,File Name: Adder (tên v dụ, chọn OK -> Finish
B12: Nhập tên biến cho các cổng I/O hoặc cancel bỏ qua bước này (khai báo sau)
Trang 13Trong phần Xilinx Vivado project manager xuất hiện file nguồn mới Adder.vhd
Trang 14B13: Kích đúp lên tên tệp mới Adder.vhd, nhập v o của sổ soạn thảo mã chương
trình, sau khi soạn thảo xong, mã chương trình như sau:
b_in : in std_logic_vector (3 downto 0);
c_out : out std_logic_vector (3 downto 0));
end adder;
architecture adder_arch of adder is
begin process (a_in, b_in) variable carry : std_logic_vector (4 downto 0);
variable sum :std_logic_vector (3 downto 0);
begin carry (0) := '0';
for i in 0 to 3 loop sum (i) := a_in(i) xor b_in(i) xor carry(i);
carry (i+1) := (a_in(i) and b_in(i)) or (b_in(i) and carry (i)) or (carry (i) and a_in(i));
end loop;
c_out <= sum;
end process;
end adder_arch;
2) Tổng hợp thiết kế (Synthesize design)
- Cất tệp chọn menu File/ Save ( Ctrl + S.)
- K ch chọn Run Synthesize trong cửa sổ Flow Navigator để bắt đầu quá
tr nh tổng hợp (F11 hoặc chọn nút Run Synthesis trên thanh công cụ)
Trang 15B14: Khi quá trình tổng hợp kết thúc -> “Synthesize Completed" chọn Cancel, nếu chọn OK sẽ chạy thực thi (Chưa thực hiện ở thời điểm này)
Trang 16B15: Hiển thị sơ đồ mạch RTL chọn Schematic
Trang 17Để hiện Netlist hoặc đồ mức gate -> mở rộng mức RTL Analysis và Elaborated Design chọn Schematic
Trang 183) Thực thi thiết kế (design implementation)
- Kích phải chuột cửa sổ Project Manager chọn Add Sources
- Chọn Add or create constrains, v o tên file mới File Name: pin_io (tên ví dụ) ->OK
Trang 19- Chọn Finish
- Trong Hierarch phần Project Manager, mở rộng mục constraints,
kích đúp tên file pin_io để mở cửa sổ soạn thảo
- Mở file hỗ trợ soạn thảo ràng buộc, copy và paste vào cửa sổ soạn thảo, sửa lại nội dụng của tệp pin_io.xdc có dạng sau:
Lưu ý: Nên download tệp hỗ trợ Basys3_master.xdc, khi đó trong các dự án chỉ cần add tệp ràng buộc vào dự án, sửa lại Trong tệp xdc có các dòng sau:
1 “#” chỉ thị dòng chú thích ( lưu ý chú thích trong file VHDL (.vhd file) bắt đầu với “ " (two hypens)
2 Dòng set_property PACKAGE_PIN V17 [get_ports {a_in[3]}]
a) set_property: khai báo thuộc tính
b) PACKAGE_PIN V17: Khai báo nhóm pin vật lý trên thiết bị với “V17” chỉ
ra số pin trên FPGA
c) get_ports {a_in[3]} chỉ tới biến cổng vào muốn gắn với pin :”V17”
3 Dòng set_property IOSTANDARD LVCMOS33 [get_ports {a_in[3]}]
=> đặt chuẩn IO của cổng l LVCMOS 3.3 Volts
Lưu ý:
- Nếu kh ng muốn chỉ ra chuẩn IO cho c c cổng thì sử dụng lệnh sau trong file xdc:
set_property SEVERITY {Warning} [get_drc_checks NSTD-1]
- Trong file hỗ trợ Basys3_master.xdc (THAM KHẢO CUỐI TÀI LIỆU)có đủ các khai báo các pin của FPGA Artix-7 nhưng đều để
ở dạng dòng chú thích (#) Để sửa có 2 thao tác:
Trang 20
o Sử dụng pin nào bỏ dấu # ở 2 dòng lệnh PACKAGE và IOSTANDARD
o Sửa tên biến mặc định gán cho pin bằng tên biến khai báo trong .VHL mà muốn gán cho pin đó ( trong trường hợp khai báo biến trong VHL trùng với tên mặc định có sẵn thì không cần thao tác thứ 2 này)
# Pin assignment for SWs / Inputs
set_property PACKAGE_PIN V17 [get_ports {a_in[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {a_in[3]}] set_property PACKAGE_PIN V16 [get_ports {a_in[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {a_in[2]}] set_property PACKAGE_PIN W16 [get_ports {a_in[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {a_in[1]}] set_property PACKAGE_PIN W17 [get_ports {a_in[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {a_in[0]}] set_property PACKAGE_PIN W15 [get_ports {b_in[3]}]
Trang 21set_property IOSTANDARD LVCMOS33 [get_ports {b_in[0]}]
# Pin assignment for LEDs / Output set_property PACKAGE_PIN U16 [get_ports {c_out[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {c_out[0]}] set_property PACKAGE_PIN E19 [get_ports {c_out[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {c_out[1]}] set_property PACKAGE_PIN U19 [get_ports {c_out[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {c_out[2]}] set_property PACKAGE_PIN V19 [get_ports {c_out[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {c_out[3]}]
4) Phát sinh tệp chương trình
B16: Dưới của sổ Flow Navigator window, chọn Program and Debug và kích chọn
Bitstream Setting, xuất hiện cửa sổ Project Setting, tick mục –bin_file, chọn Apply,
Trang 22-> OK
B17: Chọn mục Generate Bitstream, hoặc k ch icon Generate Bitstream trên thanh
công cụ, thao tác này sẽ phát sinh tệp đích dạng nhị phân để nạp xuống chip FPGA
Trang 23- Nếu quá trình Generate Bitstream ho n th nh sẽ xuất hiện cửa số thông
báo trên của sổ console Bitstream Generation successfully completed
Trang 245) Nạp chương trình vào Basys3 Development Board
B18: Kết nối Basys 3 với PC sử dụng cap USB ( lưu ý JP1 phải cấu hình JTAG)
B19: Từ Flow Navigator mở rộng mục Program and Debug, chọn Open Hardware Manager/Open Target /Auto Connect hoặc kích Icon Auto Connect
trên thanh công cụ:
Trang 25Quá trình dò tìm Basys3 xẩy ra, khi hoàn thành nó sẽ chỉ thị kết nối thành công
Trang 26B20: Kích chuột phải lên thiết bị và chọn Program Device hoặc chọn Program
Device từ cửa sổ Flow Navigation Xuất hiện cửa sổ chứa tên tệp adder.bit
Trang 27B21: chọn Program để nạp chương trinh vào FPGA Nếu chương trinh nạp thành công LED LD19 sẽ sáng xanh
Trang 28KẾT XUẤT FILE PDF CHO SƠ ĐỒ MẠCH THIẾT KẾ
TỆP CONSTRANTS BASYS3 DEVOLOPMENT BOARD
(Basys3_Master.xdc)
## - uncomment the lines corresponding to used pins
## - rename the used ports (in each line, after get_ports) according to the top level signal names
in the project
## Clock signal
#set_property PACKAGE_PIN W5 [get_ports clk]
#set_property IOSTANDARD LVCMOS33 [get_ports clk]
#create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports clk]
## Switches
set_property PACKAGE_PIN V17 [get_ports {a_in[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {a_in[0]}]
set_property PACKAGE_PIN V16 [get_ports {a_in[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {a_in[1]}]
set_property PACKAGE_PIN W16 [get_ports {a_in[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {a_in[2]}]
Trang 29set_property PACKAGE_PIN W17 [get_ports {a_in[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {a_in[3]}] set_property PACKAGE_PIN W15 [get_ports {b_in[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {b_in[0]}] set_property PACKAGE_PIN V15 [get_ports {b_in[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {b_in[1]}] set_property PACKAGE_PIN W14 [get_ports {b_in[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {b_in[2]}] set_property PACKAGE_PIN W13 [get_ports {b_in[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {b_in[3]}]
#set_property PACKAGE_PIN V2 [get_ports {sw[8]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {sw[8]}]
#set_property PACKAGE_PIN T3 [get_ports {sw[9]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {sw[9]}]
#set_property PACKAGE_PIN T2 [get_ports {sw[10]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {sw[10]}]
#set_property PACKAGE_PIN R3 [get_ports {sw[11]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {sw[11]}]
#set_property PACKAGE_PIN W2 [get_ports {sw[12]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {sw[12]}]
#set_property PACKAGE_PIN U1 [get_ports {sw[13]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {sw[13]}]
#set_property PACKAGE_PIN T1 [get_ports {sw[14]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {sw[14]}]
#set_property PACKAGE_PIN R2 [get_ports {sw[15]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {sw[15]}]
## LEDs
set_property PACKAGE_PIN U16 [get_ports {c_out[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {c_out[0]}] set_property PACKAGE_PIN E19 [get_ports {c_out[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {c_out[1]}] set_property PACKAGE_PIN U19 [get_ports {c_out[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {c_out[2]}] set_property PACKAGE_PIN V19 [get_ports {c_out[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {c_out[3]}]
#set_property PACKAGE_PIN W18 [get_ports {led[4]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {led[4]}]
#set_property PACKAGE_PIN U15 [get_ports {led[5]}]
Trang 30
#set_property IOSTANDARD LVCMOS33 [get_ports {led[5]}]
#set_property PACKAGE_PIN U14 [get_ports {led[6]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {led[6]}]
#set_property PACKAGE_PIN V14 [get_ports {led[7]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {led[7]}]
#set_property PACKAGE_PIN V13 [get_ports {led[8]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {led[8]}]
#set_property PACKAGE_PIN V3 [get_ports {led[9]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {led[9]}]
#set_property PACKAGE_PIN W3 [get_ports {led[10]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {led[10]}]
#set_property PACKAGE_PIN U3 [get_ports {led[11]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {led[11]}]
#set_property PACKAGE_PIN P3 [get_ports {led[12]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {led[12]}]
#set_property PACKAGE_PIN N3 [get_ports {led[13]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {led[13]}]
#set_property PACKAGE_PIN P1 [get_ports {led[14]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {led[14]}]
#set_property PACKAGE_PIN L1 [get_ports {led[15]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {led[15]}]
##7 segment display
#set_property PACKAGE_PIN W7 [get_ports {seg[0]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {seg[0]}]
#set_property PACKAGE_PIN W6 [get_ports {seg[1]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {seg[1]}]
#set_property PACKAGE_PIN U8 [get_ports {seg[2]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {seg[2]}]
#set_property PACKAGE_PIN V8 [get_ports {seg[3]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {seg[3]}]
#set_property PACKAGE_PIN U5 [get_ports {seg[4]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {seg[4]}]
#set_property PACKAGE_PIN V5 [get_ports {seg[5]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {seg[5]}]
#set_property PACKAGE_PIN U7 [get_ports {seg[6]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {seg[6]}]
#set_property PACKAGE_PIN V7 [get_ports dp]
Trang 31#set_property IOSTANDARD LVCMOS33 [get_ports dp]
#set_property PACKAGE_PIN U2 [get_ports {an[0]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {an[0]}]
#set_property PACKAGE_PIN U4 [get_ports {an[1]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {an[1]}]
#set_property PACKAGE_PIN V4 [get_ports {an[2]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {an[2]}]
#set_property PACKAGE_PIN W4 [get_ports {an[3]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {an[3]}]
##Buttons
#set_property PACKAGE_PIN U18 [get_ports btnC]
#set_property IOSTANDARD LVCMOS33 [get_ports btnC]
#set_property PACKAGE_PIN T18 [get_ports btnU]
#set_property IOSTANDARD LVCMOS33 [get_ports btnU]
#set_property PACKAGE_PIN W19 [get_ports btnL]
#set_property IOSTANDARD LVCMOS33 [get_ports btnL]
#set_property PACKAGE_PIN T17 [get_ports btnR]
#set_property IOSTANDARD LVCMOS33 [get_ports btnR]
#set_property PACKAGE_PIN U17 [get_ports btnD]
#set_property IOSTANDARD LVCMOS33 [get_ports btnD]
##Pmod Header JA
##Sch name = JA1
#set_property PACKAGE_PIN J1 [get_ports {JA[0]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {JA[0]}]
##Sch name = JA2
#set_property PACKAGE_PIN L2 [get_ports {JA[1]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {JA[1]}]
##Sch name = JA3
#set_property PACKAGE_PIN J2 [get_ports {JA[2]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {JA[2]}]
##Sch name = JA4
#set_property PACKAGE_PIN G2 [get_ports {JA[3]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {JA[3]}]
##Sch name = JA7
Trang 32#set_property PACKAGE_PIN H1 [get_ports {JA[4]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {JA[4]}]
##Sch name = JA8
#set_property PACKAGE_PIN K2 [get_ports {JA[5]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {JA[5]}]
##Sch name = JA9
#set_property PACKAGE_PIN H2 [get_ports {JA[6]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {JA[6]}]
##Sch name = JA10
#set_property PACKAGE_PIN G3 [get_ports {JA[7]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {JA[7]}]
##Pmod Header JB
##Sch name = JB1
#set_property PACKAGE_PIN A14 [get_ports {JB[0]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {JB[0]}]
##Sch name = JB2
#set_property PACKAGE_PIN A16 [get_ports {JB[1]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {JB[1]}]
##Sch name = JB3
#set_property PACKAGE_PIN B15 [get_ports {JB[2]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {JB[2]}]
##Sch name = JB4
#set_property PACKAGE_PIN B16 [get_ports {JB[3]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {JB[3]}]
##Sch name = JB7
#set_property PACKAGE_PIN A15 [get_ports {JB[4]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {JB[4]}]
##Sch name = JB8
#set_property PACKAGE_PIN A17 [get_ports {JB[5]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {JB[5]}]
##Sch name = JB9
#set_property PACKAGE_PIN C15 [get_ports {JB[6]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {JB[6]}]
##Sch name = JB10
#set_property PACKAGE_PIN C16 [get_ports {JB[7]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {JB[7]}]