//
// rfnoc-hls-neuralnet: Vivado HLS code for neural-net building blocks
//
// Copyright (C) 2017 EJ Kreinar
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
#include <iostream>
#include "myproject.h"
//hls-fpga-machine-learning insert weights
#include "weights/w2.h"
#include "weights/b2.h"
#include "weights/w4.h"
#include "weights/b4.h"
#include "weights/w6.h"
#include "weights/b6.h"
#include "weights/w8.h"
#include "weights/b8.h"
void myproject(
input_t input_1[N_INPUT_1_1],
result_t layer9_out[N_LAYER_8],
unsigned short &const_size_in_1,
unsigned short &const_size_out_1
) {
//hls-fpga-machine-learning insert IO
#pragma HLS ARRAY_RESHAPE variable=input_1 complete dim=0
#pragma HLS ARRAY_RESHAPE variable=layer9_out complete dim=0
#pragma HLS INTERFACE ap_vld port=input_1,layer9_out
#pragma HLS PIPELINE
const_size_in_1 = N_INPUT_1_1;
const_size_out_1 = N_LAYER_8;
// ****************************************
// NETWORK INSTANTIATION
// ****************************************
//hls-fpga-machine-learning insert layers
layer2_t layer2_out[N_LAYER_2];
#pragma HLS ARRAY_PARTITION variable=layer2_out complete dim=0
nnet::dense<input_t, layer2_t, config2>(input_1, layer2_out, w2, b2);
layer3_t layer3_out[N_LAYER_2];
#pragma HLS ARRAY_PARTITION variable=layer3_out complete dim=0
nnet::relu<layer2_t, layer3_t, relu_config3>(layer2_out, layer3_out);
layer4_t layer4_out[N_LAYER_4];
#pragma HLS ARRAY_PARTITION variable=layer4_out complete dim=0
nnet::dense<layer3_t, layer4_t, config4>(layer3_out, layer4_out, w4, b4);
layer5_t layer5_out[N_LAYER_4];
#pragma HLS ARRAY_PARTITION variable=layer5_out complete dim=0
nnet::relu<layer4_t, layer5_t, relu_config5>(layer4_out, layer5_out);
layer6_t layer6_out[N_LAYER_6];
#pragma HLS ARRAY_PARTITION variable=layer6_out complete dim=0
nnet::dense<layer5_t, layer6_t, config6>(layer5_out, layer6_out, w6, b6);
layer7_t layer7_out[N_LAYER_6];
#pragma HLS ARRAY_PARTITION variable=layer7_out complete dim=0
nnet::relu<layer6_t, layer7_t, relu_config7>(layer6_out, layer7_out);
layer8_t layer8_out[N_LAYER_8];
#pragma HLS ARRAY_PARTITION variable=layer8_out complete dim=0
nnet::dense<layer7_t, layer8_t, config8>(layer7_out, layer8_out, w8, b8);
nnet::softmax<layer8_t, result_t, softmax_config9>(layer8_out, layer9_out);
}
入力層 16 入力
dense 16 入力 64 出力
relu
dense 64 入力 32 出力
relu
dense 32 入力 32 出力
relu
dense 32 入力 5 出力
softmax 5 出力
entity myproject is
port (
ap_clk : IN STD_LOGIC;
ap_rst : IN STD_LOGIC;
ap_start : IN STD_LOGIC;
ap_done : OUT STD_LOGIC;
ap_idle : OUT STD_LOGIC;
ap_ready : OUT STD_LOGIC;
input_1_V_ap_vld : IN STD_LOGIC;
input_1_V : IN STD_LOGIC_VECTOR (255 downto 0);
layer9_out_V : OUT STD_LOGIC_VECTOR (79 downto 0);
layer9_out_V_ap_vld : OUT STD_LOGIC;
const_size_in_1 : OUT STD_LOGIC_VECTOR (15 downto 0);
const_size_in_1_ap_vld : OUT STD_LOGIC;
const_size_out_1 : OUT STD_LOGIC_VECTOR (15 downto 0);
const_size_out_1_ap_vld : OUT STD_LOGIC );
end;
set_property IOSTANDARD TMDS_33 [get_ports TMDS_tx_0_B_p]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_tx_1_R_p]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_tx_2_G_p]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_tx_clk_p]
set_property PACKAGE_PIN H16 [get_ports TMDS_tx_clk_p]
set_property PACKAGE_PIN D19 [get_ports TMDS_tx_0_B_p]
set_property PACKAGE_PIN C20 [get_ports TMDS_tx_1_R_p]
set_property PACKAGE_PIN B19 [get_ports TMDS_tx_2_G_p]
set_false_path -from [get_clocks clk_fpga_0] -to [get_clocks [get_clocks -of_objects [get_pins lapfilter_axis_i/bitmap_disp_cntrler_axi_master_0/inst/dvi_disp_i/BUFR_pixel_clk_io/O]]]
set_false_path -from [get_clocks [get_clocks -of_objects [get_pins lapfilter_axis_i/bitmap_disp_cntrler_axi_master_0/inst/dvi_disp_i/BUFR_pixel_clk_io/O]]] -to [get_clocks clk_fpga_0]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_tx_0_B_p]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_tx_1_R_p]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_tx_2_G_p]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_tx_clk_p]
set_property PACKAGE_PIN K17 [get_ports TMDS_tx_0_B_p]
set_property PACKAGE_PIN K19 [get_ports TMDS_tx_1_R_p]
set_property PACKAGE_PIN J18 [get_ports TMDS_tx_2_G_p]
set_property PACKAGE_PIN L16 [get_ports TMDS_tx_clk_p]
set_false_path -from [get_clocks clk_fpga_0] -to [get_clocks [get_clocks -of_objects [get_pins lapfilter_axis_i/bitmap_disp_cntrler_axi_master_0/inst/dvi_disp_i/BUFR_pixel_clk_io/O]]]
set_false_path -from [get_clocks [get_clocks -of_objects [get_pins lapfilter_axis_i/bitmap_disp_cntrler_axi_master_0/inst/dvi_disp_i/BUFR_pixel_clk_io/O]]] -to [get_clocks clk_fpga_0]
/*
* lapfilter_axis.c
*
* Created on: 2019/06/21
* Author: marsee
*/
#include <stdio.h>
#include "xil_io.h"
#include "xparameters.h"
#include "xlap_filter_axis.h"
#include "xdma2axis.h"
#include "xaxis2dma2st.h"
#include "bmp_data.h"
#define FRAME_BUFFER_ADDRESS 0x10000000
#define DMA_DEST_ADDRESS 0x10200000
#define HORIZONTAL_PIXELS 800
#define VERTICAL_LINES 600
int bmp_write(unsigned int addr);
int main(){
XLap_filter_axis xlf_axis_ap;
XDma2axis xdma2axis_ap;
XAxis2dma2st xaxis2dma_ap;
int inbyte_in;
XLap_filter_axis_Initialize(&xlf_axis_ap, 0);
XDma2axis_Initialize(&xdma2axis_ap, 0);
XAxis2dma2st_Initialize(&xaxis2dma_ap, 0);
XDma2axis_Set_y_size(&xdma2axis_ap, (u32)VERTICAL_LINES);
XDma2axis_Set_x_size(&xdma2axis_ap, (u32)HORIZONTAL_PIXELS);
XDma2axis_Set_sel(&xdma2axis_ap, (u32)0);
XDma2axis_Set_in_V(&xdma2axis_ap, (u32)FRAME_BUFFER_ADDRESS);
XAxis2dma2st_Set_y_size(&xaxis2dma_ap, (u32)VERTICAL_LINES);
XAxis2dma2st_Set_x_size(&xaxis2dma_ap, (u32)HORIZONTAL_PIXELS);
XAxis2dma2st_Set_sel(&xaxis2dma_ap, (u32)0);
XAxis2dma2st_Set_out_V(&xaxis2dma_ap, (u32)DMA_DEST_ADDRESS);
bmp_write(FRAME_BUFFER_ADDRESS);
bmp_write(FRAME_BUFFER_ADDRESS);
XAxis2dma2st_Start(&xaxis2dma_ap);
XLap_filter_axis_Start(&xlf_axis_ap);
XDma2axis_Start(&xdma2axis_ap);
Xil_Out32(XPAR_BITMAP_DISP_CNTRLER_AXI_MASTER_0_BASEADDR, DMA_DEST_ADDRESS);
while(1){
printf("\nPlease input <0> or <1> (<q> : exit) = ");
fflush(stdout);
inbyte_in = inbyte();
printf("%c", inbyte_in);
fflush(stdout);
switch(inbyte_in) {
case '0': //bmp image
XDma2axis_Set_sel(&xdma2axis_ap, (u32)0);
XAxis2dma2st_Set_sel(&xaxis2dma_ap, (u32)0);
XAxis2dma2st_Start(&xaxis2dma_ap);
XLap_filter_axis_Start(&xlf_axis_ap);
XDma2axis_Start(&xdma2axis_ap);
break;
case '1': // Laplacian filter
XDma2axis_Set_sel(&xdma2axis_ap, (u32)1);
XAxis2dma2st_Set_sel(&xaxis2dma_ap, (u32)1);
XAxis2dma2st_Start(&xaxis2dma_ap);
XLap_filter_axis_Start(&xlf_axis_ap);
XDma2axis_Start(&xdma2axis_ap);
break;
case 'q': // exit
return(0);
}
}
}
int bmp_write(unsigned int addr){
for(int y=0; y<VERTICAL_LINES; y++){
for(int x=0; x<HORIZONTAL_PIXELS; x++){
Xil_Out32(addr+(y*HORIZONTAL_PIXELS+x)*sizeof(int),
((int)bmp_file_array[y][x][2]<<16)+((int)bmp_file_array[y][x][1]<<8)+(int)bmp_file_array[y][x][0]);
}
}
return(0);
}
set_property IOSTANDARD LVCMOS33 [get_ports {vga_blue[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_blue[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_blue[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_blue[0]}]
set_property PACKAGE_PIN J18 [get_ports {vga_blue[3]}]
set_property PACKAGE_PIN K19 [get_ports {vga_blue[2]}]
set_property PACKAGE_PIN M20 [get_ports {vga_blue[1]}]
set_property PACKAGE_PIN P20 [get_ports {vga_blue[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_blue[4]}]
set_property PACKAGE_PIN G19 [get_ports {vga_blue[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_green[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_green[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_green[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_green[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_green[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_green[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_red[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_red[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_red[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_red[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_red[0]}]
set_property PACKAGE_PIN F20 [get_ports {vga_green[5]}]
set_property PACKAGE_PIN H20 [get_ports {vga_green[4]}]
set_property PACKAGE_PIN J19 [get_ports {vga_green[3]}]
set_property PACKAGE_PIN L19 [get_ports {vga_green[2]}]
set_property PACKAGE_PIN N20 [get_ports {vga_green[1]}]
set_property PACKAGE_PIN H18 [get_ports {vga_green[0]}]
set_property PACKAGE_PIN F19 [get_ports {vga_red[4]}]
set_property PACKAGE_PIN G20 [get_ports {vga_red[3]}]
set_property PACKAGE_PIN J20 [get_ports {vga_red[2]}]
set_property PACKAGE_PIN L20 [get_ports {vga_red[1]}]
set_property PACKAGE_PIN M19 [get_ports {vga_red[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports vga_hsync]
set_property IOSTANDARD LVCMOS33 [get_ports vga_vsync]
set_property PACKAGE_PIN P19 [get_ports vga_hsync]
set_property PACKAGE_PIN R19 [get_ports vga_vsync]
set_false_path -from [get_clocks clk_fpga_0] -to [get_clocks [get_clocks -of_objects [get_pins lapfilter_axis_i/bitmap_disp_cntrler_axi_master_0/inst/dvi_disp_i/BUFR_pixel_clk_io/O]]]
set_false_path -from [get_clocks [get_clocks -of_objects [get_pins lapfilter_axis_i/bitmap_disp_cntrler_axi_master_0/inst/dvi_disp_i/BUFR_pixel_clk_io/O]]] -to [get_clocks clk_fpga_0]
// rot_sim.cpp
// 2019/06/15 by marsee
//
#include <ap_int.h>
#include "ap_utils.h"
#define WAIT_COUNT 10
int rot_sim(ap_uint<1> rev, volatile ap_uint<1> &sa, volatile ap_uint<1> &sb){
#pragma HLS INTERFACE ap_none port=sb
#pragma HLS INTERFACE ap_none port=sa
if(rev == 0){ // Normal rotation
sa = 0; sb = 0;
ap_wait_n(WAIT_COUNT);
sa = 1; sb = 0;
ap_wait_n(WAIT_COUNT);
sa = 1; sb = 1;
ap_wait_n(WAIT_COUNT);
sa = 0; sb = 1;
ap_wait_n(WAIT_COUNT);
}else{
sa = 0; sb = 0;
ap_wait_n(WAIT_COUNT);
sa = 0; sb = 1;
ap_wait_n(WAIT_COUNT);
sa = 1; sb = 1;
ap_wait_n(WAIT_COUNT);
sa = 1; sb = 0;
ap_wait_n(WAIT_COUNT);
}
return(0);
}
// rot_sim_tb.cpp
// 2019/06/15 by marsee
//
#include <ap_int.h>
int rot_sim(ap_uint<1> rev, ap_uint<1> &sa, ap_uint<1> &sb);
int main(){
ap_uint<1> sa, sb;
rot_sim(0, sa, sb);
rot_sim(1, sa, sb);
return(0);
}
// motor_count.v
// 2019/06/14 by marsee
// このファイルは、立命館大学の泉先生のVerilogコードを元に作成しました。泉先生ありがとうございました。
//
`default_nettype none
module moter_count #(
parameter integer BW =32
)
(
input wire sa,
input wire sb,
output wire [BW-1:0] count,
input wire clk,
input wire rst,
input wire cnt_clr
);
reg sa1b=1'b0, sa2b=1'b0;
reg sb1b=1'b0, sb2b=1'b0;
wire [1:0] sasb_state;
reg [BW-1:0] count_r=0;
parameter [3:0] NOR_STATE_00 = 4'b0001,
NOR_STATE_10 = 4'b0010,
NOR_STATE_11 = 4'b0100,
NOR_STATE_01 = 4'b1000;
reg [3:0] rev_rot, rev_rot_1b;
parameter [3:0] REV_STATE_00 = 4'b0001,
REV_STATE_01 = 4'b0010,
REV_STATE_11 = 4'b0100,
REV_STATE_10 = 4'b1000;
reg [3:0] nor_rot=NOR_STATE_00, nor_rot_1b=REV_STATE_00;
assign count = count_r;
always @(posedge clk) begin
sa1b <= sa;
sb1b <= sb;
sa2b <= sa1b;
sb2b <= sb1b;
nor_rot_1b <= nor_rot;
rev_rot_1b <= rev_rot;
end
always @(posedge clk) begin
if(rst)
count_r <= 0;
else if(cnt_clr)
count_r <= 0;
else begin
if(nor_rot==NOR_STATE_00 && nor_rot_1b==NOR_STATE_01) begin
if(rev_rot==REV_STATE_00 && rev_rot_1b==REV_STATE_10) begin
count_r <= count_r;
end else begin
count_r <= count_r + 1;
end
end else begin
if(rev_rot==REV_STATE_00 && rev_rot_1b==REV_STATE_10) begin
count_r <= count_r - 1;
end else begin
count_r <= count_r;
end
end
end
end
assign sasb_state = {sa2b, sb2b};
// nor_rot state machine
always @(posedge clk) begin
if(rst)
nor_rot <= NOR_STATE_00;
else begin
case(nor_rot)
NOR_STATE_00:
if(sasb_state==2'b10)
nor_rot <= NOR_STATE_10;
NOR_STATE_10:
if(sasb_state == 2'b11)
nor_rot <= NOR_STATE_11;
NOR_STATE_11:
if(sasb_state == 2'b01)
nor_rot <= NOR_STATE_01;
NOR_STATE_01:
if(sasb_state == 2'b00)
nor_rot <= NOR_STATE_00;
endcase
end
end
// rev_rot state machine
always @(posedge clk) begin
if(rst)
rev_rot <= REV_STATE_00;
else begin
case(rev_rot)
REV_STATE_00:
if(sasb_state==2'b01)
nor_rot <= NOR_STATE_01;
REV_STATE_01:
if(sasb_state == 2'b11)
nor_rot <= NOR_STATE_11;
REV_STATE_11:
if(sasb_state == 2'b10)
nor_rot <= NOR_STATE_10;
REV_STATE_10:
if(sasb_state == 2'b00)
nor_rot <= NOR_STATE_00;
endcase
end
end
endmodule
`default_nettype wire
// axis2DMA2st.cpp
// 2019/06/08 by marsee
//
#include <ap_int.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>
int axis2DMA2st(hls::stream<ap_axis<32,1,1,1> >& ins0, hls::stream<ap_axis<32,1,1,1> >& ins1,
int sel, int x_size, int y_size, volatile ap_int<32> *out){
#pragma HLS INTERFACE s_axilite port=return
#pragma HLS INTERFACE m_axi depth=480000 port=out offset=slave
#pragma HLS INTERFACE axis register both port=ins1
#pragma HLS INTERFACE axis register both port=ins0
ap_axis<32,1,1,1> val;
Loop1 : do { // user が 1 になった時にスタート
#pragma HLS LOOP_TRIPCOUNT min=1 max=1 avg=1
if(sel == 0)
ins0 >> val;
else
ins1 >> val;
} while(val.user == 0);
for(int y=0; y<y_size; y++){
#pragma HLS LOOP_TRIPCOUNT min=600 max=600 avg=600
for(int x=0; x<x_size; x++){
#pragma HLS LOOP_TRIPCOUNT min=800 max=800 avg=800
//#pragma HLS PIPELINE II=1
if(!(y==0 && x==0)){
if(sel == 0)
ins0 >> val;
else
ins1 >> val;
}
out[y*x_size+x] = val.data;
}
}
return(0);
}
// axis2DMA2st_tb.cpp
// 2019/06/09 by marsee
//
#include <iostream>
#include "hls_opencv.h"
#include <ap_int.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>
#include "bmp_data.h"
char OUTPUT_BMP_FILE0[] = "test0.bmp";
char OUTPUT_BMP_FILE1[] = "test1.bmp";
int axis2DMA2st(hls::stream<ap_axis<32,1,1,1> >& ins0, hls::stream<ap_axis<32,1,1,1> >& ins1,
int sel, int x_size, int y_size, volatile ap_int<32> *out);
int main(){
hls::stream<ap_axis<32,1,1,1> > ins0;
hls::stream<ap_axis<32,1,1,1> > ins1;
ap_axis<32,1,1,1> axisp;
ap_int<32> *wr_bmp0, *wr_bmp1;
for(int y=0; y<Y_SIZE; y++){
for(int x=0; x<X_SIZE; x++){
axisp.data = (ap_int<32>)bmp_file_array[y][x][0] | ((ap_int<32>)bmp_file_array[y][x][1])<<8 | ((ap_int<32>)bmp_file_array[y][x][2])<<16;
if(y==0 && x==0)
axisp.user = 1;
else
axisp.user = 0;
if(x == X_SIZE-1)
axisp.last = 1;
else
axisp.last = 0;
ins0 << axisp;
ins1 << axisp;
}
}
if((wr_bmp0 =(ap_int<32> *)malloc(sizeof(ap_int<32>) * (X_SIZE * Y_SIZE))) == NULL){
fprintf(stderr, "Can't allocate wr_bmp0 memory\n");
exit(1);
}
if((wr_bmp1 =(ap_int<32> *)malloc(sizeof(ap_int<32>) * (X_SIZE * Y_SIZE))) == NULL){
fprintf(stderr, "Can't allocate wr_bmp1 memory\n");
exit(1);
}
axis2DMA2st(ins0, ins1, 0, X_SIZE, Y_SIZE, wr_bmp0);
cv::Mat img(Y_SIZE, X_SIZE, CV_8UC3);
cv::Mat_<cv::Vec3b> dst_vec3b = cv::Mat_<cv::Vec3b>(img);
for (int y=0; y<Y_SIZE; y++){
for (int x=0; x<X_SIZE; x++){
ap_int<32> data = wr_bmp0[y*X_SIZE+x];
cv::Vec3b pixel;
pixel[0] = data & 0xff; // blue
pixel[1] = (data >> 8) & 0xff; // green
pixel[2] = (data >> 16) & 0xff; // red
dst_vec3b(y,x) = pixel;
}
}
cv::imwrite(OUTPUT_BMP_FILE0, img);
axis2DMA2st(ins0, ins1, 1, X_SIZE, Y_SIZE, wr_bmp1);
for (int y=0; y<Y_SIZE; y++){
for (int x=0; x<X_SIZE; x++){
ap_int<32> data = wr_bmp1[y*X_SIZE+x];
cv::Vec3b pixel;
pixel[0] = data & 0xff; // blue
pixel[1] = (data >> 8) & 0xff; // green
pixel[2] = (data >> 16) & 0xff; // red
dst_vec3b(y,x) = pixel;
}
}
cv::imwrite(OUTPUT_BMP_FILE1, img);
return(0);
}
// axis2DMA2st.cpp
// 2019/06/08 by marsee
// 2019/06/20 bug fix
//
#include <ap_int.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>
int axis2DMA2st(hls::stream<ap_axis<32,1,1,1> >& ins0, hls::stream<ap_axis<32,1,1,1> >& ins1,
int sel, int x_size, int y_size, volatile ap_int<32> *out){
#pragma HLS INTERFACE s_axilite port=y_size
#pragma HLS INTERFACE s_axilite port=x_size
#pragma HLS INTERFACE s_axilite port=sel
#pragma HLS INTERFACE s_axilite port=return
#pragma HLS INTERFACE m_axi depth=480000 port=out offset=slave
#pragma HLS INTERFACE axis register both port=ins1
#pragma HLS INTERFACE axis register both port=ins0
ap_axis<32,1,1,1> val;
Loop1 : do { // user が 1 になった時にスタート
#pragma HLS LOOP_TRIPCOUNT min=1 max=1 avg=1
if(sel == 0)
ins0 >> val;
else
ins1 >> val;
} while(val.user == 0);
for(int y=0; y<y_size; y++){
#pragma HLS LOOP_TRIPCOUNT min=600 max=600 avg=600
for(int x=0; x<x_size; x++){
#pragma HLS LOOP_TRIPCOUNT min=800 max=800 avg=800
//#pragma HLS PIPELINE II=1
if(!(y==0 && x==0)){
if(sel == 0)
ins0 >> val;
else
ins1 >> val;
}
out[y*x_size+x] = val.data;
}
}
return(0);
}
printf("val.data = %x\n", val.data);
printf("val.data = %x\n", (int)val.data);
の足し算部分だと思うが、in_V_read(read) のオフセットアドレスのRead と Loop1 の y の値 を受けて、out_val_data_V(read) に影響を及ぼしているという様に見るのだと思う。out_val.data = in[y*x_size+x];
// DMA2axis2st.cpp
// 2019/06/07 by marsee
//
#include <ap_int.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>
int DMA2axis(volatile ap_int<32> *in, int sel, int x_size, int y_size,
hls::stream<ap_axis<32,1,1,1> >& outs0, hls::stream<ap_axis<32,1,1,1> >& outs1){
#pragma HLS INTERFACE s_axilite port=y_size
#pragma HLS INTERFACE s_axilite port=x_size
#pragma HLS INTERFACE s_axilite port=sel
#pragma HLS INTERFACE s_axilite port=return
#pragma HLS INTERFACE axis register both port=outs0
#pragma HLS INTERFACE axis register both port=outs1
#pragma HLS INTERFACE m_axi depth=480000 port=in offset=slave
ap_axis<32,1,1,1> out_val;
for(int y=0; y<y_size; y++){
#pragma HLS LOOP_TRIPCOUNT min=600 max=600 avg=600
for(int x=0; x<x_size; x++){
#pragma HLS LOOP_TRIPCOUNT min=800 max=800 avg=800
#pragma HLS PIPELINE II=1
out_val.data = in[y*x_size+x];
if(x==0 && y==0)
out_val.user = 1;
else
out_val.user = 0;
if(x == x_size-1)
out_val.last = 1;
else
out_val.last = 0;
if(sel == 0)
outs0 << out_val;
else
outs1 << out_val;
}
}
return(0);
}
// DMA2axis2st_tb.cpp
// 2019/06/07 by marsee
//
#include <iostream>
#include "hls_opencv.h"
#include "bmp_data.h"
#define Y_SIZE 600
#define X_SIZE 800
char OUTPUT_BMP_FILE0[] = "test0.bmp";
char OUTPUT_BMP_FILE1[] = "test1.bmp";
int DMA2axis(volatile ap_int<32> *in, int sel, int x_size, int y_size,
hls::stream<ap_axis<32,1,1,1> >& outs0, hls::stream<ap_axis<32,1,1,1> >& outs1);
int main(){
hls::stream<ap_axis<32,1,1,1> > outs0;
hls::stream<ap_axis<32,1,1,1> > outs1;
ap_axis<32,1,1,1> axisp;
ap_int<32> *rd_bmp;
if((rd_bmp =(ap_int<32> *)malloc(sizeof(ap_int<32>) * (X_SIZE * Y_SIZE))) == NULL){
fprintf(stderr, "Can't allocate rd_bmp memory\n");
exit(1);
}
for(int y=0; y<Y_SIZE; y++){
for(int x=0; x<X_SIZE; x++){
rd_bmp[y*X_SIZE+x] = (int)(bmp_file_array[y][x][0]) | ((int)(bmp_file_array[y][x][1])<<8) | ((int)(bmp_file_array[y][x][2]) <<16);
}
}
DMA2axis(rd_bmp, 0, X_SIZE, Y_SIZE, outs0, outs1);
cv::Mat img(Y_SIZE, X_SIZE, CV_8UC3);
cv::Mat_<cv::Vec3b> dst_vec3b = cv::Mat_<cv::Vec3b>(img);
for (int y=0; y<Y_SIZE; y++){
for (int x=0; x<X_SIZE; x++){
outs0 >> axisp;
cv::Vec3b pixel;
pixel[0] = axisp.data & 0xff; // blue
pixel[1] = (axisp.data >> 8) & 0xff; // green
pixel[2] = (axisp.data >> 16) & 0xff; // red
dst_vec3b(y,x) = pixel;
}
}
cv::imwrite(OUTPUT_BMP_FILE0, img);
DMA2axis(rd_bmp, 1, X_SIZE, Y_SIZE, outs0, outs1);
for (int y=0; y<Y_SIZE; y++){
for (int x=0; x<X_SIZE; x++){
outs1 >> axisp;
cv::Vec3b pixel;
pixel[0] = axisp.data & 0xff; // blue
pixel[1] = (axisp.data >> 8) & 0xff; // green
pixel[2] = (axisp.data >> 16) & 0xff; // red
dst_vec3b(y,x) = pixel;
}
}
cv::imwrite(OUTPUT_BMP_FILE1, img);
return(0);
}
// bmp_header2image.cpp
// 2019/06/07 by marsee
//
#include <iostream>
#include "hls_opencv.h"
#include "bmp_data.h"
char OUTPUT_BMP_FILE[] = "test.bmp";
int main(){
cv::Mat img(Y_SIZE, X_SIZE, CV_8UC3);
cv::Mat_<cv::Vec3b> dst_vec3b = cv::Mat_<cv::Vec3b>(img);
for (int y=0; y<Y_SIZE; y++){
for (int x=0; x<X_SIZE; x++){
cv::Vec3b pixel;
pixel[0] = bmp_file_array[y][x][0]; // blue
pixel[1] = bmp_file_array[y][x][1]; // green
pixel[2] = bmp_file_array[y][x][2]; // red
dst_vec3b(y,x) = pixel;
}
}
cv::imwrite(OUTPUT_BMP_FILE, img);
return(0);
}
// bmp_header_file.cpp
// 2019/06/08 by marsee
//
#include <iostream>
#include "hls_opencv.h"
#include <stdlib.h>
char INPUT_BMP_FILE[] = "test.bmp";
char OUTPUT_HEADER_FILE[] = "bmp_data.h";
int main(){
uint8_t *red, *green, *blue;
FILE *fbmpw;
// BMPファイルをMat に読み込む
cv::Mat img = cv::imread(INPUT_BMP_FILE);
// ピクセルを入れるメモリをアロケートする
if ((red =(uint8_t *)malloc(sizeof(uint8_t) * (img.rows * img.cols))) == NULL){
fprintf(stderr, "Can't allocate red memory\n");
exit(1);
}
if ((green =(uint8_t *)malloc(sizeof(uint8_t) * (img.rows * img.cols))) == NULL){
fprintf(stderr, "Can't allocate green memory\n");
exit(1);
}
if ((blue =(uint8_t *)malloc(sizeof(uint8_t) * (img.rows * img.cols))) == NULL){
fprintf(stderr, "Can't allocate blue memory\n");
exit(1);
}
cv::Mat_<cv::Vec3b> dst_vec3b = cv::Mat_<cv::Vec3b>(img);
for (int y=0; y<img.rows; y++){
for (int x=0; x<img.cols; x++){
cv::Vec3b pixel;
pixel = dst_vec3b(y,x);
blue[y*img.cols+x] = pixel[0]; // blue
green[y*img.cols+x] = pixel[1]; // green
red[y*img.cols+x] = pixel[2]; // red
}
}
// BMP画像データのヘッダを画像出力ファイルに書き込む
if ((fbmpw = fopen(OUTPUT_HEADER_FILE, "w")) == NULL){
fprintf(stderr, "Can't open bmp header file\n");
exit(1);
}
fprintf(fbmpw, "// %s\n", OUTPUT_HEADER_FILE);
time_t now = std::time(nullptr);
struct tm* jst = std::localtime(&now);
fprintf(fbmpw, "// %04d/%02d/%02d %02d:%02d:%02d by marsee\n", jst->tm_year+1900, jst->tm_mon+1, jst->tm_mday,
jst->tm_hour, jst->tm_min, jst->tm_sec);
fprintf(fbmpw, "//\n\n");
fprintf(fbmpw, "#define X_SIZE %d\n", img.cols);
fprintf(fbmpw, "#define Y_SIZE %d\n\n", img.rows);
fprintf(fbmpw, "unsigned char bmp_file_array[%d][%d][3] = {\n", img.rows, img.cols);
for (int y=0; y<img.rows; y++){
fprintf(fbmpw, "\t{");
for (int x=0; x<img.cols; x++){
if (x != 0)
fprintf(fbmpw, ",");
fprintf(fbmpw, "{%d,%d,%d}", blue[y*img.cols+x], green[y*img.cols+x], red[y*img.cols+x]);
}
if (y == (img.rows-1))
fprintf(fbmpw, "}\n");
else
fprintf(fbmpw, "},\n");
}
fprintf(fbmpw, "\n};");
fclose(fbmpw);
return(0);
}
// bmp_data.h
// 2019/06/08 05:09:49 by marsee
//
#define X_SIZE 64
#define Y_SIZE 48
unsigned char bmp_file_array[48][64][3] = {
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,253},{255,255,254},{255,255,255},{255,255,255},{255,255,255},{255,255,255},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,253},{254,255,254},{252,253,253},{248,249,250},{247,246,245},{251,248,246},{254,252,250},{255,255,253},{255,255,253},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,253},{249,255,254},{221,242,247},{175,192,214},{164,153,159},{208,178,168},{244,229,215},{255,255,251},{255,255,253},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,252},{234,255,255},{158,211,234},{58,99,142},{45,39,46},{131,82,57},{221,189,151},{255,255,236},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,253},{255,255,253},{255,255,253},{217,243,254},{113,174,219},{4,52,102},{0,0,0},{71,30,0},{195,152,96},{255,246,207},{255,255,255},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,252},{255,255,252},{253,255,255},{202,217,245},{108,138,199},{38,74,115},{12,39,42},{46,29,9},{166,117,59},{253,220,167},{255,255,255},{255,255,253},{255,255,253},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,252},{255,255,252},{242,255,255},{189,191,218},{131,113,165},{107,128,158},{55,113,119},{35,23,24},{130,67,21},{233,185,129},{255,255,255},{255,255,253},{255,255,253},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,253},{255,255,253},{211,253,255},{156,176,197},{142,110,125},{165,163,148},{94,153,176},{24,28,67},{86,28,20},{200,146,97},{255,255,232},{255,254,253},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,253},{255,255,254},{255,255,254},{173,230,255},{122,158,181},{157,127,104},{218,195,146},{131,184,221},{20,53,116},{44,15,29},{162,110,63},{255,244,192},{255,253,252},{255,255,255},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,252},{254,255,254},{254,255,255},{141,188,244},{102,134,166},{178,153,110},{255,226,172},{165,215,252},{33,94,160},{16,25,40},{123,79,27},{252,210,143},{254,253,250},{255,255,255},{255,255,253},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,252},{254,255,254},{248,255,255},{132,152,205},{112,108,145},{194,169,139},{255,252,207},{198,240,254},{73,138,192},{22,35,61},{93,41,0},{225,166,88},{254,253,248},{255,255,255},{255,255,253},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,253},{253,254,254},{205,252,255},{133,135,165},{146,107,117},{217,185,161},{255,255,241},{228,252,255},{119,177,216},{31,53,101},{56,8,16},{184,108,59},{253,252,220},{255,255,251},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,253},{255,255,254},{252,253,254},{152,225,254},{135,135,141},{189,138,110},{251,216,187},{255,255,255},{255,255,255},{171,217,245},{50,90,152},{20,8,49},{131,67,34},{253,235,175},{255,253,244},{255,255,255},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,252},{255,255,254},{250,252,253},{105,177,244},{111,125,127},{182,147,101},{232,204,173},{229,230,232},{232,231,230},{174,203,224},{56,108,161},{0,26,62},{81,49,10},{246,195,120},{254,248,234},{255,255,255},{255,255,253},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,252},{255,255,254},{242,252,253},{80,142,208},{11,40,88},{6,3,11},{10,7,4},{9,9,10},{10,9,9},{5,7,9},{0,0,4},{3,0,0},{67,36,1},{211,144,51},{250,238,222},{255,255,255},{255,255,253},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,252},{246,255,255},{198,246,253},{107,106,146},{108,91,105},{135,126,120},{144,148,146},{143,142,143},{143,142,143},{141,149,145},{99,129,136},{39,64,90},{33,8,21},{166,76,27},{243,228,192},{255,255,249},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,253},{235,251,255},{138,217,250},{135,102,103},{201,154,127},{251,232,210},{255,255,255},{255,255,255},{255,255,255},{255,255,255},{193,234,249},{79,127,177},{6,7,58},{106,34,14},{233,206,149},{255,253,235},{255,255,255},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,253},{255,255,254},{224,240,253},{85,163,233},{148,126,96},{225,186,141},{255,240,221},{255,255,255},{255,255,254},{255,255,254},{255,255,255},{223,241,253},{113,160,208},{1,41,103},{45,21,2},{218,167,94},{254,243,211},{255,255,255},{255,255,253},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,253},{255,255,254},{212,227,244},{69,101,186},{165,140,118},{236,214,172},{255,252,233},{255,255,255},{255,255,254},{255,255,254},{255,255,254},{235,250,254},{147,194,232},{28,87,148},{27,6,0},{187,119,27},{251,223,181},{255,255,255},{255,255,253},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,253},{255,255,255},{253,255,255},{193,237,246},{116,87,135},{217,182,155},{255,249,228},{255,255,255},{255,255,255},{255,255,253},{255,255,253},{255,255,254},{255,255,255},{196,236,255},{68,136,195},{9,2,20},{122,51,3},{234,200,143},{255,255,251},{255,255,255},{255,255,255},{255,255,254},{255,255,253},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,253},{255,255,253},{242,255,254},{204,213,231},{156,178,201},{107,152,157},{89,44,56},{154,126,106},{199,180,160},{232,216,200},{252,245,234},{255,255,254},{254,255,254},{229,241,248},{195,208,225},{134,166,192},{48,96,133},{0,0,13},{41,1,0},{136,114,68},{192,176,150},{221,194,190},{255,255,233},{255,255,252},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,252},{255,255,252},{220,255,255},{115,140,194},{36,46,107},{20,34,43},{24,9,7},{34,29,26},{104,69,33},{192,148,100},{247,227,199},{255,255,255},{253,255,255},{185,218,239},{89,125,173},{25,46,88},{14,24,30},{13,13,11},{8,12,13},{28,28,15},{83,39,27},{162,89,78},{255,255,198},{255,255,248},{255,255,255},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,252},{255,255,252},{235,255,255},{176,190,221},{138,138,171},{141,139,141},{142,144,143},{138,140,142},{172,152,134},{219,194,167},{250,239,223},{255,255,255},{253,255,255},{215,234,245},{163,181,208},{136,142,163},{143,141,138},{146,146,145},{144,146,147},{139,142,143},{156,135,137},{203,162,155},{255,255,222},{255,255,250},{255,255,255},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,253},{255,255,253},{249,255,254},{234,238,245},{225,224,232},{228,226,225},{228,230,229},{225,226,227},{233,228,223},{245,239,231},{253,250,245},{255,255,254},{254,255,254},{244,249,251},{231,235,241},{225,226,230},{229,227,225},{231,231,230},{230,231,230},{226,227,228},{228,223,225},{241,231,228},{255,255,245},{255,255,253},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,253},{255,255,255},{255,255,255},{255,255,255},{255,255,255},{255,255,255},{255,255,255},{255,255,255},{255,255,255},{255,255,253},{255,255,253},{255,255,254},{255,255,255},{255,255,255},{255,255,255},{255,255,255},{255,255,255},{255,255,255},{255,255,255},{255,255,255},{255,255,255},{255,255,254},{255,255,253},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}},
{{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254},{255,255,254}}
};
ERROR: [Vivado 12-172] File or Directory '/home/masaaki/HDL/Ultra96/cam_dp_191/Work/cam_dp_183.srcs/sources_1/bd/cam_dp/hdl/cam_dp_wrapper.v' does not exist
[IP_Flow 19-4965] IP pixel_fifo was packaged with board value 'em.avnet.com:ultra96v1:part0:1.2'. Current project's board value is unset. Please update the project settings to match the packaged IP.
TEMP = 28.740000
DegC PRESS = 1007.970000
hPa HUM : 51.779297
// BME280_temp.c
// 2019/06/01 by marsee
//
// Quote part of ultra96_design/src/linux/caminit/src/ov5640.cc::init_ov5640()
// https://github.com/fixstars/ultra96_design
//
// Quote of SwitchScience Wiki (Special Thanks)
// http://trac.switch-science.com/wiki/BME280
//
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <linux/i2c-dev.h>
#include <stdint.h>
int writeReg(int fd, uint8_t addr, uint8_t data);
int readReg(int fd, uint8_t addr, uint8_t *data);
signed long int calibration_T(signed long int adc_T);
unsigned long int calibration_P(signed long int adc_P);
unsigned long int calibration_H(signed long int adc_H);
unsigned long int hum_raw,temp_raw,pres_raw;
signed long int t_fine;
uint16_t dig_T1;
int16_t dig_T2;
int16_t dig_T3;
uint16_t dig_P1;
int16_t dig_P2;
int16_t dig_P3;
int16_t dig_P4;
int16_t dig_P5;
int16_t dig_P6;
int16_t dig_P7;
int16_t dig_P8;
int16_t dig_P9;
int8_t dig_H1;
int16_t dig_H2;
int8_t dig_H3;
int16_t dig_H4;
int16_t dig_H5;
int8_t dig_H6;
int main(){
int fd;
uint8_t addr;
uint8_t datar;
uint8_t data[32];
fd = open("/dev/i2c-2", O_RDWR); // I2C0
//fd = open("/dev/i2c-3", O_RDWR); // I2C1
if(fd < 0){
fprintf(stderr, "Can't open /dev/i2c-2\n");
return(-1);
}
ioctl(fd, I2C_SLAVE, 0x76);
uint8_t osrs_t = 1; //Temperature oversampling x 1
uint8_t osrs_p = 1; //Pressure oversampling x 1
uint8_t osrs_h = 1; //Humidity oversampling x 1
uint8_t mode = 3; //Normal mode
uint8_t t_sb = 5; //Tstandby 1000ms
uint8_t filter = 0; //Filter off
uint8_t spi3w_en = 0; //3-wire SPI Disable
uint8_t ctrl_meas_reg = 0x27;
uint8_t config_reg = (t_sb << 5) | (filter << 2) | spi3w_en;
uint8_t ctrl_hum_reg = osrs_h;
writeReg(fd, 0xf2, ctrl_hum_reg);
writeReg(fd, 0xf4, ctrl_meas_reg);
writeReg(fd, 0xf5, config_reg);
readReg(fd, 0xfc, &datar);
//printf("0xfc = %x\n", datar);
readReg(fd, 0xfb, &datar);
//printf("0xfb = %x\n", datar);
readReg(fd, 0xfa, &datar);
//printf("0xfa = %x\n", datar);
for(int i=0, addr=0x88; i<24; i++, addr++){
readReg(fd, addr, &data[i]);
//printf("data[%d] = %x\n", i, data[i]);
}
readReg(fd, 0xa1, &data[24]);
//printf("data[24] = %x\n", data[24]);
for(int i=25, addr=0xE1; i<32; i++, addr++){
readReg(fd, addr, &data[i]);
//printf("data[%d] = %x\n", i, data[i]);
}
dig_T1 = (data[1] << 8) | data[0];
dig_T2 = (data[3] << 8) | data[2];
dig_T3 = (data[5] << 8) | data[4];
dig_P1 = (data[7] << 8) | data[6];
dig_P2 = (data[9] << 8) | data[8];
dig_P3 = (data[11]<< 8) | data[10];
dig_P4 = (data[13]<< 8) | data[12];
dig_P5 = (data[15]<< 8) | data[14];
dig_P6 = (data[17]<< 8) | data[16];
dig_P7 = (data[19]<< 8) | data[18];
dig_P8 = (data[21]<< 8) | data[20];
dig_P9 = (data[23]<< 8) | data[22];
dig_H1 = data[24];
dig_H2 = (data[26]<< 8) | data[25];
dig_H3 = data[27];
dig_H4 = (data[28]<< 4) | (0x0F & data[29]);
dig_H5 = (data[30] << 4) | ((data[29] >> 4) & 0x0F);
dig_H6 = data[31];
for(int i=0, addr=0xf7; i<8; i++, addr++){
readReg(fd, addr, &data[i]);
//printf("data[%d] = %x\n", i, data[i]);
}
pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4);
temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4);
hum_raw = (data[6] << 8) | data[7];
double temp_act = 0.0, press_act = 0.0,hum_act=0.0;
signed long int temp_cal;
unsigned long int press_cal,hum_cal;
temp_cal = calibration_T(temp_raw);
press_cal = calibration_P(pres_raw);
hum_cal = calibration_H(hum_raw);
temp_act = (double)temp_cal / 100.0;
press_act = (double)press_cal / 100.0;
hum_act = (double)hum_cal / 1024.0;
printf("TEMP = %f\n", temp_act);
printf("DegC PRESS = %f\n", press_act);
printf("hPa HUM : %f\n", hum_act);
return(0);
}
int writeReg(int fd, uint8_t addr, uint8_t data){
uint8_t dt[2];
dt[0] = addr;
dt[1] = data;
write(fd, dt, 2);
return(0);
}
int readReg(int fd, uint8_t addr, uint8_t *data){
uint8_t addrt = addr;
write(fd, &addrt, 1);
read(fd, data, 1);
return(0);
}
signed long int calibration_T(signed long int adc_T)
{
signed long int var1, var2, T;
var1 = ((((adc_T >> 3) - ((signed long int)dig_T1<<1))) * ((signed long int)dig_T2)) >> 11;
var2 = (((((adc_T >> 4) - ((signed long int)dig_T1)) * ((adc_T>>4) - ((signed long int)dig_T1))) >> 12) * ((signed long int)dig_T3)) >> 14;
t_fine = var1 + var2;
T = (t_fine * 5 + 128) >> 8;
return T;
}
unsigned long int calibration_P(signed long int adc_P)
{
signed long int var1, var2;
unsigned long int P;
var1 = (((signed long int)t_fine)>>1) - (signed long int)64000;
var2 = (((var1>>2) * (var1>>2)) >> 11) * ((signed long int)dig_P6);
var2 = var2 + ((var1*((signed long int)dig_P5))<<1);
var2 = (var2>>2)+(((signed long int)dig_P4)<<16);
var1 = (((dig_P3 * (((var1>>2)*(var1>>2)) >> 13)) >>3) + ((((signed long int)dig_P2) * var1)>>1))>>18;
var1 = ((((32768+var1))*((signed long int)dig_P1))>>15);
if (var1 == 0)
{
return 0;
}
P = (((unsigned long int)(((signed long int)1048576)-adc_P)-(var2>>12)))*3125;
if(P<0x80000000)
{
P = (P << 1) / ((unsigned long int) var1);
}
else
{
P = (P / (unsigned long int)var1) * 2;
}
var1 = (((signed long int)dig_P9) * ((signed long int)(((P>>3) * (P>>3))>>13)))>>12;
var2 = (((signed long int)(P>>2)) * ((signed long int)dig_P8))>>13;
P = (unsigned long int)((signed long int)P + ((var1 + var2 + dig_P7) >> 4));
return P;
}
unsigned long int calibration_H(signed long int adc_H)
{
signed long int v_x1;
v_x1 = (t_fine - ((signed long int)76800));
v_x1 = (((((adc_H << 14) -(((signed long int)dig_H4) << 20) - (((signed long int)dig_H5) * v_x1)) +
((signed long int)16384)) >> 15) * (((((((v_x1 * ((signed long int)dig_H6)) >> 10) *
(((v_x1 * ((signed long int)dig_H3)) >> 11) + ((signed long int) 32768))) >> 10) + (( signed long int)2097152)) *
((signed long int) dig_H2) + 8192) >> 14));
v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * ((signed long int)dig_H1)) >> 4));
v_x1 = (v_x1 < 0 ? 0 : v_x1);
v_x1 = (v_x1 > 419430400 ? 419430400 : v_x1);
return (unsigned long int)(v_x1 >> 12);
}
// BME280_temp.c
// 2019/06/01 by marsee
//
// Quote part of ultra96_design/src/linux/caminit/src/ov5640.cc::init_ov5640()
// https://github.com/fixstars/ultra96_design
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <linux/i2c-dev.h>
#include <stdint.h>
int main(){
int fd;
uint8_t addr;
uint8_t data0, data1;
fd = open("/dev/i2c-2", O_RDWR);
if(fd < 0){
fprintf(stderr, "Can't open /dev/i2c-2\n");
return(-1);
}
ioctl(fd, I2C_SLAVE, 0x76);
addr = 0xfe;
write(fd, &addr, 1);
read(fd, &data0, 1);
printf("0xfe = %x\n", data0);
addr = 0xfd;
write(fd, &addr, 1);
read(fd, &data0, 1);
printf("0xfd = %x\n", data0);
addr = 0xd0;
write(fd, &addr, 1);
read(fd, &data0, 1);
printf("0xd0 = %x\n", data0);
return(0);
}
日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
- | - | - | - | - | - | 1 |
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | - | - | - | - | - | - |