본문 바로가기
# Semiconductor/- Semicon Academy

[Harman 세미콘 아카데미] 97일차 - SoC Design(UltraSonic, 온습도센서/DHT11)

by Graffitio 2023. 11. 22.
[Harman 세미콘 아카데미] 97일차 - SoC Design(UltraSonic, 온습도센서/DHT11)
728x90
반응형
[UltraSonic]

 

📌 Block Design

 

입력을 연결해준 것처럼, 출력값 또한 레지스터에 연결해줄 수 있다.

이 방식을 사용해 초음파센서(DHT11) IP을 설계해보자

 

출력을 메모리에 보낸다는 뜻

 

 

// 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 작성

 

#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

 

// 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

 

#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
반응형