FPGAs are best known for their flexibility and versatility. Such flexibility allows FPGAs not only to be used for custom logic circuits but also to implement a processor on it and even run Linux (or other operating systems) on the processor. The possibilities are only limited by imagination, and also by FPGA speed grade and size. This article will discuss how to create/implement a Microblaze processor and run Linux on Narvi FPGA Development Board. This series is based on our article series for Neso Artix 7 FPGA Module. So we highly recommend that you read the series for Neso and get yourself familiar with the steps. So let’s dive right in.
Structure To Run the Linux
- Section 1: Creating the Microblaze based design for Narvi
- Section 2: Generating Device Tree
- Section 3: Building Linux Image
- Section 4: Running Linux on Narvi
For following this article, you would require:
- Narvi Spartan 7 FPGA Development Board
- Xilinx Platform Cable JTAG debugger
- Xilinx Vivado installed on either Windows or Linux system
- Linux system (Ubuntu 14.04 64-bit on a Virtual Machine)
- Good internet connectivity
Section 1: Creating the Microblaze based design for Narvi
Creating a Microblaze based design for Narvi is very straightforward. Detailed steps for creating Microblaze based design are available in this article. Please go through the article and follow the steps to create a Microblaze based design. Make sure the Hello World and Memory Test Program runs and passes all tests.
To run our Linux system, we will be modifying the above created Microblaze based design. We need to modify this Microblaze IP block to be able to run Linux on the Narvi board. Open the above-created block design, double click on the Microblaze block and choose the Select Configuration as “Linux with MMU” as shown in the image below.
Also, we have to change the baud rate of UART. Double click on “uartlite” IP and set the baud rate as “115200”.
Now, the Microblaze based Linux capable design is completed. Click “Generate Bitstream” in the program and debug. Once the bitstream is generated successfully, export the hardware along with the bitstream. We will launch the SDK later in the next section.
Section 2: Generating Device Tree
On many platforms, the Linux kernel depends on a data structure called Device Tree to discover and configure different hardware components available on the board. The kernel uses the device tree in binary format which is generated by using the device tree compiler. The input to the device tree compiler is a text file (with extension .dts) that describes all the hardware and dependencies. This file can be edited manually if necessary. But fortunately, there are tools available that can help us generate a device tree from our Vivado/SDK projects.
Having completed all the steps before, now download the device-tree repository from Xilinx’s GitHub account: https://github.com/Xilinx/device-tree-xlnx. If you downloaded the zip file, extract it in the same location as your SDK workspace. The author extracted it to the “D:Projects\narvi_microblaze\narvi_microblaze.sdk\device-tree-xlnx-master” directory. To generate a Device tree follow the steps below.
Step 1: In Vivado, go to “File” and click “Launch SDK”. This will launch the SDK.
Step 2: In SDK, go to “Xilinx/Xilinx Tools” and click “Repositories”.
Step 3: In the dialog window, select “New” and select the device tree folder which you had downloaded and extracted to SDK workspace in the “Local Repositories” section. Click “OK”.
Step 4: Go to File -> New select “Board Support Package”. In the dialog window, select “device_tree” under “Board Support Package OS” and press “Finish” and then “OK” in another dialog that opens. This should generate a system.dts file along with a .dtsi file. We need both of them.
Step 5: We have to merge the ‘.dtsi’ and ‘.dts’ files. Merge these two files using a text editor (like Notepad++ etc) and copy the contents of system-top.dts and paste them in the .dtsi file just after the line model = “Xilinx MicroBlaze”. Don’t forget to add “/dts-v1/;” at the top of .dtsi file also. The final content should look like this:
Now, save this modified file as “narvi.dts”. And copy the “Narvi.dts” file to your Linux System.
Section 3: Building Linux Image
Now we need a Linux system to build Linux Image. In this article, the author used Ubuntu 14.04 64-bit for building a Linux image.
Follow the steps shown below to Build a Linux image:
Step 1: After a clean installation of Ubuntu 14.04, you will need a few packages to make Buildroot work. Run the following command in the Linux terminal to install those:
sudo apt-get install build-essential bison flex gettext libncurses5-dev texinfo autoconf automake libtool
Step 2: Create a convenient folder on your Linux system and ‘cd’ to that folder. The author created a directory with the name “narvi_linux” in his “home” directory. Now download buildroot to the created directory, either manually or by using the following command:
You can use the latest buildroot release instead of the above. Now, extract the downloaded tarball archive using the following command:
tar -xvf buildroot-2018.02.4.tar.gz
All extracted files should be in the “buildroot-2015.11” folder.
Step 3: We need a Linux kernel defconfig file for Narvi. Get the defconfig files from here.
narvi_defconfig file: place it under the directory “buildroot-2015.11/board/numato/narvi/” You will need to create respective directories named “numato” and “narvi”. Please note the kernel base address is set to 0x80000000 in the Linux kernel defconfig file. Please change it appropriately if the DDR3 base address is different in your Vivado project.
Now copy the “narvi.dts” to the same folder as well.
Now, buildroot defconfig file “numato_narvi_defconfig”: copy it to the “configs” folder inside buildroot root directory (i.e. “buildroot-2015.11/” ).
After setting up buildroot as mentioned above, change the directory to buildroot and execute the following command:
This will create a .config file for buildroot. Next, execute the below command:
Before executing the above command, please make sure that Python and OpenSSL header files should be installed in the Ubuntu system. If these files are not installed in your system execute the following commands to install.
To install python files run the following command:
sudo apt install python
To install OpenSSL header files execute the below command:
sudo apt install libssl-dev
After successful completion of the installation of those files, execute the “make” command. This command will build the kernel and its file system. This downloads the kernel sources and lots of other tools from the internet. It will take some time to finish building the kernel image, from 30 minutes to over an hour, or even more, depending on your machine’s capabilities and your internet speed.
After completion of the above steps, a Linux image “SimpleImage.narvi” will be created in the directory “buildroot-2018.02.4/output/images/”. This is the Linux kernel with the root file attached to it. We will use this file to boot Linux on Narvi Spartan 7 FPGA Development Board.
Section 4: Running Linux on Narvi
Step 1: Copy the Linux image and place it in a convenient directory. Now open SDK and connect the Xilinx Platform Cable to the Narvi Spartan 7 FPGA Development Board and power it up. Make sure the FT2232’s channel A is configured for RS232. Open any Serial terminal program (CoolTerm, PuTTY, Tera Term, etc.) at baud rate 115200 and connect it to Narvi.
Step 2: First run the Hello World program again to check everything is connected properly and to ensure that it works. Now, go to Xilinx -> XSCT Console, type in a command “target” it will show all the targets connected, note down the number where MicroBlaze 0 is connected (3 in this article), connect to MicroBlaze by giving the command:
Now, ‘cd’ to the directory where your kernel image is located (..\\narvi\\narvi.sdk\\images). Download the kernel image by using the following command:
Wait for the download to complete. If the kernel image is successfully downloaded, run the below command to continue the processor:
If all the above steps are completed successfully, you can observe Linux booting in the serial terminal as shown below:
You can log in to Linux with username “root” and password as “Narvi”. Now we have a successfully running Linux kernel in Narvi Spartan 7 FPGA Board. Congratulations! In the next article, we will see how to flash a kernel image to the onboard SPI Flash on Narvi!