37
THIẾT KẾ MICROBLAZE TRÊN SPARTAN 3E STARTER BOARD 1. Giới thiệu Microblaze là lõi xử lý mềm 32-bit RISC (32-bit RISC soft- core synthesizable processor) cho phép các nhà phát triển các hệ thống nhúng điều chỉnh hiệu năng đáp ứng các yêu cầu của các ứng dụng mục tiêu. Kiến trúc cơ bản của Microblaze gồm có 32 thanh ghi chung (general-purpose registers), một đơn vị logic-số học (ALU), 1 đơn vị dịch (shift unit), và 2 cấp ngắt (2 levels of interrupt). Ta có thể cấu hình thiết kế cơ bản này với nhiều đặc tính cao cấp hơn để cho phép người sử dụng cân bằng hiệu năng yêu cầu của ứng dụng đối với chi phí của vùng logic của bộ xử lý mềm Microblaze. Trong thí nghiệm này, ta sẽ sử dụng hệ thống Microblaze và phần mềm để điều khiển hiển thị LCD trong Spartan 3E FPGA. Trong phần đầu ta sẽ xây dựng một hệ thống Microblaze sử dụng Xilinx Embedded Development Kit (EDK). Nói chung, để thiết kế một hệ thống nhúng, ta cần: các phần cứng, bản đồ bộ nhớ, và ứng dụng phần mềm (Hardware components, Memory map, and Software application).

Microblaze on Spartan 3E Using Xilinx XPS 11.1

Embed Size (px)

Citation preview

Page 1: Microblaze on Spartan 3E Using Xilinx XPS 11.1

THIẾT KẾ MICROBLAZE TRÊN SPARTAN 3E STARTER BOARD

1. Giới thiệuMicroblaze là lõi xử lý mềm 32-bit RISC (32-bit RISC soft-core synthesizable processor)

cho phép các nhà phát triển các hệ thống nhúng điều chỉnh hiệu năng đáp ứng các yêu cầu của các ứng dụng mục tiêu. Kiến trúc cơ bản của Microblaze gồm có 32 thanh ghi chung (general-purpose registers), một đơn vị logic-số học (ALU), 1 đơn vị dịch (shift unit), và 2 cấp ngắt (2 levels of interrupt). Ta có thể cấu hình thiết kế cơ bản này với nhiều đặc tính cao cấp hơn để cho phép người sử dụng cân bằng hiệu năng yêu cầu của ứng dụng đối với chi phí của vùng logic của bộ xử lý mềm Microblaze.

Trong thí nghiệm này, ta sẽ sử dụng hệ thống Microblaze và phần mềm để điều khiển hiển thị LCD trong Spartan 3E FPGA. Trong phần đầu ta sẽ xây dựng một hệ thống Microblaze sử dụng Xilinx Embedded Development Kit (EDK). Nói chung, để thiết kế một hệ thống nhúng, ta cần: các phần cứng, bản đồ bộ nhớ, và ứng dụng phần mềm (Hardware components, Memory map, and Software application).

Hình 1: Hệ thống Microblaze

Page 2: Microblaze on Spartan 3E Using Xilinx XPS 11.1

Xilinx EDK cho phép nhà thiết kế xây dựng một hệ thống xử lý hoàn chỉnh trên các FPGA của Xilinx. Các hệ thống có thể được tạo ra nhờ sử dụng EDK có thể là từ một kiến trúc xử lý đơn giản đến một hệ thống đa xử lý phức tạp với nhiều mức tăng tốc phần cứng. EDK hỗ trợ chủ yếu cho 2 loại xử lý: i) Microblaze – là bộ xử lý lõi mềm có thể cấu hình lại được và ii) Power-PC – là bộ xử lý cứng được thực hiện trên một số FPGA của Xilinx. Phụ thuộc vào chip FPGA mà ta sử dụng, nhiều Microblazes và Power-PCs có thể được tích hợp vào với nhau trong một thiết kế. EDK cung cấp các trình biên dịch C/C++ cho cả Microblaze và Power-PC cùng với một số công cụ để debugging/profiling các ứng dụng chạy trên từng bộ xử lý. Bên cạnh đó, sử dụng ISE, ta có thể thực hiện một số loại mô phỏng (simulation) kiến trúc. Nội dung này trình diễn quá trình tạo và kiểm tra thiết kế hệ thống Microblaze nhờ sử dụng EDK và Spartan 3E starter board của Xilinx.

Xác định thiết kế phần mềm Tải (downloading) thiết kế

2. Các yêu cầu của hệ thốngTa cần phải cài đặt các phần mềm sau đây trên PC của mình để thực hiện thiết kế: Windows 2000 SP2/Windows XP/Windows 7 EDK 10.1i, hoặc phiên bản cao hơn (11.x, 12.x, 13.x). Xilinx ISE Design Suite 10.1i, hoặc phiên bản cao hơn (11.x, 12.x, 13.x). Spartan 3E starter kit và Xilinx USB download cable

Ghi chú: các phần cứng khác của Xilinx có thể sử dụng được với hướng dẫn này. Nhưng thiết kế hoàn chỉnh chỉ được so sánh trên bảng đã nêu ở trên (Spartan 3E). Các thay đổi của thiết kế cần phải có nếu sử dụng phần cứng khác:

Hình 2: Processor IP

Page 3: Microblaze on Spartan 3E Using Xilinx XPS 11.1

Cập nhật pin assignments trong tệp system.ucf. Cập nhật JTAG chain của bảng xác định trong download.cmd.

3. Mô tả hệ thống MicroblazeNói chung, để thiết kế một hệ thống nhúng, ta cần: Các phần cứng (Hardware components). Bản đồ bộ nhớ (Memory map). Ứng dụng phần mềm (Software application).

