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