[하만]세미콘 아카데미/verilog

0619 Microblaze_gpio

내머리속은이런걸로 2024. 7. 10. 12:22

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로 고정되어 불이 계속 켜지게 된다. togglex

 

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

 

 

 

'[하만]세미콘 아카데미 > verilog' 카테고리의 다른 글

0621 Microblaze interrupt  0 2024.07.10
0620 Microblaze_GPIO_MyIP  0 2024.07.10
0619 uvm_ram  0 2024.07.10
0618 UVM_Adder_HW  0 2024.07.10
0618 UVM  0 2024.07.10