4. Phần cứng của thiết kếThiết kế MicroBlaze bao gồm các phần cứng như sau: MicroBlaze Local Memory Bus (LMB) LMB BRAM controllers for BRAM BRAM PLB_MDM Multi-Port Memory Controller (MPMC) for external DDR_SDRAM memory UART for serial communication GPIOs for LEDs

5. Các bước thiết kếThiết kế gồm 3 bước:1. Tạo một Project nhờ sử dụng Base System Builder (BSB) của XPS.2. Phân tích Project được tạo ra.3. Kiểm tra phần cứng của thiết kế.

5.1. Bước 1: Tạo một Project nhờ sử dụng Base System Builder của XPS Sử dụng Spartan 3E starter board. Tất cả các thiết bị trong hệ thống MicroBlaze được sắp xếp theo bộ nhớ. Nếu hệ

thống chỉ có một processor, các địa chỉ bộ nhớ cho các thiết bị có thể được tự động tạo ra.

xparameter.h file được tạo ra với macros chỉ đến các địa chỉ của các thiết bị. Sử dụng macros trong phầm mềm ứng dụng sao cho ta không cần phải thay đổi tất cả các địa chỉ trong ứng dụng ngay cả khi thay đổi các địa chỉ các thiết bị.

Đầu tiên, sử dụng Xilinx Platform Studio (XPS) để tạo Project File. XPS cho phép điều khiển sự phát triển phần cứng và phần mềm của hệ thồng Microblaze, và bao gồm:

Editor và Project management interface để tạo và biên soạn mã nguồn. Các lựa chọn cấu hình luồng công cụ phần mềm.

Ta có thể sử dụng XPS để tạo các file sau đây:(i) Project Navigator project file cho phép điều khiển luồng thực hiện của phần cứng.(ii) Microprocessor Hardware Specification (MHS) file.(iii) Microprocessor Software Specification (MSS) file.

Ghi chú: để thêm thông tin về các file MHS và MSS có thể tham khảo ở Platform Specification Format Reference Manual.

Page 4: Microblaze on Spartan 3E Using Xilinx XPS 11.1

XPS hỗ trợ luồng công cụ phần mềm liên kết với các ứng dụng. Ngoài ra, ta có thể sử dujng XPS để đặt các thư viện, các drivers, interrupt handlers, dịch các chương trình biên soạn.

Starting XPS:

i) Mở XPS, chọn:

Start -> All programs -> Xilinx ISE Design Suite 11.1 -> EDK -> Xilinx Platform Studio

(hoặc kích chuột vào biểu tượng XPS trên Desktop) để có cửa sổ Xilinx Platform Studio (hình 3).

ii) Kích chuột lên nút OK, sẽ hiển thị cửa sổ cho ở hình 4.

iii) Kích chuột nút Browse (hình 4) để chọn thư mục mong muốn để tạo tệp tin system.xmp và lưu (save). Kết quả hiển thị cửa sổ cho ở hình 5.

Hình 4

Hình 3

Page 5: Microblaze on Spartan 3E Using Xilinx XPS 11.1

iv) Kích chuột nút OK, xuất hiện cửa sổ cho ở hình 6.

v) Chọn

Hình 5

Hình 6

Page 6: Microblaze on Spartan 3E Using Xilinx XPS 11.1

“I would like to create a new design option” và kích chuột nút Next, hiện cửa sổ ở hình 7.

Ta chọn: Board Vendor: Xilinx Board Name: Spartan-3E Starter board Board Revision: D (xem ghi trên bảng Spartan-3E)

vi) Kích chuột nút Next sẽ xuất hiện cửa sổ “System Configuration” ở hình 7.

Hình 7: Board Selection

Page 7: Microblaze on Spartan 3E Using Xilinx XPS 11.1

Chọn “Single-Processor System” và kích chuột nút Next để xuất hiện cửa sổ “Processor Configuration” ở hình 8.

vii) Trên cửa sổ “Processor Configuration” , ta chọn: Reference Clock Frequency: 50 MHz

Đây là nguồn đồng hồ bên ngoài trên bảng Spartan-3E đang sử dụng. Đồng hồ này sẽ được sử dụng để tạo bộ xử lý và các đồng hồ của bus.

Processor type: MicroBlaze System Clock Frequency-bus Clock Frequency: 50 MHz Local Memorry: 8KB Debug Interface: On-Chip H/W debug module

Hình 8: Cửa sổ “System Configuration” và chọn “Single-Processor System”

Page 8: Microblaze on Spartan 3E Using Xilinx XPS 11.1

viii) Kích chuột nút Next sau khi đã lựa chọn cấu hình cho processor (không cho phép xử lý dấu phẩy động: Enable Floating Point Unit không chọn). Xuất hiện cửa sổ “Peripheral Configuration” (chọn cấu hình cho Peripherali) ở hình 9. Ta lần lượt chọn:

RS232-DCE: XPS UARTLITE, 115000 baud rate, 8 Data bits, no interrupt, no parity (hình 9)

LEDs_8Bit: XPS GPIO. No interrupt (hình 10) DDR_SDRAM: MPMC Controller (Multi-Port Memory Controller) (hình 11)

Hình 9: Cửa số Processor Configuration”

Page 9: Microblaze on Spartan 3E Using Xilinx XPS 11.1

Và ở thời điểm này ta có thể kích chuột nút Add để bổ xung thêm IO Peripherals và internal peripherals, nhưng ta sẽ xem một phương pháp khác ở phần sau có thể bổ xung thêm peripherals cho project.

Hình 8: Cửa sổ Peripheral Configuration

Hình 9: Cấu hình cho RS232_DCE

Hình 10: Cấu hình cho LEDs_8Bit

Page 10: Microblaze on Spartan 3E Using Xilinx XPS 11.1

ix) Kích chuột nút Next để hiển thị cửa sổ “”Cache Configuration” (hình 12)

