From fc3b11c78e2f70579ef1677fcd4c09b181e17815 Mon Sep 17 00:00:00 2001 From: Imants Pulkstenis Date: Sun, 20 Oct 2019 12:07:57 +0300 Subject: [PATCH] Add different default settings for each camera and each mode --- Matlab files/imag_transf_model2.m~ | 276 +++++++++++++++++++ default_reg_writer.v | 428 +++++++++++++++++++++++++++-- 2 files changed, 681 insertions(+), 23 deletions(-) create mode 100644 Matlab files/imag_transf_model2.m~ diff --git a/Matlab files/imag_transf_model2.m~ b/Matlab files/imag_transf_model2.m~ new file mode 100644 index 0000000..17299c0 --- /dev/null +++ b/Matlab files/imag_transf_model2.m~ @@ -0,0 +1,276 @@ +%% FPGA image trasform module +% Configuretion script generator +% +% Coordinates for perspective transform matrix +% 640x480 +% ------------------------------- +% | P2 | +% | P1 | +% | | +% | | +% | | +% | P4 | +% | P3 | +% ------------------------------- +% Px = (x , y ); +% +% %Pre fefined output image size +% width = 320; % for output image +% higth = 240; +% %Generate settings for: +% camera = 1; % camera 0 or 1 +% mode = 0; % from 0 to 3, but 0 is reserved for +% +P3 = [ 0 , 0 ]; +P4 = [ 639 , 0 ]; +P1 = [ 639 , 479 ]; +P2 = [ 0 , 479 ]; + +% Or use popup menu +prompt = {'Enter output image width(0-320):','Enter output image higth(0-240):','Enter camera No.(0-1):','Enter mode No.(0-3):'}; +dlgtitle = 'Input'; +dims = [1 35]; +definput = {'320','240','0','1' }; +answer = inputdlg(prompt,dlgtitle,dims,definput); +width = str2num(answer{1}); + width = min(width, 320); + width = max(width, 1); +higth = str2num(answer{2}); + higth = min(higth, 240); + higth = max(higth, 1); +camera = str2num(answer{3}); + camera = min(camera, 1); + camera = max(camera, 0); +mode = str2num(answer{4}); + mode = min(mode, 3); + mode = max(mode, 0); +% +%% reading image +% f = imread('star640x480.jpg'); +f = imread('overlay.jpg'); +f = im2double(f); +f = mean(f,3); + +figure(1);% subplot(2,2,[1,3]); +imshow(f, []); + + +%% Perspective transform matrix +% +% T = [ 1.4839, 0.23638, 0.0030649; ... +% 0, 1.652, 0; ... +% -4.4516, -207.21, 1]; +% +% input corners (using impixel) and compute transform +% use(uncomment): +% [c r p] = impixel; +% or use those coordinates(comment if using impixel): +c = [ P1(1) P2(1) P3(1) P4(1) ]'; % x coordinates +r = [ P1(2) P2(2) P3(2) P4(2) ]'; % y coordinates +base = [0 0; (width-1) 0; (width-1) (higth-1); 0 (higth-1)]; % output dimentions + +tf = fitgeotrans([c r],base,'projective'); +% disp('tf = '); +% disp(tf) + +T = tf.T; +disp('T ='); +format short g +disp(T); +disp('After rounding and converting '); +T = round(T * 2^12) / 2^12 % faster rounding +% T = sfi(T,25,12); % very slow +format +figure(1);%subplot(2,2,[1,3]); +hold on; +% plot red box +plot([c;c(1)],[r;r(1)],'r','Linewidth',2); +text(c(1),r(1)+20,'P1','Color','r'); +text(c(2),r(2)+20,'P2','Color','r'); +text(c(3),r(3)-20,'P3','Color','r'); +text(c(4),r(4)-20,'P4','Color','r'); + +% % plot lines like in prototype model +% plot([1;1],[0;480],'g','Linewidth',2); +% plot([80;80],[0;480],'g','Linewidth',2); +% plot([160;160],[0;480],'g','Linewidth',2); +% plot([240;240],[0;480],'g','Linewidth',2); +% plot([320;320],[0;480],'g','Linewidth',2); +% plot([400;400],[0;480],'g','Linewidth',2); +% plot([480;480],[0;480],'g','Linewidth',2); +% plot([560;560],[0;480],'g','Linewidth',2); +% plot([639;639],[0;480],'g','Linewidth',2); +% +% plot([0;640],[1;1],'g','Linewidth',2); +% plot([0;640],[80;80],'g','Linewidth',2); +% plot([0;640],[160;160],'g','Linewidth',2); +% plot([0;640],[240;240],'g','Linewidth',2); +% plot([0;640],[320;320],'g','Linewidth',2); +% plot([0;640],[400;400],'g','Linewidth',2); +% plot([0;640],[479;479],'g','Linewidth',2); +% +% F = getframe(); +% gg = frame2im(F); +% imwrite(gg,'overlay.jpg'); % save image +hold off; + +%% calculating new values +g = zeros(higth, width); + +v_tr_all = zeros(numel(f), 3); + +n = 0; +for y = 1:size(f, 1), + for x = 1:size(f, 2), + % x and y are from ORIGINAL (untransformed) image from camera + n = n + 1; + + v = [x, y, 1]; + v_tr = v * T; + + v_tr_all(n,:) = v_tr; + + + w_tr_inv = 1/ v_tr(3); + w_tr_inv = round(w_tr_inv * 2^8) / 2^8; + x_tr = v_tr(1) * w_tr_inv; + y_tr = v_tr(2) * w_tr_inv; + +% x_tr = v_tr(1) / v_tr(3); +% y_tr = v_tr(2) / v_tr(3); +% +% x_tr = round(x_tr); +% y_tr = round(y_tr); + x_tr = fix(x_tr); % integer part of real number + y_tr = fix(y_tr); + + x_tr = min(x_tr, size(g, 2)); + x_tr = max(x_tr, 1); + y_tr = min(y_tr, size(g, 1)); + y_tr = max(y_tr, 1); + + % x_tr, y_tr are TARGET COORDINATES WHERE TO WRITE DATA + g(y_tr, x_tr) = f(y, x); + + end; +end; + +figure(2);%subplot(2,1,1); +imshow(g, []); + +% plots all calculated x, y and w values +figure(3);%subplot(2,1,2); +plot(v_tr_all); +legend('x', 'y', 'w'); +X = ['MAX w = ', num2str(max(v_tr_all(:,3)))]; +disp(X), +Y = ['MIN w = ', num2str(min(v_tr_all(:,3)))]; +disp(Y), +disp(' '); +% prints w max an min values on plot +text( 0 , 0 , [ X,' ', Y] ); + +%% Print perspective trasform matrix values in hex +% +% first bit is sign bit, 12bit integer part ans 12bit fraction part +% + Tbin = []; + Thex = []; + for i=1:3 + for k=1:3 + a = sfi(T(i,k),25,12); + Tbin = [Tbin; a.bin]; + Thex = [Thex; a.hex]; + 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), +% X = ['TRA_IMG_DEPTH = ''d', num2str(higth),',']; +% disp(X), +% a = 0; +% for n=1:3 +% for k=1:3 +% a = a + 1; +% X = ['T', num2str(n) , num2str(k) ,' = 25''sb', Tbin(a,1), '_' ,Tbin(a,2:13),'_',Tbin(a,14:25),',']; +% disp(X), +% end +% end +% +% % Make file for case statement in Verilog +% % +% % This file contains code for loopuptable module +% % +% w_dec = []; +% %w_hex = []; +% w_dec_inv = []; +% temp = ['000000000000']; % just random values +% temp_old = ['000000100000']; % just random values +% for i= -1.5 : step : 4 % min and max w values +% w_dec = [ w_dec; sfi(i,12,8)]; +% if (i ~= 0 ) +% w_dec_inv = [ w_dec_inv; sfi(1/i,12,8)]; +% end +% end +% %w_hex = w_dec.hex; +% w_bin = w_dec.bin; +% w_bin_inv = w_dec_inv.bin; +% +% % lookuptable file generator +% % +% fid = fopen('lookuptable.v', 'wt'); +% fprintf(fid, 'module lookuptable();\n'); +% fprintf(fid, 'always@(negedge clk) begin\n '); +% fprintf(fid, 'case (w)\n'); +% +% for i=1:length(w_bin) +% temp_old = temp; +% temp = w_bin(i,1:12); +% if temp_old == temp +% % if same as previus value, do nothing +% else +% fprintf(fid, '\t12''b%s_%s_%s : r_w_inv <= 12''b%s_%s_%s;\n', w_bin(i,1:1), w_bin(i,2:4), w_bin(i,5:12), w_bin_inv(i,1:1), w_bin_inv(i,2:4), w_bin_inv(i,5:12) ); +% end +% end +% fprintf(fid, '\tdefault : r_w_inv <= 12''d1;\n ');% %s_%s_%s;\n ' , w_bin_inv(i,1:12) ); +% fprintf(fid, 'endcase;\n'); +% fprintf(fid, 'end\n'); +% fprintf(fid, 'endmodule'); +% disp(' '); +% disp('Text file lookuptable.v write done');disp(' '); +% fclose(fid); +% +%% Making configuretion file for Registers + + X = ['Configuration script for CAM',num2str(camera),' and for mode',num2str(mode), ':']; + disp(X), + sw = ufi(mode,2,0); + cam = ufi(camera,1,0); + param = ufi(0,4,0); + value = ufi(width,25,0); + temp = ufi(bin2dec([param.bin , sw.bin , cam.bin]),7,0); + X = ['P', temp.hex]; + temp = ufi(bin2dec(value.bin),25,0); + X = [X, temp.hex]; + disp(X), + param = ufi(1,4,0); + value = ufi(higth,25,0); + temp = ufi(bin2dec([param.bin , sw.bin , cam.bin]),7,0); + X = ['P', temp.hex]; + temp = ufi(bin2dec(value.bin),25,0); + X = [X, temp.hex]; + disp(X), + a = 0; + for n=1:3 + for k=1:3 + a = a + 1; + 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;