140 likes | 353 Views
CSCE 313: Embedded Systems Final Project. Instructor: Jason D. Bakos. Final Project. Objective: Begin with Lab 5 Convert all floating-point computations to fixed-point Increase resolution to 1024 x 768 Use fixed-point representation for: z c min_x , max_x , min_y , max_y
E N D
CSCE 313: Embedded SystemsFinal Project Instructor: Jason D. Bakos
Final Project • Objective: • Begin with Lab 5 • Convert all floating-point computations to fixed-point • Increase resolution to 1024 x 768 • Use fixed-point representation for: • z • c • min_x, max_x, min_y, max_y • x2+y2 (for checking for divergence)
Fixed-Point Review • Recall: fixed-point has fixed range • Recall: Range of non-fixed-point n-bit integer: • -2n-1 <= val <= 2n-1-1 • Range of signed (n,m) value: • -2n-m-1 <= val <= 2n-m-1 – 2-m • Need to decide where to set decimal point • For c, [min|max]_[x|y]: • Need to represent values from -2 to 2 • z should cover the worst case for a diverged pixel • x2+y2 should cover the worst case for the r2 of a diverged pixel
Worst Case Analysis (0,2) (1.4,1.4) (2,0)
Range and Precision • Problem: • Multiply (32,n) val with (32,m) val => (64,n+m) val • Need a way to get 64-bit product, or we lose the upper 32 bits
Multiply • Assume 4-bit registers, need 8 bit product: x 10 11 11 10 = B1 B0 A1 A0 11 14 154 3*2=6 A0*B0 (4b) 0000 + 3*3=9 -> 9*4=36 A0*B1 (4b) 00 00 = A1*B0 (4b) 00 00 2*2=4 -> 4*4=16 + + 2*3=6 -> 6*16=96 A1*B1 (4b) 0000 154
Example Fixed Point Multiply • Multiply A = (32,n) val andB = (32,n) val, need C = (32,n) product: • Declare A and B as “long” • Declare C as “long long” • Cast A and B as “long long”, • C = (long long)A * (long long)B; • Convert C from (64,2*n) to (32,n): • Shift C n bits to the right • Return C as int
High Resolution • Goal: Increase resolution from 320x240 to 1024x768 • Problems: • Native resolution of VGA Controller is 640x480, so hardware modification is needed • SRAM is only 512 KB, not large enough to store a higher resolution frame, so we need to move pixel buffer to SDRAM
Hardware Modification • Remove SRAM interface, connect DMA controller master interface directly to SDRAM • Remove rescaler (no longer needed) • Change DMA controller settings to 1024x768 • Each time you generate in SOPC Builder, must make edits to two generated Verilog files
Hardware Modification • VGA Controller Verilog file, line 78 (after each generation): parameter CW = 9; parameter DW = 29; parameter R_UI = 29; parameter R_LI = 20; parameter G_UI = 19; parameter G_LI = 10; parameter B_UI = 9; parameter B_LI = 0; /* Number of pixels */ parameter H_ACTIVE = 640; parameter H_FRONT_PORCH = 16; parameter H_SYNC = 96; parameter H_BACK_PORCH = 48; parameter H_TOTAL = 800; /* Number of lines */ parameter V_ACTIVE = 480; parameter V_FRONT_PORCH = 10; parameter V_SYNC = 2; parameter V_BACK_PORCH = 33; parameter V_TOTAL = 525; parameter NUMBER_OF_BITS_FOR_LINES = 10; parameter LINE_COUNTER_INCREMENT = 10'h001; parameter NUMBER_OF_BITS_FOR_PIXELS = 10; parameter PIXEL_COUNTER_INCREMENT = 10'h001; parameter CW = 9; parameter DW = 29; parameter R_UI = 29; parameter R_LI = 20; parameter G_UI = 19; parameter G_LI = 10; parameter B_UI = 9; parameter B_LI = 0; /* Number of pixels */ parameter H_ACTIVE = 1024; parameter H_FRONT_PORCH = 24; parameter H_SYNC = 136; parameter H_BACK_PORCH = 160; parameter H_TOTAL = 1344; /* Number of lines */ parameter V_ACTIVE = 768; parameter V_FRONT_PORCH = 3; parameter V_SYNC = 6; parameter V_BACK_PORCH = 29; parameter V_TOTAL = 806; parameter NUMBER_OF_BITS_FOR_LINES= 11; parameter LINE_COUNTER_INCREMENT = 11'h001; parameter NUMBER_OF_BITS_FOR_PIXELS = 11; parameter PIXEL_COUNTER_INCREMENT = 11'h001;
Hardware Modification • Clocks Verilog file, line 69 (after each generation): parameter SYS_CLK_MULT = 1; • Change to: parameter SYS_CLK_MULT = 2; • Line 174: DE_Clock_Generator_System.clk2_divide_by = 2, DE_Clock_Generator_System.clk2_duty_cycle = 50, DE_Clock_Generator_System.clk2_multiply_by = 1, • Change to: DE_Clock_Generator_System.clk2_divide_by = 7, DE_Clock_Generator_System.clk2_duty_cycle = 50, DE_Clock_Generator_System.clk2_multiply_by = 9,
Software Modification • New pixel buffer requires 1024x768x2 = 2359296 bytes • Allocate in CPU0 • Give 3.5 MB to CPU0, 1.5MB each for CPUs 1-3 • Allocate in SDRAM (as a global variable): #ifdef MASTER // define this in Eclipse project settings for CPU0 volatile alt_u8 pixel_buffer_memory[2359296]; // 768x1024x3 #endif • Add –DMASTER in cpu0’s project settings under Nios II Application Properties
Software Modifications • Copy address of only one processor’s buffer to the DMA controller for F/B buffer (in main()): alt_up_pixel_buffer_dma_change_back_buffer_address(my_pixel_buffer,(unsigned int)pixel_buffer_memory); alt_up_pixel_buffer_dma_swap_buffers(my_pixel_buffer); while (alt_up_pixel_buffer_dma_check_swap_buffers_status(my_pixel_buffer)); alt_up_pixel_buffer_dma_change_back_buffer_address(my_pixel_buffer,(unsigned int)pixel_buffer_memory); • Subsequent writes to buffer using address stored in DMA controller will write the same buffer • This is because pointer is stored in global location • Avoid divide: add a fixed-point constant for (1/768) and (1/1024) and multiply these