x) Trên cửa sổ Cache Configuration không có gì được chọn (không sử dụng cache). Ta kích chuột nút Next để hiển thị cửa sổ “Application Configuration” (hình 13).Kiểm tra các thông số vừa cấu hình trên cửa sổ này, và kích chuột nút Next để cửa sổ “Summary” (hình 14).

Hình 11: Cấu hình cho DDR_SDRAM

Hình 12: Cửa sổ Cache Configuration

Page 11: Microblaze on Spartan 3E Using Xilinx XPS 11.1

Hình 13: Cửa sổ Application Configuration

Page 12: Microblaze on Spartan 3E Using Xilinx XPS 11.1

xi) Kích chuột nút Finish trên cửa sổ “Summary” để xuất hiện cửa sổ “ Xilinx Platform Studio –H:\FPGAExamples\EDK\system.xmp (System Assembly View)” (hình 15). Nó chỉ ra peripherals và buses trong hệ thống, và kết nối của hệ thống (system connectivity).

Hình 14: Cửa sổ Summary

Page 13: Microblaze on Spartan 3E Using Xilinx XPS 11.1

Hình 15: Cửa sổ “ Xilinx Platform Studio (System Assembly View)” với Bus Interfaces

Page 14: Microblaze on Spartan 3E Using Xilinx XPS 11.1

5.2. Bước 2: Phân tích phần cứngTạo một sơ đồ khối của hệ thống và nghiên cứu các thành phần và interconnections của

hệ thống. Xem xét System Assembly View và phân tích bus và các kết nối bus. Chạy PlatGen để tạo system netlists (NGC) và xem xét trong Design Summary. Xem lại các files đã được tạo ra.

Hình 17: Cửa sổ

Hình 16: Bus Interfaces

Page 15: Microblaze on Spartan 3E Using Xilinx XPS 11.1

i) Kích chuột vào tab “Block Diagram” để hiển thị sơ đồ khối của hệ thống (hình 18), trong đó có các khối: LMB BRAM + controller để lưu Data + instructions, khối Microblaze Processor và khối PLB Peripherals nối với Microblaze Processor. Hình 19 là các biểu diễn và mầu cho các thành phần trên Block Diagram. Hình 20: đặc điểm của Spartan 3E Starter board, và phiên bản của EDK.

Hình 18: Block Diagram của hệ thống

Hình 19:Các ký hiệu trên Block Diagram của hệ thống

Hình 20:Đặc tính của Spartan 3E Starter board và phiên bản EDK.

Page 16: Microblaze on Spartan 3E Using Xilinx XPS 11.1

LMB BRAM + controller để lưu Data + instructions

Hình 22: Microblaze

Page 17: Microblaze on Spartan 3E Using Xilinx XPS 11.1

Hình 24: PLB Peripherals

Hình 23: Clock generator

Page 18: Microblaze on Spartan 3E Using Xilinx XPS 11.1

ii) Kích chuột vào tab “System Assembly View” để hiển thị lại cửa sổ “System Assembly View” như cho ở hình 15. Trên cửa sổ này, ở “Bus Interfaces” kích chuột vào các nút + để mở rộng xem các chi tiết (hình 25). Tương tự, ta chọn Ports và kích vào các nút + để mở rộng chi tiết của Ports (hình 26), chọn Address để xem chi tiết các địa chỉ cho peripherals trong hệ thống (hình 27).

Page 19: Microblaze on Spartan 3E Using Xilinx XPS 11.1
Page 20: Microblaze on Spartan 3E Using Xilinx XPS 11.1

1001

1001

iii) Chạy PlatGen:

Hardware Generate Netlist hoặc kích chuột biểu tượng trên thực đơn.

(Chú ý: phải chờ khoảng 5 phút để tạo Netlist: cho đến khi nào biểu tượng rõ trở lại).

iv) Kích chuột tab “Design Summary” để xem toàn bộ thông tin về hệ thống thiết kế, reports, và messages.

5.3. Bước 3: Kiểm tra phần cứng

Tạo Bitstream và tải Bitstream lên Spartan 3E Starter board. Bitstream sẽ được ghi lên Bộ nhớ lệnh (Block RAM của FPGA).

i) Tạo bitstream:

Hardware -> Generate Bitstream (hoặc kích chuột biểu tượng trên thực đơn)

(Chú ý: phải chờ hơn 1 giờ để tạo Bitstream cho đến khi nào biểu tượng rõ trở lại)

ii) Tải Bitstream lên Spartan 3E Starter Board:

Device Configuration -> Download Bitstream

6. Nội dung các File

6.1. NHS File: system.mhs

# ############################################################################### Created by Base System Builder Wizard for Xilinx EDK 11.1 Build EDK_L.29.1# Thu Mar 29 23:23:39 2012# Target Board: Xilinx Spartan-3E Starter Board Rev D# Family: spartan3e# Device: XC3S500e# Package: FG320# Speed Grade: -4# Processor number: 1# Processor 1: microblaze_0# System clock frequency: 50.0# Debug Interface: On-Chip HW Debug Module# ############################################################################## PARAMETER VERSION = 2.1.0

PORT fpga_0_RS232_DTE_RX_pin = fpga_0_RS232_DTE_RX_pin, DIR = I PORT fpga_0_RS232_DTE_TX_pin = fpga_0_RS232_DTE_TX_pin, DIR = O PORT fpga_0_RS232_DCE_RX_pin = fpga_0_RS232_DCE_RX_pin, DIR = I PORT fpga_0_RS232_DCE_TX_pin = fpga_0_RS232_DCE_TX_pin, DIR = O PORT fpga_0_LEDs_8Bit_GPIO_IO_O_pin = fpga_0_LEDs_8Bit_GPIO_IO_O_pin, DIR = O, VEC = [0:7]

Page 21: Microblaze on Spartan 3E Using Xilinx XPS 11.1

