diff --git a/Basys3_Master.xdc b/Basys3_Master.xdc index a55883c..e46c1d0 100644 --- a/Basys3_Master.xdc +++ b/Basys3_Master.xdc @@ -19,8 +19,8 @@ set_property PACKAGE_PIN V16 [get_ports {sw[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {sw[1]}] set_property PACKAGE_PIN W16 [get_ports {sw[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {sw[2]}] -#set_property PACKAGE_PIN W17 [get_ports {sw[3]}] -# set_property IOSTANDARD LVCMOS33 [get_ports {sw[3]}] +set_property PACKAGE_PIN W17 [get_ports {sw[3]}] + set_property IOSTANDARD LVCMOS33 [get_ports {sw[3]}] #set_property PACKAGE_PIN W15 [get_ports {sw[4]}] # set_property IOSTANDARD LVCMOS33 [get_ports {sw[4]}] #set_property PACKAGE_PIN V15 [get_ports {sw[5]}] diff --git a/Matlab files/imag_transf_model2.m b/Matlab files/imag_transf_model2.m index fded94d..4b3e638 100644 --- a/Matlab files/imag_transf_model2.m +++ b/Matlab files/imag_transf_model2.m @@ -45,8 +45,6 @@ mode = str2num(answer{4}); mode = min(mode, 3); mode = max(mode, 0); % -step = 0.001; % step for lookuptable file generator loop -% %% reading image % f = imread('star640x480.jpg'); f = imread('overlay.jpg'); @@ -186,6 +184,8 @@ text( 0 , 0 , [ X,' ', Y] ); end end % % Displaying transform matrix in Verilog code style, for easy copying and pasting +% +% step = 0.001; % step for lookuptable file generator loop % disp('Copy those constants in Verilog code'), % X = ['TRA_IMG_WIDTH = ''d', num2str(width),',']; % disp(X), @@ -270,6 +270,7 @@ text( 0 , 0 , [ X,' ', Y] ); param = ufi(a+1,4,0); temp = ufi(bin2dec([param.bin , sw.bin , cam.bin]),7,0); X = ['P', temp.hex, Thex(a,1:7)]; +% X = ['h',Thex(a,1:7)]; % print just values of matrix disp(X), end end diff --git a/default_reg_writer.v b/default_reg_writer.v index 8185ad7..aedcd32 100644 --- a/default_reg_writer.v +++ b/default_reg_writer.v @@ -9,17 +9,102 @@ module default_reg_writer #(parameter CAM_LINE = 9, CAM_PIXEL = 10, - TRA_IMG_WIDTH = 'd320, - TRA_IMG_DEPTH = 'd240, - T11 = 25'sb0_000000000000_100000000000, - T12 = 25'sb0_000000000000_000000000000, - T13 = 25'sb0_000000000000_000000000000, - T21 = 25'sb0_000000000000_000000000000, - T22 = 25'sb0_000000000000_100000000000, - T23 = 25'sb0_000000000000_000000000000, - T31 = 25'sb0_000000000000_000000000000, - T32 = 25'sb0_000000000000_000000000000, - T33 = 25'sb0_000000000001_000000000000 +// default settings for mode 0 camera 0 + TRA_IMG_WIDTH_0_0 = 'd320, + TRA_IMG_DEPTH_0_0 = 'd240, + T11_0_0 = 25'sb0_000000000000_100000000000, + T12_0_0 = 25'sb0_000000000000_000000000000, + T13_0_0 = 25'sb0_000000000000_000000000000, + T21_0_0 = 25'sb0_000000000000_000000000000, + T22_0_0 = 25'sb0_000000000000_100000000000, + T23_0_0 = 25'sb0_000000000000_000000000000, + T31_0_0 = 25'sb0_000000000000_000000000000, + T32_0_0 = 25'sb0_000000000000_000000000000, + T33_0_0 = 25'sb0_000000000001_000000000000, +// default settings for mode 0 camera 1 + TRA_IMG_WIDTH_0_1 = 'd320, + TRA_IMG_DEPTH_0_1 = 'd240, + T11_0_1 = 25'sb0_000000000000_100000000000, + T12_0_1 = 25'sb0_000000000000_000000000000, + T13_0_1 = 25'sb0_000000000000_000000000000, + T21_0_1 = 25'sb0_000000000000_000000000000, + T22_0_1 = 25'sb0_000000000000_100000000000, + T23_0_1 = 25'sb0_000000000000_000000000000, + T31_0_1 = 25'sb0_000000000000_000000000000, + T32_0_1 = 25'sb0_000000000000_000000000000, + T33_0_1 = 25'sb0_000000000001_000000000000, +// default settings for mode 1 camera 0 + TRA_IMG_WIDTH_1_0 = 'd320, + TRA_IMG_DEPTH_1_0 = 'd240, + T11_1_0 = 25'sh0000000, + T12_1_0 = 25'sh1fffa04, + T13_1_0 = 25'sh0000000, + T21_1_0 = 25'sh0000aa8, + T22_1_0 = 25'sh0000000, + T23_1_0 = 25'sh0000000, + T31_1_0 = 25'sh0000000, + T32_1_0 = 25'sh00ef000, + T33_1_0 = 25'sh0001000, +// default settings for mode 1 camera 1 + TRA_IMG_WIDTH_1_1 = 'd320, + TRA_IMG_DEPTH_1_1 = 'd240, + T11_1_1 = 25'sh0000000, + T12_1_1 = 25'sh1fffa04, + T13_1_1 = 25'sh0000000, + T21_1_1 = 25'sh0000aa8, + T22_1_1 = 25'sh0000000, + T23_1_1 = 25'sh0000000, + T31_1_1 = 25'sh0000000, + T32_1_1 = 25'sh00ef000, + T33_1_1 = 25'sh0001000, +// default settings for mode 2 camera 0 + TRA_IMG_WIDTH_2_0 = 'd320, + TRA_IMG_DEPTH_2_0 = 'd240, + T11_2_0 = 25'sh1fff803, + T12_2_0 = 25'sh0000000, + T13_2_0 = 25'sh0000000, + T21_2_0 = 25'sh0000000, + T22_2_0 = 25'sh1fff804, + T23_2_0 = 25'sh0000000, + T31_2_0 = 25'sh013f000, + T32_2_0 = 25'sh00ef000, + T33_2_0 = 25'sh0001000, +// default settings for mode 2 camera 1 + TRA_IMG_WIDTH_2_1 = 'd320, + TRA_IMG_DEPTH_2_1 = 'd240, + T11_2_1 = 25'sh1fff803, + T12_2_1 = 25'sh0000000, + T13_2_1 = 25'sh0000000, + T21_2_1 = 25'sh0000000, + T22_2_1 = 25'sh1fff804, + T23_2_1 = 25'sh0000000, + T31_2_1 = 25'sh013f000, + T32_2_1 = 25'sh00ef000, + T33_2_1 = 25'sh0001000, +// default settings for mode 3 camera 0 + TRA_IMG_WIDTH_3_0 = 'd320, + TRA_IMG_DEPTH_3_0 = 'd240, + T11_3_0 = 25'sh0000000, + T12_3_0 = 25'sh00005fc, + T13_3_0 = 25'sh0000000, + T21_3_0 = 25'sh1fff558, + T22_3_0 = 25'sh0000000, + T23_3_0 = 25'sh0000000, + T31_3_0 = 25'sh013f000, + T32_3_0 = 25'sh0000000, + T33_3_0 = 25'sh0001000, +// default settings for mode 3 camera 1 + TRA_IMG_WIDTH_3_1 = 'd320, + TRA_IMG_DEPTH_3_1 = 'd240, + T11_3_1 = 25'sh0000000, + T12_3_1 = 25'sh00005fc, + T13_3_1 = 25'sh0000000, + T21_3_1 = 25'sh1fff558, + T22_3_1 = 25'sh0000000, + T23_3_1 = 25'sh0000000, + T31_3_1 = 25'sh013f000, + T32_3_1 = 25'sh0000000, + T33_3_1 = 25'sh0001000 )( input clk, input i_enable, @@ -56,18 +141,315 @@ if(i_enable)begin end end - case (r_count[6:3]) - 'd0 : r_data[CAM_PIXEL-1:0] <= TRA_IMG_WIDTH; - 'd1 : r_data[CAM_LINE-1:0] <= TRA_IMG_DEPTH; - 'd2 : r_data <= T11; - 'd3 : r_data <= T12; - 'd4 : r_data <= T13; - 'd5 : r_data <= T21; - 'd6 : r_data <= T22; - 'd7 : r_data <= T23; - 'd8 : r_data <= T31; - 'd9 : r_data <= T32; - 'd10 : r_data <= T33; + case (r_count[6:3]) // select parameter + 'd0 : begin + case (r_count[2:1]) // select mode + 'd0 : begin + case (r_count[0]) // select camera + 'd0 : r_data[CAM_PIXEL-1:0] <= TRA_IMG_WIDTH_0_0; + 'd1 : r_data[CAM_PIXEL-1:0] <= TRA_IMG_WIDTH_0_1; + endcase + end + 'd1 : begin + case (r_count[0]) // select camera + 'd0 : r_data[CAM_PIXEL-1:0] <= TRA_IMG_WIDTH_1_0; + 'd1 : r_data[CAM_PIXEL-1:0] <= TRA_IMG_WIDTH_1_1; + endcase + end + 'd2 : begin + case (r_count[0]) // select camera + 'd0 : r_data[CAM_PIXEL-1:0] <= TRA_IMG_WIDTH_2_0; + 'd1 : r_data[CAM_PIXEL-1:0] <= TRA_IMG_WIDTH_2_1; + endcase + end + 'd3 : begin + case (r_count[0]) // select camera + 'd0 : r_data[CAM_PIXEL-1:0] <= TRA_IMG_WIDTH_3_0; + 'd1 : r_data[CAM_PIXEL-1:0] <= TRA_IMG_WIDTH_3_1; + endcase + end + endcase + end + 'd1 : begin + case (r_count[2:1]) // select mode + 'd0 : begin + case (r_count[0]) // select camera + 'd0 : r_data[CAM_LINE-1:0] <= TRA_IMG_DEPTH_0_0; + 'd1 : r_data[CAM_LINE-1:0] <= TRA_IMG_DEPTH_0_1; + endcase + end + 'd1 : begin + case (r_count[0]) // select camera + 'd0 : r_data[CAM_LINE-1:0] <= TRA_IMG_DEPTH_1_0; + 'd1 : r_data[CAM_LINE-1:0] <= TRA_IMG_DEPTH_1_1; + endcase + end + 'd2 : begin + case (r_count[0]) // select camera + 'd0 : r_data[CAM_LINE-1:0] <= TRA_IMG_DEPTH_2_0; + 'd1 : r_data[CAM_LINE-1:0] <= TRA_IMG_DEPTH_2_1; + endcase + end + 'd3 : begin + case (r_count[0]) // select camera + 'd0 : r_data[CAM_LINE-1:0] <= TRA_IMG_DEPTH_3_0; + 'd1 : r_data[CAM_LINE-1:0] <= TRA_IMG_DEPTH_3_1; + endcase + end + endcase + end + 'd2 : begin + case (r_count[2:1]) // select mode + 'd0 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T11_0_0; + 'd1 : r_data <= T11_0_1; + endcase + end + 'd1 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T11_1_0; + 'd1 : r_data <= T11_1_1; + endcase + end + 'd2 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T11_2_0; + 'd1 : r_data <= T11_2_1; + endcase + end + 'd3 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T11_3_0; + 'd1 : r_data <= T11_3_1; + endcase + end + endcase + end + 'd3 : begin + case (r_count[2:1]) // select mode + 'd0 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T12_0_0; + 'd1 : r_data <= T12_0_1; + endcase + end + 'd1 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T12_1_0; + 'd1 : r_data <= T12_1_1; + endcase + end + 'd2 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T12_2_0; + 'd1 : r_data <= T12_2_1; + endcase + end + 'd3 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T12_3_0; + 'd1 : r_data <= T12_3_1; + endcase + end + endcase + end + 'd4 : begin + case (r_count[2:1]) // select mode + 'd0 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T13_0_0; + 'd1 : r_data <= T13_0_1; + endcase + end + 'd1 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T13_1_0; + 'd1 : r_data <= T13_1_1; + endcase + end + 'd2 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T13_2_0; + 'd1 : r_data <= T13_2_1; + endcase + end + 'd3 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T13_3_0; + 'd1 : r_data <= T13_3_1; + endcase + end + endcase + end + 'd5 : begin + case (r_count[2:1]) // select mode + 'd0 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T21_0_0; + 'd1 : r_data <= T21_0_1; + endcase + end + 'd1 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T21_1_0; + 'd1 : r_data <= T21_1_1; + endcase + end + 'd2 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T21_2_0; + 'd1 : r_data <= T21_2_1; + endcase + end + 'd3 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T21_3_0; + 'd1 : r_data <= T21_3_1; + endcase + end + endcase + end + 'd6 : begin + case (r_count[2:1]) // select mode + 'd0 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T22_0_0; + 'd1 : r_data <= T22_0_1; + endcase + end + 'd1 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T22_1_0; + 'd1 : r_data <= T22_1_1; + endcase + end + 'd2 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T22_2_0; + 'd1 : r_data <= T22_2_1; + endcase + end + 'd3 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T22_3_0; + 'd1 : r_data <= T22_3_1; + endcase + end + endcase + end + 'd7 : begin + case (r_count[2:1]) // select mode + 'd0 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T23_0_0; + 'd1 : r_data <= T23_0_1; + endcase + end + 'd1 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T23_1_0; + 'd1 : r_data <= T23_1_1; + endcase + end + 'd2 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T23_2_0; + 'd1 : r_data <= T23_2_1; + endcase + end + 'd3 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T23_3_0; + 'd1 : r_data <= T23_3_1; + endcase + end + endcase + end + 'd8 : begin + case (r_count[2:1]) // select mode + 'd0 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T31_0_0; + 'd1 : r_data <= T31_0_1; + endcase + end + 'd1 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T31_1_0; + 'd1 : r_data <= T31_1_1; + endcase + end + 'd2 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T31_2_0; + 'd1 : r_data <= T31_2_1; + endcase + end + 'd3 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T31_3_0; + 'd1 : r_data <= T31_3_1; + endcase + end + endcase + end + 'd9 : begin + case (r_count[2:1]) // select mode + 'd0 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T32_0_0; + 'd1 : r_data <= T32_0_1; + endcase + end + 'd1 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T32_1_0; + 'd1 : r_data <= T32_1_1; + endcase + end + 'd2 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T32_2_0; + 'd1 : r_data <= T32_2_1; + endcase + end + 'd3 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T32_3_0; + 'd1 : r_data <= T32_3_1; + endcase + end + endcase + end + 'd10 : begin + case (r_count[2:1]) // select mode + 'd0 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T33_0_0; + 'd1 : r_data <= T33_0_1; + endcase + end + 'd1 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T33_1_0; + 'd1 : r_data <= T33_1_1; + endcase + end + 'd2 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T33_2_0; + 'd1 : r_data <= T33_2_1; + endcase + end + 'd3 : begin + case (r_count[0]) // select camera + 'd0 : r_data <= T33_3_0; + 'd1 : r_data <= T33_3_1; + endcase + end + endcase + end default: begin r_configured <= 1; // default case just in case do nothing r_we <= 0; diff --git a/mode_selector.v b/mode_selector.v new file mode 100644 index 0000000..9357f86 --- /dev/null +++ b/mode_selector.v @@ -0,0 +1,43 @@ +//////////////////////////////////////////////////////////////////// +// +// This module alow to baypass mechanical swiches to +// imag_procesor module or automaticly selects +// and changes operation and camera select mode +// +////////////////////////////////////////////////////////////////// +module mode_selector#( parameter + LIMIT = 2_0000_0000 + //counter limit when it shoud change mode + // 100MHz -> period is 10ns + // 5s cycle period result in + // limit 5/(10*10^-9)= 500*10^6 +)( + input clk, + // input i_enable, + input [8:0] i_im_p, + input autoselect, + output [8:0] o_im_p +); + +reg [31:0] counter = 0; +reg [5:0] mode = 0; // camera modes +reg [2:0] color = 0; // color modes +reg [1:0] display = 0; // swiching between cameras + +always@(posedge clk) begin + if (counter < LIMIT) begin + counter = counter + 1; + end + else begin + counter = 0; + mode = mode + 1; + color = color + 1; + display = display + 1; + end + +end + +assign o_im_p = autoselect ? {color[2:1],mode[5:2],1'b0,display} + : i_im_p; + +endmodule \ No newline at end of file diff --git a/top.v b/top.v index 8739777..9ea6bc6 100644 --- a/top.v +++ b/top.v @@ -68,7 +68,7 @@ module top #( parameter output [3:0] vgaGreen, output Hsync, output Vsync, - input [2:0] sw, + input [3:0] sw, input [8:0] im_p, //UART input RsRx, // UART RX Data @@ -159,6 +159,8 @@ module top #( parameter wire [24:0] w_data_com_reg ; wire w_we_com_reg ; + wire [8:0] w_im_p; + //-----sub modules-------------------------- clock_enable_param #( .WAIT(WAIT), @@ -321,7 +323,7 @@ imag_procesor #( .CAM_LINE(CAM_LINE), .CAM_PIXEL(CAM_PIXEL) ) imag_procesor( - .im_p(im_p), + .im_p(w_im_p), .clk(clk), .clk25(pixel_clk), .clk50(clk50), @@ -379,6 +381,14 @@ debounce_switch debounce_switch_reset( .o_switch(w_reset_default) ); +mode_selector mode_selector( + .clk(clk), + // .i_enable(w_enable), + .i_im_p(im_p), + .autoselect(sw[3]), + .o_im_p(w_im_p) +); + always@(posedge clk) begin if (~w_wea_bram) begin