728x90
[UltraSonic]
📌 Block Design
입력을 연결해준 것처럼, 출력값 또한 레지스터에 연결해줄 수 있다.
이 방식을 사용해 초음파센서(DHT11) IP을 설계해보자



cpp
접기// Users to add ports here input echo, // 외부에서 입력을 받아야 하므로 output trig, // User ports ends wire [15:0] distance_cm; // Address decoding for reading registers case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] ) 3'h0 : reg_data_out <= distance_cm; 3'h1 : reg_data_out <= slv_reg1; 3'h2 : reg_data_out <= slv_reg2; 3'h3 : reg_data_out <= slv_reg3; 3'h4 : reg_data_out <= slv_reg4; 3'h5 : reg_data_out <= slv_reg5; 3'h6 : reg_data_out <= slv_reg6; 3'h7 : reg_data_out <= slv_reg7; default : reg_data_out <= 0; endcase end // Output register or memory read data // Add user logic here UltraSonic_Profsr usonic( .clk(S_AXI_ACLK), .rst(~S_AXI_ARESETN), .echo(echo), .trig(trig), // 얘는 일정 시간 간격으로 쏘게끔 설계했으므로, Output 처리 //.distance_cm(slv_reg1) // 레지스터 저장하는 것은 AXI가 하는 거라서 이렇게 하면 안 됨 .distance_cm(distance_cm) // wire로 따로 선언해주고 연결해버리면 된다. // output reg [7:0] LED_bar // 안 쓸 거는 빼버리면 됨 ); // User logic ends
cf) slv_reg에 저장하는 것은 AXI가 할 일이다.
따라서 wire로 따로 선언해준 뒤 연결해주는 방식으로 코딩하자.
상위모듈에도 마찬가지로 Port 선언 및 Instantiation해준 모듈에도 변수 추가


📌 Main Code 작성
cpp
접기#include <stdio.h> #include "platform.h" #include "xil_printf.h" #include "xparameters.h" int main() { init_platform(); printf("Start!!\n\r"); volatile unsigned int *ultra_sonic = (volatile unsigned int *) 0x44A00000; while(1) { xil_printf("Distance : %d \n\r", ultra_sonic[0]); MB_Sleep(100); } // print("Hello World\n\r"); cleanup_platform(); return 0; }

[온습도 센서(DHT11)]
📌 Block Design
cpp
접기// Users to add ports here inout dht11_data, // User ports ends // Instantiation of Axi Bus Interface S00_AXI myip_DHT11_v1_0_S00_AXI # ( .C_S_AXI_DATA_WIDTH(C_S00_AXI_DATA_WIDTH), .C_S_AXI_ADDR_WIDTH(C_S00_AXI_ADDR_WIDTH) ) myip_DHT11_v1_0_S00_AXI_inst ( .dht11_data(dht11_data), .S_AXI_ACLK(s00_axi_aclk), .S_AXI_ARESETN(s00_axi_aresetn), .S_AXI_AWADDR(s00_axi_awaddr),

📌 Main Code
cpp
접기#include <stdio.h> #include "platform.h" #include "xil_printf.h" #include "xparameters.h" #include "myip_DHT11.h" int main() { init_platform(); printf("Start!!\n\r"); volatile unsigned int *dht11_data = (volatile unsigned int *) 0x44A00000; while(1) { xil_printf("Data : %d %d \n\r", dht11_data[0], dht11_data[1]); MB_Sleep(1000); } // print("Hello World\n\r"); cleanup_platform(); return 0; }

Generation Output Products

Block Design을 생성한 뒤, 수정하고 나서 설정해주는 창인데
Global은 모든 Block을 다시 새로 만드는 옵션이고
Out of Context per IP는 수정한 Block만 재생성하는 옵션이다.
시간적으로는 후자가 더 빠른데, 우리가 할 디자인에서 그렇게 큰 차이를 보이지도 않고
지맘대로 Output에 버퍼를 달아서 출력값이 엉뚱하게 나오는 등의 오류가 발생하므로
시간이 좀 걸리더라도 Global 옵션으로 Generate해주자.
728x90