PORT fpga_0_DIP_Switches_4Bit_GPIO_IO_I_pin = fpga_0_DIP_Switches_4Bit_GPIO_IO_I_pin, DIR = I, VEC = [0:3] PORT fpga_0_Buttons_4Bit_GPIO_IO_I_pin = fpga_0_Buttons_4Bit_GPIO_IO_I_pin, DIR = I, VEC = [0:3] PORT fpga_0_FLASH_Mem_A_pin = fpga_0_FLASH_Mem_A_pin_vslice_8_31_concat, DIR = O, VEC = [8:31] PORT fpga_0_FLASH_Mem_CEN_pin = fpga_0_FLASH_Mem_CEN_pin, DIR = O PORT fpga_0_FLASH_Mem_OEN_pin = fpga_0_FLASH_Mem_OEN_pin, DIR = O PORT fpga_0_FLASH_Mem_WEN_pin = fpga_0_FLASH_Mem_WEN_pin, DIR = O PORT fpga_0_FLASH_Mem_DQ_pin = fpga_0_FLASH_Mem_DQ_pin, DIR = IO, VEC = [0:7] PORT fpga_0_FLASH_BEN_pin = net_gnd, DIR = O PORT fpga_0_DDR_SDRAM_DDR_Clk_pin = fpga_0_DDR_SDRAM_DDR_Clk_pin, DIR = O PORT fpga_0_DDR_SDRAM_DDR_Clk_n_pin = fpga_0_DDR_SDRAM_DDR_Clk_n_pin, DIR = O PORT fpga_0_DDR_SDRAM_DDR_CE_pin = fpga_0_DDR_SDRAM_DDR_CE_pin, DIR = O PORT fpga_0_DDR_SDRAM_DDR_CS_n_pin = fpga_0_DDR_SDRAM_DDR_CS_n_pin, DIR = O PORT fpga_0_DDR_SDRAM_DDR_RAS_n_pin = fpga_0_DDR_SDRAM_DDR_RAS_n_pin, DIR = O PORT fpga_0_DDR_SDRAM_DDR_CAS_n_pin = fpga_0_DDR_SDRAM_DDR_CAS_n_pin, DIR = O PORT fpga_0_DDR_SDRAM_DDR_WE_n_pin = fpga_0_DDR_SDRAM_DDR_WE_n_pin, DIR = O PORT fpga_0_DDR_SDRAM_DDR_BankAddr_pin = fpga_0_DDR_SDRAM_DDR_BankAddr_pin, DIR = O, VEC = [1:0] PORT fpga_0_DDR_SDRAM_DDR_Addr_pin = fpga_0_DDR_SDRAM_DDR_Addr_pin, DIR = O, VEC = [12:0] PORT fpga_0_DDR_SDRAM_DDR_DQ_pin = fpga_0_DDR_SDRAM_DDR_DQ_pin, DIR = IO, VEC = [15:0] PORT fpga_0_DDR_SDRAM_DDR_DM_pin = fpga_0_DDR_SDRAM_DDR_DM_pin, DIR = O, VEC = [1:0] PORT fpga_0_DDR_SDRAM_DDR_DQS_pin = fpga_0_DDR_SDRAM_DDR_DQS_pin, DIR = IO, VEC = [1:0] PORT fpga_0_DDR_SDRAM_ddr_dqs_div_io_pin = fpga_0_DDR_SDRAM_ddr_dqs_div_io_pin, DIR = IO PORT fpga_0_Ethernet_MAC_PHY_tx_clk_pin = fpga_0_Ethernet_MAC_PHY_tx_clk_pin, DIR = I PORT fpga_0_Ethernet_MAC_PHY_rx_clk_pin = fpga_0_Ethernet_MAC_PHY_rx_clk_pin, DIR = I PORT fpga_0_Ethernet_MAC_PHY_crs_pin = fpga_0_Ethernet_MAC_PHY_crs_pin, DIR = I PORT fpga_0_Ethernet_MAC_PHY_dv_pin = fpga_0_Ethernet_MAC_PHY_dv_pin, DIR = I PORT fpga_0_Ethernet_MAC_PHY_rx_data_pin = fpga_0_Ethernet_MAC_PHY_rx_data_pin, DIR = I, VEC = [3:0]PORT fpga_0_Ethernet_MAC_PHY_col_pin = fpga_0_Ethernet_MAC_PHY_col_pin, DIR = IPORT fpga_0_Ethernet_MAC_PHY_rx_er_pin = fpga_0_Ethernet_MAC_PHY_rx_er_pin, DIR = I PORT fpga_0_Ethernet_MAC_PHY_tx_en_pin = fpga_0_Ethernet_MAC_PHY_tx_en_pin, DIR = O PORT fpga_0_Ethernet_MAC_PHY_tx_data_pin = fpga_0_Ethernet_MAC_PHY_tx_data_pin, DIR = O, VEC = [3:0] PORT fpga_0_clk_1_sys_clk_pin = dcm_clk_s, DIR = I, SIGIS = CLK, CLK_FREQ = 50000000 PORT fpga_0_rst_1_sys_rst_pin = sys_rst_s, DIR = I, SIGIS = RST, RST_POLARITY = 1

BEGIN microblaze PARAMETER INSTANCE = microblaze_0 PARAMETER C_FAMILY = spartan3e PARAMETER C_AREA_OPTIMIZED = 1 PARAMETER C_INTERCONNECT = 1 PARAMETER C_DEBUG_ENABLED = 1 PARAMETER HW_VER = 7.20.a BUS_INTERFACE DLMB = dlmb BUS_INTERFACE ILMB = ilmb BUS_INTERFACE DPLB = mb_plb BUS_INTERFACE IPLB = mb_plb BUS_INTERFACE DEBUG = microblaze_0_mdm_bus PORT MB_RESET = mb_resetEND

BEGIN plb_v46 PARAMETER INSTANCE = mb_plb

Page 22: Microblaze on Spartan 3E Using Xilinx XPS 11.1

