Microblaze
: Xilinx에서 제공하는 소프트 프로세서 코어. FPGA에서 구현 가능한 32비트 RISC 프로세서.
- 소프트 프로세서 코어 : 프로그래머블 논리 장치[예: FPGA]에서 구현될 수 있는 프로세서 코어.
Microblaze GPIO
: FPGA의 외부 핀 또는 내부 논리와 통신하는데 사용한다. 기본적으로 단순한 디지털 신호를 읽고 쓰는 기능을 제공한다.
Microblaze GPIO 설정 방법 [ LED 16개 ON ]
1. block design에서 microblaze를 추가한다.
2. Run Block Automation에서 Local Memory를 설정하여 Flash Memory를 설정한다.
FlashMemory:전기적으로데이터를지우고다시기록할수있는비휘발성컴퓨터기억장치
3. Run Connection Automation을 하여 모든 모듈을 연결한다.
4.clk_wiz_q을 sys clock, reset 기능을 ON한다.
5. GPIO_0, LED를 Custom으로 설정한다.
6. LED 이름으로 설정한다.
7. uart를 추가하여 usb uart로 설정한다. 옵션
8. buadrate를 9600으로 설정한다.
Memory Mapping
1. GPIO_0의 주소가 0x4000_0000으로 설정되었다.
2. Create HDL Wrapper을 하여 위의 아이콘이 초록색으로 바뀌는 것을 확인한다.
: 하드웨어 설계를 포함하는 Block Design을 HDLVerilog 코드로 변환한다.
design_1_wrapper
1. [15:0] led_tri_io : led 16개가 gpio로 설정된 것을 확인한다.
constraint
## Clock signal
set_property -dict { PACKAGE_PIN W5 IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_34 ,Sch=CLK100MHZ
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports clk]
## LEDs
set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[0] }]; #IO_L23N_T3_A02_D18_14 ,Sch=LED0
set_property -dict { PACKAGE_PIN E19 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 ,Sch=LED1
set_property -dict { PACKAGE_PIN U19 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[2] }]; #IO_L15P_T2_DQS_RDWR_B_14 ,Sch=LED2
set_property -dict { PACKAGE_PIN V19 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[3] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 ,Sch=LED3
set_property -dict { PACKAGE_PIN W18 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[4] }]; #IO_L16P_T2_CSI_B_14 ,Sch=LED4
set_property -dict { PACKAGE_PIN U15 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[5] }]; #IO_L23P_T3_A03_D19_14 ,Sch=LED5
set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[6] }]; #IO_25_14 ,Sch=LED6
set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[7] }]; #IO_L24N_T3_A00_D16_14 ,Sch=LED7
set_property -dict { PACKAGE_PIN V13 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[8] }]; #IO_L24P_T3_A01_D17_14 ,Sch=LED8
set_property -dict { PACKAGE_PIN V3 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[9] }]; #IO_L6P_T0_34 ,Sch=LED9
set_property -dict { PACKAGE_PIN W3 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[10] }]; #IO_L6N_T0_VREF_34 ,Sch=LED10
set_property -dict { PACKAGE_PIN U3 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[11] }]; #IO_L9P_T1_DQS_34 ,Sch=LED11
set_property -dict { PACKAGE_PIN P3 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[12] }]; #IO_L12N_T1_MRCC_35 ,Sch=LED12
set_property -dict { PACKAGE_PIN N3 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[13] }]; #IO_L12P_T1_MRCC_35 ,Sch=LED13
set_property -dict { PACKAGE_PIN P1 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[14] }]; #IO_L19N_T3_VREF_35 ,Sch=LED14
set_property -dict { PACKAGE_PIN L1 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[15] }]; #IO_L6N_T0_VREF_35 ,Sch=LED15
##Buttons
set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { reset }]; #IO_L18N_T2_A11_D27_14 ,Sch=BTNC
2. 이렇게 설정해준 후 bitstream을 한다.
create file
1. Export Hardward을 하여 파일을 생성한다.
2. Vitis IDE를 생성한다.
Vitis IDE : Xilinx의 FPGA 장치를 대상으로 하는 soft application을 개발할 수 있게 한다.
VITIS IDE
1. Create Applicaton Project에 들어간다.
2. Export Hardware로 만들어진 파일을 선택한다.
3. Project 제목을 정하고 Template을 'Hello World'로 정한다.
Project name
Templates
4. src.helloWorld.c의 파일을 확인한다.
src.helloworld.c main 함
5. uart 신호를 설정한다. 장치관리자의 port 번호와 baudrate 값을 맞춘다.
+ 선택
6. 파일에서 Run_As를 선택하여 실행한다.
7. parameter 값을 설정해주는 파일을 추가한다.
F3 누르
8. 코드를 추가한다.
- GPIO의 TRI를 설정하여 output으로 설정한다. [ offset : 4 ]
- GPIO_DATA 값을 설정하여 불을 켜고 0.2초마다 toggle 동작을 설정한다. [ offset : 0 ]
9. Run As HardWare을 실행한다.
video
과제
- upButton을 누르면 오른쪽 led 8개 ON
- downButton을 누르면 왼쪽 led 8개 ON
block design
gpio_0에 led, gpio_1에 button 신호를 연결하였다.
GPIO LED
총 16개의 LED를 킬 것이기 때문에 GPIO Width는 16이다.
GPIO Button
2개의 button을 사용할 것이기 때문에 GPIO Width는 2이다.
Address Map
- gpio_0의 메모리 주소 : 0x4000_0000
- gpio_1의 메모리 주소 : 0x4001_0000
design_1_wrapper.v
- input [1:0] button_tri_io : gpio button 2개를 사용한다.
- input [15:0] led_tri_io : gpio led 16개를 사용한다.
c언어
- #define을 사용하여 GPIO 2개의 Base Address의 값을 각각의 변수명에 지정해준다.
- GPIO_TRI의 Address Space Offset의 값이 4이며, 0과 1의 값을 주어 input, output 상태를 설정해준다. datasheet
- up Button push : GPIO_1인 button의 0번째 배열에 해당하는 주소 값이 1이 들어온다.
- 0x0000ff00 : GPIO_0인 led의 8번째 배열부터 15번째 배열까지 1의 값이 들어온다.
- down Button push : GPIO_1인 button의 1번째 배열에 해당하는 주소 값이 1이 들어온다.
- 0x000000ff : GPIO_0인 led의 0번째 배열부터 7번째 배열까지 1의 값이 들어온다.
→ 버튼을 한 번 누르면 해당 주소값이 1로 고정되어 불이 계속 켜지게 된다. toggle동작x
datasheet
constraint
## Clock signal
set_property -dict { PACKAGE_PIN W5 IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_34 ,Sch=CLK100MHZ
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports clk]
## LEDs
set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[0] }]; #IO_L23N_T3_A02_D18_14 ,Sch=LED0
set_property -dict { PACKAGE_PIN E19 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 ,Sch=LED1
set_property -dict { PACKAGE_PIN U19 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[2] }]; #IO_L15P_T2_DQS_RDWR_B_14 ,Sch=LED2
set_property -dict { PACKAGE_PIN V19 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[3] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 ,Sch=LED3
set_property -dict { PACKAGE_PIN W18 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[4] }]; #IO_L16P_T2_CSI_B_14 ,Sch=LED4
set_property -dict { PACKAGE_PIN U15 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[5] }]; #IO_L23P_T3_A03_D19_14 ,Sch=LED5
set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[6] }]; #IO_25_14 ,Sch=LED6
set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[7] }]; #IO_L24N_T3_A00_D16_14 ,Sch=LED7
set_property -dict { PACKAGE_PIN V13 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[8] }]; #IO_L24P_T3_A01_D17_14 ,Sch=LED8
set_property -dict { PACKAGE_PIN V3 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[9] }]; #IO_L6P_T0_34 ,Sch=LED9
set_property -dict { PACKAGE_PIN W3 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[10] }]; #IO_L6N_T0_VREF_34 ,Sch=LED10
set_property -dict { PACKAGE_PIN U3 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[11] }]; #IO_L9P_T1_DQS_34 ,Sch=LED11
set_property -dict { PACKAGE_PIN P3 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[12] }]; #IO_L12N_T1_MRCC_35 ,Sch=LED12
set_property -dict { PACKAGE_PIN N3 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[13] }]; #IO_L12P_T1_MRCC_35 ,Sch=LED13
set_property -dict { PACKAGE_PIN P1 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[14] }]; #IO_L19N_T3_VREF_35 ,Sch=LED14
set_property -dict { PACKAGE_PIN L1 IOSTANDARD LVCMOS33 } [get_ports { led_tri_io[15] }]; #IO_L6N_T0_VREF_35 ,Sch=LED15
##Buttons
set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { reset }]; #IO_L18N_T2_A11_D27_14 ,Sch=BTNC
set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { button_tri_io[0] }]; #IO_L17N_T2_A13_D29_14 ,Sch=BTNU
#set_property -dict { PACKAGE_PIN W19 IOSTANDARD LVCMOS33 } [get_ports { fndSel[1] }]; #IO_L16N_T2_A15_D31_14 ,Sch=BTNL
#set_property -dict { PACKAGE_PIN T17 IOSTANDARD LVCMOS33 } [get_ports { fndSel[0] }]; #IO_L17P_T2_A14_D30_14 ,Sch=BTNR
set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { button_tri_io[1] }]; #IO_L18P_T2_A12_D28_14 ,Sch=BTND
video