PARAMETER C_FAMILY = spartan3e PARAMETER HW_VER = 1.04.a PORT PLB_Clk = clk_50_0000MHz PORT SYS_Rst = sys_bus_resetEND

BEGIN lmb_v10 PARAMETER INSTANCE = ilmb PARAMETER HW_VER = 1.00.a PORT LMB_Clk = clk_50_0000MHz PORT SYS_Rst = sys_bus_resetEND

BEGIN lmb_v10 PARAMETER INSTANCE = dlmb PARAMETER HW_VER = 1.00.a PORT LMB_Clk = clk_50_0000MHz PORT SYS_Rst = sys_bus_resetEND

BEGIN lmb_bram_if_cntlr PARAMETER INSTANCE = dlmb_cntlr PARAMETER HW_VER = 2.10.b PARAMETER C_BASEADDR = 0x00000000 PARAMETER C_HIGHADDR = 0x00001fff BUS_INTERFACE SLMB = dlmb BUS_INTERFACE BRAM_PORT = dlmb_portEND

BEGIN lmb_bram_if_cntlr PARAMETER INSTANCE = ilmb_cntlr PARAMETER HW_VER = 2.10.b PARAMETER C_BASEADDR = 0x00000000 PARAMETER C_HIGHADDR = 0x00001fff BUS_INTERFACE SLMB = ilmb BUS_INTERFACE BRAM_PORT = ilmb_portEND

BEGIN bram_block PARAMETER INSTANCE = lmb_bram PARAMETER C_FAMILY = spartan3e PARAMETER HW_VER = 1.00.a BUS_INTERFACE PORTA = ilmb_port BUS_INTERFACE PORTB = dlmb_portEND

BEGIN xps_uartlite PARAMETER INSTANCE = RS232_DTE PARAMETER C_FAMILY = spartan3e PARAMETER C_BAUDRATE = 9600 PARAMETER C_DATA_BITS = 8 PARAMETER C_USE_PARITY = 0 PARAMETER C_ODD_PARITY = 0 PARAMETER HW_VER = 1.01.a PARAMETER C_BASEADDR = 0x84000000 PARAMETER C_HIGHADDR = 0x8400ffff

Page 23: Microblaze on Spartan 3E Using Xilinx XPS 11.1

BUS_INTERFACE SPLB = mb_plb PORT RX = fpga_0_RS232_DTE_RX_pin PORT TX = fpga_0_RS232_DTE_TX_pinEND

BEGIN xps_uartlite PARAMETER INSTANCE = RS232_DCE PARAMETER C_FAMILY = spartan3e PARAMETER C_BAUDRATE = 115200 PARAMETER C_DATA_BITS = 8 PARAMETER C_USE_PARITY = 0 PARAMETER C_ODD_PARITY = 0 PARAMETER HW_VER = 1.01.a PARAMETER C_BASEADDR = 0x84020000 PARAMETER C_HIGHADDR = 0x8402ffff BUS_INTERFACE SPLB = mb_plb PORT RX = fpga_0_RS232_DCE_RX_pin PORT TX = fpga_0_RS232_DCE_TX_pinEND

BEGIN xps_gpio PARAMETER INSTANCE = LEDs_8Bit PARAMETER C_FAMILY = spartan3e PARAMETER C_ALL_INPUTS = 0 PARAMETER C_GPIO_WIDTH = 8 PARAMETER C_INTERRUPT_PRESENT = 0 PARAMETER C_IS_DUAL = 0 PARAMETER HW_VER = 2.00.a PARAMETER C_BASEADDR = 0x81400000 PARAMETER C_HIGHADDR = 0x8140ffff BUS_INTERFACE SPLB = mb_plb PORT GPIO_IO_O = fpga_0_LEDs_8Bit_GPIO_IO_O_pinENDBEGIN xps_gpio PARAMETER INSTANCE = DIP_Switches_4Bit PARAMETER C_FAMILY = spartan3e PARAMETER C_ALL_INPUTS = 1 PARAMETER C_GPIO_WIDTH = 4 PARAMETER C_INTERRUPT_PRESENT = 0 PARAMETER C_IS_DUAL = 0 PARAMETER HW_VER = 2.00.a PARAMETER C_BASEADDR = 0x81420000 PARAMETER C_HIGHADDR = 0x8142ffff BUS_INTERFACE SPLB = mb_plb PORT GPIO_IO_I = fpga_0_DIP_Switches_4Bit_GPIO_IO_I_pinEND

BEGIN xps_gpio PARAMETER INSTANCE = Buttons_4Bit PARAMETER C_FAMILY = spartan3e PARAMETER C_ALL_INPUTS = 1 PARAMETER C_GPIO_WIDTH = 4 PARAMETER C_INTERRUPT_PRESENT = 0 PARAMETER C_IS_DUAL = 0 PARAMETER HW_VER = 2.00.a PARAMETER C_BASEADDR = 0x81440000

Page 24: Microblaze on Spartan 3E Using Xilinx XPS 11.1

PARAMETER C_HIGHADDR = 0x8144ffff BUS_INTERFACE SPLB = mb_plb PORT GPIO_IO_I = fpga_0_Buttons_4Bit_GPIO_IO_I_pinEND

BEGIN xps_mch_emc PARAMETER INSTANCE = FLASH PARAMETER C_FAMILY = spartan3e PARAMETER C_NUM_BANKS_MEM = 1 PARAMETER C_NUM_CHANNELS = 0 PARAMETER C_MEM0_WIDTH = 8 PARAMETER C_MAX_MEM_WIDTH = 8 PARAMETER C_INCLUDE_DATAWIDTH_MATCHING_0 = 1 PARAMETER C_SYNCH_MEM_0 = 0 PARAMETER C_TCEDV_PS_MEM_0 = 110000 PARAMETER C_TAVDV_PS_MEM_0 = 110000 PARAMETER C_THZCE_PS_MEM_0 = 35000 PARAMETER C_TWC_PS_MEM_0 = 110000 PARAMETER C_TWP_PS_MEM_0 = 70000 PARAMETER C_TLZWE_PS_MEM_0 = 15000 PARAMETER HW_VER = 3.00.a PARAMETER C_MEM0_BASEADDR = 0x89000000 PARAMETER C_MEM0_HIGHADDR = 0x89ffffff BUS_INTERFACE SPLB = mb_plb PORT RdClk = clk_50_0000MHz PORT Mem_A = 0b00000000 & fpga_0_FLASH_Mem_A_pin_vslice_8_31_concat PORT Mem_CEN = fpga_0_FLASH_Mem_CEN_pin PORT Mem_OEN = fpga_0_FLASH_Mem_OEN_pin PORT Mem_WEN = fpga_0_FLASH_Mem_WEN_pin PORT Mem_DQ = fpga_0_FLASH_Mem_DQ_pinEND

BEGIN mpmc PARAMETER INSTANCE = DDR_SDRAM PARAMETER C_FAMILY = spartan3e PARAMETER C_NUM_PORTS = 1 PARAMETER C_SPECIAL_BOARD = S3E_STKIT PARAMETER C_MEM_TYPE = DDR PARAMETER C_MEM_PARTNO = MT46V32M16-6 PARAMETER C_MEM_BANKADDR_WIDTH = 2 PARAMETER C_MEM_DATA_WIDTH = 16 PARAMETER C_MEM_DM_WIDTH = 2 PARAMETER C_MEM_DQS_WIDTH = 2 PARAMETER C_PIM0_BASETYPE = 2 PARAMETER HW_VER = 5.00.a PARAMETER C_MPMC_BASEADDR = 0x8c000000 PARAMETER C_MPMC_HIGHADDR = 0x8fffffff BUS_INTERFACE SPLB0 = mb_plb PORT MPMC_Clk0 = clk_100_0000MHzDCM0 PORT MPMC_Clk90 = clk_100_0000MHz90DCM0 PORT MPMC_Rst = sys_periph_reset PORT DDR_Clk = fpga_0_DDR_SDRAM_DDR_Clk_pin PORT DDR_Clk_n = fpga_0_DDR_SDRAM_DDR_Clk_n_pin PORT DDR_CE = fpga_0_DDR_SDRAM_DDR_CE_pin PORT DDR_CS_n = fpga_0_DDR_SDRAM_DDR_CS_n_pin PORT DDR_RAS_n = fpga_0_DDR_SDRAM_DDR_RAS_n_pin

Page 25: Microblaze on Spartan 3E Using Xilinx XPS 11.1

PORT DDR_CAS_n = fpga_0_DDR_SDRAM_DDR_CAS_n_pin PORT DDR_WE_n = fpga_0_DDR_SDRAM_DDR_WE_n_pin PORT DDR_BankAddr = fpga_0_DDR_SDRAM_DDR_BankAddr_pin PORT DDR_Addr = fpga_0_DDR_SDRAM_DDR_Addr_pin PORT DDR_DQ = fpga_0_DDR_SDRAM_DDR_DQ_pin PORT DDR_DM = fpga_0_DDR_SDRAM_DDR_DM_pin PORT DDR_DQS = fpga_0_DDR_SDRAM_DDR_DQS_pin PORT DDR_DQS_Div_O = fpga_0_DDR_SDRAM_ddr_dqs_div_io_pin PORT DDR_DQS_Div_I = fpga_0_DDR_SDRAM_ddr_dqs_div_io_pinEND

BEGIN xps_ethernetlite PARAMETER INSTANCE = Ethernet_MAC PARAMETER C_FAMILY = spartan3e PARAMETER HW_VER = 2.01.a PARAMETER C_BASEADDR = 0x81000000 PARAMETER C_HIGHADDR = 0x8100ffff BUS_INTERFACE SPLB = mb_plb PORT PHY_tx_clk = fpga_0_Ethernet_MAC_PHY_tx_clk_pin PORT PHY_rx_clk = fpga_0_Ethernet_MAC_PHY_rx_clk_pin PORT PHY_crs = fpga_0_Ethernet_MAC_PHY_crs_pin PORT PHY_dv = fpga_0_Ethernet_MAC_PHY_dv_pin PORT PHY_rx_data = fpga_0_Ethernet_MAC_PHY_rx_data_pin PORT PHY_col = fpga_0_Ethernet_MAC_PHY_col_pin PORT PHY_rx_er = fpga_0_Ethernet_MAC_PHY_rx_er_pin PORT PHY_tx_en = fpga_0_Ethernet_MAC_PHY_tx_en_pin PORT PHY_tx_data = fpga_0_Ethernet_MAC_PHY_tx_data_pinEND

BEGIN clock_generator PARAMETER INSTANCE = clock_generator_0 PARAMETER C_CLKIN_FREQ = 50000000 PARAMETER C_CLKOUT0_FREQ = 100000000 PARAMETER C_CLKOUT0_PHASE = 90 PARAMETER C_CLKOUT0_GROUP = DCM0 PARAMETER C_CLKOUT0_BUF = TRUE PARAMETER C_CLKOUT1_FREQ = 100000000 PARAMETER C_CLKOUT1_PHASE = 0 PARAMETER C_CLKOUT1_GROUP = DCM0 PARAMETER C_CLKOUT1_BUF = TRUE PARAMETER C_CLKOUT2_FREQ = 50000000 PARAMETER C_CLKOUT2_PHASE = 0 PARAMETER C_CLKOUT2_GROUP = NONE PARAMETER C_CLKOUT2_BUF = TRUE PARAMETER HW_VER = 3.00.a PORT CLKIN = dcm_clk_s PORT CLKOUT0 = clk_100_0000MHz90DCM0 PORT CLKOUT1 = clk_100_0000MHzDCM0 PORT CLKOUT2 = clk_50_0000MHz PORT RST = net_gnd PORT LOCKED = Dcm_all_lockedEND

BEGIN mdm PARAMETER INSTANCE = mdm_0 PARAMETER C_MB_DBG_PORTS = 1

Page 26: Microblaze on Spartan 3E Using Xilinx XPS 11.1

PARAMETER C_USE_UART = 1 PARAMETER C_UART_WIDTH = 8 PARAMETER HW_VER = 1.00.e PARAMETER C_BASEADDR = 0x84400000 PARAMETER C_HIGHADDR = 0x8440ffff BUS_INTERFACE SPLB = mb_plb BUS_INTERFACE MBDEBUG_0 = microblaze_0_mdm_bus PORT Debug_SYS_Rst = Debug_SYS_RstEND

BEGIN proc_sys_reset PARAMETER INSTANCE = proc_sys_reset_0 PARAMETER C_EXT_RESET_HIGH = 1 PARAMETER HW_VER = 2.00.a PORT Slowest_sync_clk = clk_50_0000MHz PORT Ext_Reset_In = sys_rst_s PORT MB_Debug_Sys_Rst = Debug_SYS_Rst PORT Dcm_locked = Dcm_all_locked PORT MB_Reset = mb_reset PORT Bus_Struct_Reset = sys_bus_reset PORT Peripheral_Reset = sys_periph_resetEND

6.2. MSS File: system.mss

PARAMETER VERSION = 2.2.0

BEGIN OS PARAMETER OS_NAME = standalone PARAMETER OS_VER = 2.00.a PARAMETER PROC_INSTANCE = microblaze_0 PARAMETER STDIN = RS232_DTE PARAMETER STDOUT = RS232_DTEEND

BEGIN PROCESSOR PARAMETER DRIVER_NAME = cpu PARAMETER DRIVER_VER = 1.11.c PARAMETER HW_INSTANCE = microblaze_0 PARAMETER COMPILER = mb-gcc PARAMETER ARCHIVER = mb-arEND

BEGIN DRIVER PARAMETER DRIVER_NAME = bram PARAMETER DRIVER_VER = 1.00.a PARAMETER HW_INSTANCE = dlmb_cntlrEND

BEGIN DRIVER PARAMETER DRIVER_NAME = bram PARAMETER DRIVER_VER = 1.00.a PARAMETER HW_INSTANCE = ilmb_cntlr

Page 27: Microblaze on Spartan 3E Using Xilinx XPS 11.1

END

BEGIN DRIVER PARAMETER DRIVER_NAME = generic PARAMETER DRIVER_VER = 1.00.a PARAMETER HW_INSTANCE = lmb_bramEND

BEGIN DRIVER PARAMETER DRIVER_NAME = uartlite PARAMETER DRIVER_VER = 1.14.a PARAMETER HW_INSTANCE = RS232_DTEEND

BEGIN DRIVER PARAMETER DRIVER_NAME = uartlite PARAMETER DRIVER_VER = 1.14.a PARAMETER HW_INSTANCE = RS232_DCEEND

BEGIN DRIVER PARAMETER DRIVER_NAME = gpio PARAMETER DRIVER_VER = 2.13.a PARAMETER HW_INSTANCE = LEDs_8BitEND

BEGIN DRIVER PARAMETER DRIVER_NAME = gpio PARAMETER DRIVER_VER = 2.13.a PARAMETER HW_INSTANCE = DIP_Switches_4BitEND

BEGIN DRIVER PARAMETER DRIVER_NAME = gpio PARAMETER DRIVER_VER = 2.13.a PARAMETER HW_INSTANCE = Buttons_4BitEND

BEGIN DRIVER PARAMETER DRIVER_NAME = emc PARAMETER DRIVER_VER = 2.00.a PARAMETER HW_INSTANCE = FLASHEND

BEGIN DRIVER PARAMETER DRIVER_NAME = mpmc PARAMETER DRIVER_VER = 3.00.a PARAMETER HW_INSTANCE = DDR_SDRAMEND

BEGIN DRIVER PARAMETER DRIVER_NAME = emaclite PARAMETER DRIVER_VER = 1.14.a PARAMETER HW_INSTANCE = Ethernet_MACEND

Page 28: Microblaze on Spartan 3E Using Xilinx XPS 11.1

BEGIN DRIVER PARAMETER DRIVER_NAME = generic PARAMETER DRIVER_VER = 1.00.a PARAMETER HW_INSTANCE = clock_generator_0END

BEGIN DRIVER PARAMETER DRIVER_NAME = uartlite PARAMETER DRIVER_VER = 1.14.a PARAMETER HW_INSTANCE = mdm_0END

BEGIN DRIVER PARAMETER DRIVER_NAME = generic PARAMETER DRIVER_VER = 1.00.a PARAMETER HW_INSTANCE = proc_sys_reset_0END

• Start XPS• Using the Base System Builder Wizard and include following hardware components:     • MicroBlaze on Xilinx Spartan-3E Starter Board revision D, running in 50MHz• Build the hardware system using "Hardware" > "Generate Bitstream".

Step B. Hello World

• Click the "Application" tab in the left box and start a new application. • Set the other application to "inactive" • Write a hello world application and print a string using the statement

xil_printf("hello world\n"); /* xil_printf() is a light-weight version of printf() */

Page 29: Microblaze on Spartan 3E Using Xilinx XPS 11.1

• Open a hyperterminal and connect it to the serial port. (Programs > Accessories > Communications > HyperTerminal), set it to connect to the serial port (COM1), 9600 bit rate, 8 bit data and no parity• Connect the Spartan 3E FPGA to the USB port and serial port.• Build the software and download the bitstream to the FPGA

Part 2. Using LEDs via GPIO and input from UART

Step A. Use GPIO to control the LED

• The microblaze processor is configured in part 1 ti connect to the LED via GPIO. You can read from the GPIO and write to the GPIO. In this case, only writing is necessary. • Include header file "xgpio_1.h" to use the GPIO functions. • When using the GPIO, first you have to specify whether a bit is for input or output. Use the following to set it:

XGpio_Initialize(BASEADDR, DEVICE_ID);XGpio_mSetDataDirection(BASEADDR, 1, 0x00000000);

• The first parameter is the address mapped to the GPIO. The second parameter is the GPIO channel, which is 1 in this case. The third parameter is for setting the read/write mode of individual bit, 1 means for read and 0 means for write. • You can then write to the GPIO using the following function: XGpio_mSetDataReg(BASEADDR, 1, data);

• Write an application that turn on the LED lights one at a time from left to right (or any pattern of your choice). The lights should change every half a second. You can use a busy waiting loop here to wait for time.

Step B.Use Timer and Interrupt Handler

• Timer can be used to generate interrupt in regular intervals. A timer is setup in part 1 with interrupt enabled. When the timeout expired, a interrupt will be generated to your microblaze processor. To setup a interrupt handler, use the following function:

#include "xtmrctr_1.h"#include "xintc_1.h"

/* Enable MicroBlaze interrupts */microblaze_enable_interrupts();/* Register the interrupt handler in the vector table */ XIntc_RegisterHandler(INTC_BASEADDR, INTR, (XInterruptHandler)handler, (void*)BASEADDR); /* Start the interrupt controller */XIntc_mMasterEnable(INTC_BASEADDR);

Page 30: Microblaze on Spartan 3E Using Xilinx XPS 11.1

• to set the timer: /* Set the number of cycles the timer counts before interrupting */XTmrCtr_mSetLoadReg(BASEADDR, 0, time_tick);/* Reset the timers, and clear interrupts */XTmrCtr_mSetControlStatusReg(TIMER_BASEADDR, 0,XTC_CSR_INT_OCCURED_MASK | XTC_CSR_LOAD_MASK );/* Enable interrupt requests in the interrupt controller */XIntc_mEnableIntr(INTC_BASEADDR,                              TIMER_INTERRUPT_MASK);/* Start the timers */XTmrCtr_mSetControlStatusReg(TIMER_BASEADDR, 0,XTC_CSR_ENABLE_TMR_MASK | XTC_CSR_ENABLE_INT_MASK |XTC_CSR_AUTO_RELOAD_MASK | XTC_CSR_DOWN_COUNT_MASK);

• interruptHander is a function with the following function declaration: void handler(void * baseaddr_p);

• and for timer interrupt, you can use the following template:void timer_int_handler(void * baseaddr_p) {     unsigned int csr;     /* Read timer 0 CSR to see if it requested the interrupt */     csr = XTmrCtr_mGetControlStatusReg(BASEADDR, 0);     if (csr & INT_OCCURED_MASK) {          /* handler interrupt here*/     }     /* Clear the timer interrupt */     XTmrCtr_mSetControlStatusReg(BASEADDR, 0, csr);}

• Copy your code from step A and modify it to use the timer instead of busy-waiting loop.

Step C.Use UART to read character from serial port

• The microblaze processor is configured in part 1 to connect to the serial port via UART and use interrupt. When a character is entered into hyperterminal, the character is sent to the UART and an interrupt is generated. You can setup a interrupt handler for UART interrupt just like you did for timer interrupt, and read the characters one by one from the UART using the following function:

#include "xuartlite_1.h"

XUartLite_mIsReceiveEmpty(BASEADDR) is false when there is data waiting to be readXUartLite_RecvByte(BASEADDR) return one character (char)

Page 31: Microblaze on Spartan 3E Using Xilinx XPS 11.1

• enable UART interrupt

/* Enable interrupt requests in the interrupt controller */XIntc_mEnableIntr(INTC_BASEADDR,TIMER_INTERRUPT_MASK | UART_INTERRUPT_MASK);/* Enable UART interrupts */XUartLite_mEnableIntr(BASEADDR);

• Copy your code from step B and modify it to decrease the time between LED changes by half if a '[' is received and increase the time two times if a ']' is received.

CS122B, Winter 2007

Part 3. Write Characters to the LCD Display (Software)

In this part you will need to display characters in the 12 x 2 character LCD monitor on the FPGA. You should connect your Microblaze processor to the LCD using a GPIO. Your job is to add necessary hardwares to your Microblaze system, write software to correctly initialize the LCD and update the characters in the LCD according to the inputs from hyperterminal. The specification of the LCD is here. [• Although not necessary, it is recommended to set (SF_OE[C18]) (SF_WE[D17]) (SF_CE0[D16]) to '1']

Step A. Configure the hardware

• Add a GPIO instance to your Microblaze system• Update the memory map• Modify the hardware description (MHS) manually or using the XPS interface • Edit the UCF file to map GPIO pins to the corresponding pins for LCD

Step B. Write software to initialize the LCD

• Follow the specification, initialize the LCD and clear the LCD monitor.• You can use busy waiting loop or timer.• Test your initialize sequence

Step C. Write software to update the LCD

• You need to write a software to display the characters [a-zA-Z ,.] you enter in the hyperterminal to the LCD.• Configure the LCD to automatically advance the curser.• Use arrows to control the curser position. (the characters you will receive are a sequence of 3 characters: [1B 5B 41] to [1B 5B 44] in the order of up, down, right, left) • Use '<' '>' to rotate the display

Page 32: Microblaze on Spartan 3E Using Xilinx XPS 11.1

CS122B, Winter 2007

Q1. What is the design flow when developing a Microblaze system?Q2. How does Microblaze processor access other peripherals?Q3. Compare the software and hardware approaches to display characters in the LCD. How would you design a LCD display controller in VHDL. List the pros and cons of each approach.