From 3cce0d8160334e23fc9b753eccdbb00af3bb3cda Mon Sep 17 00:00:00 2001 From: Vadim Ostrikov Date: Thu, 23 Jan 2025 23:27:39 +0400 Subject: [PATCH] Adding to others --- .../gtkwave.tcl | 74 +++++ .../surfer.scr | 74 +++++ .../tb.sv | 305 ++++++++++++++++-- labs/2_graphics/2_3_color_stripes/gtkwave.tcl | 74 +++++ labs/2_graphics/2_3_color_stripes/surfer.scr | 74 +++++ labs/2_graphics/2_3_color_stripes/tb.sv | 305 ++++++++++++++++-- .../gtkwave.tcl | 74 +++++ .../surfer.scr | 74 +++++ .../tb.sv | 305 ++++++++++++++++-- 9 files changed, 1275 insertions(+), 84 deletions(-) create mode 100644 labs/2_graphics/2_2_rectangle_ellipse_parabola_moving/gtkwave.tcl create mode 100644 labs/2_graphics/2_2_rectangle_ellipse_parabola_moving/surfer.scr create mode 100644 labs/2_graphics/2_3_color_stripes/gtkwave.tcl create mode 100644 labs/2_graphics/2_3_color_stripes/surfer.scr create mode 100644 labs/2_graphics/2_8_crash_course_basics_and_graphics/gtkwave.tcl create mode 100644 labs/2_graphics/2_8_crash_course_basics_and_graphics/surfer.scr diff --git a/labs/2_graphics/2_2_rectangle_ellipse_parabola_moving/gtkwave.tcl b/labs/2_graphics/2_2_rectangle_ellipse_parabola_moving/gtkwave.tcl new file mode 100644 index 00000000..e9b71182 --- /dev/null +++ b/labs/2_graphics/2_2_rectangle_ellipse_parabola_moving/gtkwave.tcl @@ -0,0 +1,74 @@ +# gtkwave::loadFile "dump.vcd" + +set all_signals [list] + +lappend all_signals tb.i_display.pixel_29 +lappend all_signals tb.i_display.pixel_28 +lappend all_signals tb.i_display.pixel_27 +lappend all_signals tb.i_display.pixel_26 +lappend all_signals tb.i_display.pixel_25 +lappend all_signals tb.i_display.pixel_24 +lappend all_signals tb.i_display.pixel_23 +lappend all_signals tb.i_display.pixel_22 +lappend all_signals tb.i_display.pixel_21 +lappend all_signals tb.i_display.pixel_20 +lappend all_signals tb.i_display.pixel_19 +lappend all_signals tb.i_display.pixel_18 +lappend all_signals tb.i_display.pixel_17 +lappend all_signals tb.i_display.pixel_16 +lappend all_signals tb.i_display.pixel_15 +lappend all_signals tb.i_display.pixel_14 +lappend all_signals tb.i_display.pixel_13 +lappend all_signals tb.i_display.pixel_12 +lappend all_signals tb.i_display.pixel_11 +lappend all_signals tb.i_display.pixel_10 +lappend all_signals tb.i_display.pixel_09 +lappend all_signals tb.i_display.pixel_08 +lappend all_signals tb.i_display.pixel_07 +lappend all_signals tb.i_display.pixel_06 +lappend all_signals tb.i_display.pixel_05 +lappend all_signals tb.i_display.pixel_04 +lappend all_signals tb.i_display.pixel_03 +lappend all_signals tb.i_display.pixel_02 +lappend all_signals tb.i_display.pixel_01 +lappend all_signals tb.i_display.pixel_00 + +lappend all_signals tb.i_lcd.LCD_DE +lappend all_signals tb.i_lcd.LCD_HSYNC +lappend all_signals tb.LCD_R +lappend all_signals tb.LCD_G +lappend all_signals tb.LCD_B +lappend all_signals tb.x +lappend all_signals tb.y + +set num_added [ gtkwave::addSignalsFromList $all_signals ] + +gtkwave::highlightSignalsFromList "tb.LCD_R\[4:0\]" +gtkwave::/Edit/Data_Format/Analog/Step +gtkwave::/Edit/Data_Format/Decimal + +gtkwave::highlightSignalsFromList "tb.LCD_G\[5:0\]" +gtkwave::/Edit/Data_Format/Analog/Step +gtkwave::/Edit/Data_Format/Decimal + +gtkwave::highlightSignalsFromList "tb.LCD_B\[4:0\]" +gtkwave::/Edit/Data_Format/Analog/Step +gtkwave::/Edit/Data_Format/Decimal + +gtkwave::highlightSignalsFromList "tb.x\[8:0\]" +gtkwave::/Edit/Data_Format/Analog/Step +gtkwave::/Edit/Data_Format/Decimal + +gtkwave::highlightSignalsFromList "tb.y\[8:0\]" +gtkwave::/Edit/Data_Format/Analog/Step +gtkwave::/Edit/Data_Format/Decimal + +gtkwave::/Time/Zoom/Zoom_Full +gtkwave::/Time/Zoom/Zoom_In +gtkwave::/Time/Zoom/Zoom_In +gtkwave::/Time/Zoom/Zoom_In +gtkwave::/Time/Zoom/Zoom_In +gtkwave::/Time/Zoom/Zoom_In +gtkwave::/Time/Zoom/Zoom_To_End + +gtkwave::/Edit/UnHighlight_All diff --git a/labs/2_graphics/2_2_rectangle_ellipse_parabola_moving/surfer.scr b/labs/2_graphics/2_2_rectangle_ellipse_parabola_moving/surfer.scr new file mode 100644 index 00000000..f2613945 --- /dev/null +++ b/labs/2_graphics/2_2_rectangle_ellipse_parabola_moving/surfer.scr @@ -0,0 +1,74 @@ +variable_add tb.i_display.pixel_29 +variable_add tb.i_display.pixel_28 +variable_add tb.i_display.pixel_27 +variable_add tb.i_display.pixel_26 +variable_add tb.i_display.pixel_25 +variable_add tb.i_display.pixel_24 +variable_add tb.i_display.pixel_23 +variable_add tb.i_display.pixel_22 +variable_add tb.i_display.pixel_21 +variable_add tb.i_display.pixel_20 +variable_add tb.i_display.pixel_19 +variable_add tb.i_display.pixel_18 +variable_add tb.i_display.pixel_17 +variable_add tb.i_display.pixel_16 +variable_add tb.i_display.pixel_15 +variable_add tb.i_display.pixel_14 +variable_add tb.i_display.pixel_13 +variable_add tb.i_display.pixel_12 +variable_add tb.i_display.pixel_11 +variable_add tb.i_display.pixel_10 +variable_add tb.i_display.pixel_09 +variable_add tb.i_display.pixel_08 +variable_add tb.i_display.pixel_07 +variable_add tb.i_display.pixel_06 +variable_add tb.i_display.pixel_05 +variable_add tb.i_display.pixel_04 +variable_add tb.i_display.pixel_03 +variable_add tb.i_display.pixel_02 +variable_add tb.i_display.pixel_01 +variable_add tb.i_display.pixel_00 +variable_add tb.i_lcd.LCD_DE +variable_add tb.i_lcd.LCD_HSYNC +variable_add tb.LCD_R +variable_add tb.LCD_G +variable_add tb.LCD_B +variable_add tb.x +variable_add tb.y + +scope_select tb.i_lcd + +item_focus bo +item_set_format Unsigned +item_set_color Yellow + +item_focus bp +item_set_format Unsigned +item_set_color Gray + +item_focus ca +item_set_format Unsigned +item_set_color Red + +item_focus cb +item_set_format Unsigned +item_set_color Green + +item_focus cc +item_set_format Unsigned +item_set_color Blue + +item_focus cd +item_set_format Unsigned +item_set_color Gray + +item_focus ce +item_set_format Unsigned +item_set_color Gray + +zoom_in +zoom_in +zoom_in +zoom_in +zoom_in +scroll_to_end \ No newline at end of file diff --git a/labs/2_graphics/2_2_rectangle_ellipse_parabola_moving/tb.sv b/labs/2_graphics/2_2_rectangle_ellipse_parabola_moving/tb.sv index 4c88f3b5..4b7e9e78 100644 --- a/labs/2_graphics/2_2_rectangle_ellipse_parabola_moving/tb.sv +++ b/labs/2_graphics/2_2_rectangle_ellipse_parabola_moving/tb.sv @@ -1,57 +1,306 @@ `include "config.svh" + // Shows the image on the VGA screen using signal lines in Wave Analyzer + module tb; - localparam clk_mhz = 1, - w_key = 4, - w_sw = 8, - w_led = 8, - w_digit = 8, - w_gpio = 100; + timeunit 1ns; + timeprecision 1ps; + + //------------------------------------------------------------------------ + + localparam clk_mhz = 27, + pixel_mhz = 9, + w_key = 4, + w_sw = 4, + w_led = 8, + w_digit = 8, + w_gpio = 32, + w_red = 5, + w_green = 6, + w_blue = 5, + screen_width = 480, + screen_height = 272, + w_x = $clog2 ( screen_width ), + w_y = $clog2 ( screen_height ); + + localparam clk_period = 30ns; //------------------------------------------------------------------------ - logic clk; - logic rst; - logic [3:0] key; - logic [7:0] sw; + logic clk; + logic pixel_clk; + logic rst; + logic [w_key - 1:0] key; + logic [w_x - 1:0] x; + logic [w_y - 1:0] y; + logic [ 0:0] pixel; + logic LCD_DE; + logic LCD_VS; + logic LCD_HS; + logic LCD_CLK; + logic LCD_BL; + logic [ 4:0] LCD_R; + logic [ 5:0] LCD_G; + logic [ 4:0] LCD_B; //------------------------------------------------------------------------ lab_top # ( - .clk_mhz ( clk_mhz ), - .w_key ( w_key ), - .w_sw ( w_sw ), - .w_led ( w_led ), - .w_digit ( w_digit ), - .w_gpio ( w_gpio ) + .clk_mhz ( clk_mhz ), + .w_key ( w_key ), + .w_sw ( w_key ), + .w_led ( w_led ), + .w_digit ( w_digit ), + .w_gpio ( w_gpio ), + .screen_width ( screen_width ), + .screen_height ( screen_height ), + .w_red ( w_red ), + .w_green ( w_green ), + .w_blue ( w_blue ) ) i_lab_top ( - .clk ( clk ), - .slow_clk ( clk ), - .rst ( rst ), - .key ( key ), - .sw ( sw ) + .clk ( clk ), + .slow_clk ( slow_clk ), + .rst ( rst ), + .key ( key ), + .x ( x ), + .y ( y ), + .red ( LCD_R ), + .green ( LCD_G ), + .blue ( LCD_B ) + + ); + + // We output all the green pixels to signal lines in Wave Analyzer + + assign pixel = |LCD_R; // You can try it |LCD_G or |LCD_B or a mix of them + + //------------------------------------------------------------------------ + + tb_lcd_480_272 i_lcd + ( + .PixelClk ( pixel_clk ), + .rst ( rst ), + .LCD_DE ( LCD_DE ), + .LCD_HSYNC ( LCD_HS ), + .LCD_VSYNC ( LCD_VS ), + .x ( x ), + .y ( y ) + ); + + //------------------------------------------------------------------------ + + // We output pixels to signal lines in Wave Analyzer + + tb_lcd_display i_display + ( + .PixelClk ( pixel_clk ), + .rst ( rst ), + .LCD_DE ( LCD_DE ), + .LCD_HSYNC ( LCD_HS ), + .LCD_VSYNC ( LCD_VS ), + .pixel ( pixel ) ); + //------------------------------------------------------------------------ + initial + begin + clk = 1'b0; + + forever + # (clk_period / 2) clk = ~ clk; + end + + //------------------------------------------------------------------------ + + initial + begin + pixel_clk = 1'b0; + + forever + # (clk_period / 6) pixel_clk = ~ pixel_clk; + end + //------------------------------------------------------------------------ + initial + begin + rst <= 'bx; + repeat (2) @ (posedge clk); + rst <= 1; + repeat (2) @ (posedge clk); + rst <= 0; + end + + //------------------------------------------------------------------------ + + assign key = w_key' (0); + initial begin `ifdef __ICARUS__ $dumpvars; `endif - repeat (8) - begin - # 10 - key <= $urandom (); - sw <= $urandom (); - end + // Based on timescale is 1 ns / 1 ps + + # 0.0001740s // We simulate until the end of the first frame + + `ifdef MODEL_TECH // Mentor ModelSim and Questa + $stop; + `else + $finish; + `endif + end + +endmodule + + // Scan and Sync signal generator for VGA screen + +module tb_lcd_480_272 +( + input PixelClk, + input rst, + output LCD_DE, + output LCD_HSYNC, + output LCD_VSYNC, + output [8:0] x, + output [8:0] y +); - $finish; + // Calculation of visible, invisible pixel fields and synchronization signals + + parameter H_Pixel_Valid = 16'd480; + parameter H_FrontPorch = 16'd50; + parameter H_BackPorch = 16'd30; + parameter PixelForHS = H_Pixel_Valid + H_FrontPorch + H_BackPorch; + parameter V_Pixel_Valid = 16'd272; + parameter V_FrontPorch = 16'd20; + parameter V_BackPorch = 16'd5; + parameter PixelForVS = V_Pixel_Valid + V_FrontPorch + V_BackPorch; + + // Pixel counter + + logic [15:0] H_PixelCount; + logic [15:0] V_PixelCount; + + always_ff @ ( posedge PixelClk or posedge rst )begin + if ( rst ) begin + V_PixelCount <= 16'b0; + H_PixelCount <= 16'b0; + end + else if ( H_PixelCount == PixelForHS ) begin // We show every 9 lines using + V_PixelCount <= V_PixelCount + 4'd9; // signal lines in Wave Analyzer + H_PixelCount <= 16'b0; + end + else if ( V_PixelCount >= PixelForVS ) begin + V_PixelCount <= 16'b0; + H_PixelCount <= 16'b0; + end + else begin + V_PixelCount <= V_PixelCount ; + H_PixelCount <= H_PixelCount + 1'b1; + end end + // Synchronization signals + + assign LCD_HSYNC = H_PixelCount <= ( PixelForHS - H_FrontPorch ) ? 1'b0 : 1'b1; + assign LCD_VSYNC = V_PixelCount < ( PixelForVS ) ? 1'b0 : 1'b1; + assign LCD_DE = ( H_PixelCount >= H_BackPorch ) && + ( H_PixelCount <= H_Pixel_Valid + H_BackPorch ) && + ( V_PixelCount >= V_BackPorch ) && + ( V_PixelCount <= V_Pixel_Valid + V_BackPorch ) && PixelClk; + + // Current pixel position + + assign x = 9' (H_PixelCount - H_BackPorch); + assign y = 9' (V_PixelCount - V_BackPorch); + +endmodule + + // Shows the image on the VGA screen using signal lines in Wave Analyzer + +module tb_lcd_display +( + input PixelClk, + input rst, + input LCD_DE, + input LCD_HSYNC, + input LCD_VSYNC, + input pixel, + output pixel_00, + output pixel_01, + output pixel_02, + output pixel_03, + output pixel_04, + output pixel_05, + output pixel_06, + output pixel_07, + output pixel_08, + output pixel_09, + output pixel_10, + output pixel_11, + output pixel_12, + output pixel_13, + output pixel_14, + output pixel_15, + output pixel_16, + output pixel_17, + output pixel_18, + output pixel_19, + output pixel_20, + output pixel_21, + output pixel_22, + output pixel_23, + output pixel_24, + output pixel_25, + output pixel_26, + output pixel_27, + output pixel_28, + output pixel_29 +); + + logic [29:0] [481:0] mem; + + always_ff @ ( posedge LCD_DE or posedge rst ) + if ( rst ) + mem <= '0; + else + mem <= {mem, pixel}; + + assign pixel_00 = mem [00] [0]; + assign pixel_01 = mem [01] [0]; + assign pixel_02 = mem [02] [0]; + assign pixel_03 = mem [03] [0]; + assign pixel_04 = mem [04] [0]; + assign pixel_05 = mem [05] [0]; + assign pixel_06 = mem [06] [0]; + assign pixel_07 = mem [07] [0]; + assign pixel_08 = mem [08] [0]; + assign pixel_09 = mem [09] [0]; + assign pixel_10 = mem [10] [0]; + assign pixel_11 = mem [11] [0]; + assign pixel_12 = mem [12] [0]; + assign pixel_13 = mem [13] [0]; + assign pixel_14 = mem [14] [0]; + assign pixel_15 = mem [15] [0]; + assign pixel_16 = mem [16] [0]; + assign pixel_17 = mem [17] [0]; + assign pixel_18 = mem [18] [0]; + assign pixel_19 = mem [19] [0]; + assign pixel_20 = mem [20] [0]; + assign pixel_21 = mem [21] [0]; + assign pixel_22 = mem [22] [0]; + assign pixel_23 = mem [23] [0]; + assign pixel_24 = mem [24] [0]; + assign pixel_25 = mem [25] [0]; + assign pixel_26 = mem [26] [0]; + assign pixel_27 = mem [27] [0]; + assign pixel_28 = mem [28] [0]; + assign pixel_29 = mem [29] [0]; + endmodule diff --git a/labs/2_graphics/2_3_color_stripes/gtkwave.tcl b/labs/2_graphics/2_3_color_stripes/gtkwave.tcl new file mode 100644 index 00000000..e9b71182 --- /dev/null +++ b/labs/2_graphics/2_3_color_stripes/gtkwave.tcl @@ -0,0 +1,74 @@ +# gtkwave::loadFile "dump.vcd" + +set all_signals [list] + +lappend all_signals tb.i_display.pixel_29 +lappend all_signals tb.i_display.pixel_28 +lappend all_signals tb.i_display.pixel_27 +lappend all_signals tb.i_display.pixel_26 +lappend all_signals tb.i_display.pixel_25 +lappend all_signals tb.i_display.pixel_24 +lappend all_signals tb.i_display.pixel_23 +lappend all_signals tb.i_display.pixel_22 +lappend all_signals tb.i_display.pixel_21 +lappend all_signals tb.i_display.pixel_20 +lappend all_signals tb.i_display.pixel_19 +lappend all_signals tb.i_display.pixel_18 +lappend all_signals tb.i_display.pixel_17 +lappend all_signals tb.i_display.pixel_16 +lappend all_signals tb.i_display.pixel_15 +lappend all_signals tb.i_display.pixel_14 +lappend all_signals tb.i_display.pixel_13 +lappend all_signals tb.i_display.pixel_12 +lappend all_signals tb.i_display.pixel_11 +lappend all_signals tb.i_display.pixel_10 +lappend all_signals tb.i_display.pixel_09 +lappend all_signals tb.i_display.pixel_08 +lappend all_signals tb.i_display.pixel_07 +lappend all_signals tb.i_display.pixel_06 +lappend all_signals tb.i_display.pixel_05 +lappend all_signals tb.i_display.pixel_04 +lappend all_signals tb.i_display.pixel_03 +lappend all_signals tb.i_display.pixel_02 +lappend all_signals tb.i_display.pixel_01 +lappend all_signals tb.i_display.pixel_00 + +lappend all_signals tb.i_lcd.LCD_DE +lappend all_signals tb.i_lcd.LCD_HSYNC +lappend all_signals tb.LCD_R +lappend all_signals tb.LCD_G +lappend all_signals tb.LCD_B +lappend all_signals tb.x +lappend all_signals tb.y + +set num_added [ gtkwave::addSignalsFromList $all_signals ] + +gtkwave::highlightSignalsFromList "tb.LCD_R\[4:0\]" +gtkwave::/Edit/Data_Format/Analog/Step +gtkwave::/Edit/Data_Format/Decimal + +gtkwave::highlightSignalsFromList "tb.LCD_G\[5:0\]" +gtkwave::/Edit/Data_Format/Analog/Step +gtkwave::/Edit/Data_Format/Decimal + +gtkwave::highlightSignalsFromList "tb.LCD_B\[4:0\]" +gtkwave::/Edit/Data_Format/Analog/Step +gtkwave::/Edit/Data_Format/Decimal + +gtkwave::highlightSignalsFromList "tb.x\[8:0\]" +gtkwave::/Edit/Data_Format/Analog/Step +gtkwave::/Edit/Data_Format/Decimal + +gtkwave::highlightSignalsFromList "tb.y\[8:0\]" +gtkwave::/Edit/Data_Format/Analog/Step +gtkwave::/Edit/Data_Format/Decimal + +gtkwave::/Time/Zoom/Zoom_Full +gtkwave::/Time/Zoom/Zoom_In +gtkwave::/Time/Zoom/Zoom_In +gtkwave::/Time/Zoom/Zoom_In +gtkwave::/Time/Zoom/Zoom_In +gtkwave::/Time/Zoom/Zoom_In +gtkwave::/Time/Zoom/Zoom_To_End + +gtkwave::/Edit/UnHighlight_All diff --git a/labs/2_graphics/2_3_color_stripes/surfer.scr b/labs/2_graphics/2_3_color_stripes/surfer.scr new file mode 100644 index 00000000..f2613945 --- /dev/null +++ b/labs/2_graphics/2_3_color_stripes/surfer.scr @@ -0,0 +1,74 @@ +variable_add tb.i_display.pixel_29 +variable_add tb.i_display.pixel_28 +variable_add tb.i_display.pixel_27 +variable_add tb.i_display.pixel_26 +variable_add tb.i_display.pixel_25 +variable_add tb.i_display.pixel_24 +variable_add tb.i_display.pixel_23 +variable_add tb.i_display.pixel_22 +variable_add tb.i_display.pixel_21 +variable_add tb.i_display.pixel_20 +variable_add tb.i_display.pixel_19 +variable_add tb.i_display.pixel_18 +variable_add tb.i_display.pixel_17 +variable_add tb.i_display.pixel_16 +variable_add tb.i_display.pixel_15 +variable_add tb.i_display.pixel_14 +variable_add tb.i_display.pixel_13 +variable_add tb.i_display.pixel_12 +variable_add tb.i_display.pixel_11 +variable_add tb.i_display.pixel_10 +variable_add tb.i_display.pixel_09 +variable_add tb.i_display.pixel_08 +variable_add tb.i_display.pixel_07 +variable_add tb.i_display.pixel_06 +variable_add tb.i_display.pixel_05 +variable_add tb.i_display.pixel_04 +variable_add tb.i_display.pixel_03 +variable_add tb.i_display.pixel_02 +variable_add tb.i_display.pixel_01 +variable_add tb.i_display.pixel_00 +variable_add tb.i_lcd.LCD_DE +variable_add tb.i_lcd.LCD_HSYNC +variable_add tb.LCD_R +variable_add tb.LCD_G +variable_add tb.LCD_B +variable_add tb.x +variable_add tb.y + +scope_select tb.i_lcd + +item_focus bo +item_set_format Unsigned +item_set_color Yellow + +item_focus bp +item_set_format Unsigned +item_set_color Gray + +item_focus ca +item_set_format Unsigned +item_set_color Red + +item_focus cb +item_set_format Unsigned +item_set_color Green + +item_focus cc +item_set_format Unsigned +item_set_color Blue + +item_focus cd +item_set_format Unsigned +item_set_color Gray + +item_focus ce +item_set_format Unsigned +item_set_color Gray + +zoom_in +zoom_in +zoom_in +zoom_in +zoom_in +scroll_to_end \ No newline at end of file diff --git a/labs/2_graphics/2_3_color_stripes/tb.sv b/labs/2_graphics/2_3_color_stripes/tb.sv index 4c88f3b5..4b7e9e78 100644 --- a/labs/2_graphics/2_3_color_stripes/tb.sv +++ b/labs/2_graphics/2_3_color_stripes/tb.sv @@ -1,57 +1,306 @@ `include "config.svh" + // Shows the image on the VGA screen using signal lines in Wave Analyzer + module tb; - localparam clk_mhz = 1, - w_key = 4, - w_sw = 8, - w_led = 8, - w_digit = 8, - w_gpio = 100; + timeunit 1ns; + timeprecision 1ps; + + //------------------------------------------------------------------------ + + localparam clk_mhz = 27, + pixel_mhz = 9, + w_key = 4, + w_sw = 4, + w_led = 8, + w_digit = 8, + w_gpio = 32, + w_red = 5, + w_green = 6, + w_blue = 5, + screen_width = 480, + screen_height = 272, + w_x = $clog2 ( screen_width ), + w_y = $clog2 ( screen_height ); + + localparam clk_period = 30ns; //------------------------------------------------------------------------ - logic clk; - logic rst; - logic [3:0] key; - logic [7:0] sw; + logic clk; + logic pixel_clk; + logic rst; + logic [w_key - 1:0] key; + logic [w_x - 1:0] x; + logic [w_y - 1:0] y; + logic [ 0:0] pixel; + logic LCD_DE; + logic LCD_VS; + logic LCD_HS; + logic LCD_CLK; + logic LCD_BL; + logic [ 4:0] LCD_R; + logic [ 5:0] LCD_G; + logic [ 4:0] LCD_B; //------------------------------------------------------------------------ lab_top # ( - .clk_mhz ( clk_mhz ), - .w_key ( w_key ), - .w_sw ( w_sw ), - .w_led ( w_led ), - .w_digit ( w_digit ), - .w_gpio ( w_gpio ) + .clk_mhz ( clk_mhz ), + .w_key ( w_key ), + .w_sw ( w_key ), + .w_led ( w_led ), + .w_digit ( w_digit ), + .w_gpio ( w_gpio ), + .screen_width ( screen_width ), + .screen_height ( screen_height ), + .w_red ( w_red ), + .w_green ( w_green ), + .w_blue ( w_blue ) ) i_lab_top ( - .clk ( clk ), - .slow_clk ( clk ), - .rst ( rst ), - .key ( key ), - .sw ( sw ) + .clk ( clk ), + .slow_clk ( slow_clk ), + .rst ( rst ), + .key ( key ), + .x ( x ), + .y ( y ), + .red ( LCD_R ), + .green ( LCD_G ), + .blue ( LCD_B ) + + ); + + // We output all the green pixels to signal lines in Wave Analyzer + + assign pixel = |LCD_R; // You can try it |LCD_G or |LCD_B or a mix of them + + //------------------------------------------------------------------------ + + tb_lcd_480_272 i_lcd + ( + .PixelClk ( pixel_clk ), + .rst ( rst ), + .LCD_DE ( LCD_DE ), + .LCD_HSYNC ( LCD_HS ), + .LCD_VSYNC ( LCD_VS ), + .x ( x ), + .y ( y ) + ); + + //------------------------------------------------------------------------ + + // We output pixels to signal lines in Wave Analyzer + + tb_lcd_display i_display + ( + .PixelClk ( pixel_clk ), + .rst ( rst ), + .LCD_DE ( LCD_DE ), + .LCD_HSYNC ( LCD_HS ), + .LCD_VSYNC ( LCD_VS ), + .pixel ( pixel ) ); + //------------------------------------------------------------------------ + initial + begin + clk = 1'b0; + + forever + # (clk_period / 2) clk = ~ clk; + end + + //------------------------------------------------------------------------ + + initial + begin + pixel_clk = 1'b0; + + forever + # (clk_period / 6) pixel_clk = ~ pixel_clk; + end + //------------------------------------------------------------------------ + initial + begin + rst <= 'bx; + repeat (2) @ (posedge clk); + rst <= 1; + repeat (2) @ (posedge clk); + rst <= 0; + end + + //------------------------------------------------------------------------ + + assign key = w_key' (0); + initial begin `ifdef __ICARUS__ $dumpvars; `endif - repeat (8) - begin - # 10 - key <= $urandom (); - sw <= $urandom (); - end + // Based on timescale is 1 ns / 1 ps + + # 0.0001740s // We simulate until the end of the first frame + + `ifdef MODEL_TECH // Mentor ModelSim and Questa + $stop; + `else + $finish; + `endif + end + +endmodule + + // Scan and Sync signal generator for VGA screen + +module tb_lcd_480_272 +( + input PixelClk, + input rst, + output LCD_DE, + output LCD_HSYNC, + output LCD_VSYNC, + output [8:0] x, + output [8:0] y +); - $finish; + // Calculation of visible, invisible pixel fields and synchronization signals + + parameter H_Pixel_Valid = 16'd480; + parameter H_FrontPorch = 16'd50; + parameter H_BackPorch = 16'd30; + parameter PixelForHS = H_Pixel_Valid + H_FrontPorch + H_BackPorch; + parameter V_Pixel_Valid = 16'd272; + parameter V_FrontPorch = 16'd20; + parameter V_BackPorch = 16'd5; + parameter PixelForVS = V_Pixel_Valid + V_FrontPorch + V_BackPorch; + + // Pixel counter + + logic [15:0] H_PixelCount; + logic [15:0] V_PixelCount; + + always_ff @ ( posedge PixelClk or posedge rst )begin + if ( rst ) begin + V_PixelCount <= 16'b0; + H_PixelCount <= 16'b0; + end + else if ( H_PixelCount == PixelForHS ) begin // We show every 9 lines using + V_PixelCount <= V_PixelCount + 4'd9; // signal lines in Wave Analyzer + H_PixelCount <= 16'b0; + end + else if ( V_PixelCount >= PixelForVS ) begin + V_PixelCount <= 16'b0; + H_PixelCount <= 16'b0; + end + else begin + V_PixelCount <= V_PixelCount ; + H_PixelCount <= H_PixelCount + 1'b1; + end end + // Synchronization signals + + assign LCD_HSYNC = H_PixelCount <= ( PixelForHS - H_FrontPorch ) ? 1'b0 : 1'b1; + assign LCD_VSYNC = V_PixelCount < ( PixelForVS ) ? 1'b0 : 1'b1; + assign LCD_DE = ( H_PixelCount >= H_BackPorch ) && + ( H_PixelCount <= H_Pixel_Valid + H_BackPorch ) && + ( V_PixelCount >= V_BackPorch ) && + ( V_PixelCount <= V_Pixel_Valid + V_BackPorch ) && PixelClk; + + // Current pixel position + + assign x = 9' (H_PixelCount - H_BackPorch); + assign y = 9' (V_PixelCount - V_BackPorch); + +endmodule + + // Shows the image on the VGA screen using signal lines in Wave Analyzer + +module tb_lcd_display +( + input PixelClk, + input rst, + input LCD_DE, + input LCD_HSYNC, + input LCD_VSYNC, + input pixel, + output pixel_00, + output pixel_01, + output pixel_02, + output pixel_03, + output pixel_04, + output pixel_05, + output pixel_06, + output pixel_07, + output pixel_08, + output pixel_09, + output pixel_10, + output pixel_11, + output pixel_12, + output pixel_13, + output pixel_14, + output pixel_15, + output pixel_16, + output pixel_17, + output pixel_18, + output pixel_19, + output pixel_20, + output pixel_21, + output pixel_22, + output pixel_23, + output pixel_24, + output pixel_25, + output pixel_26, + output pixel_27, + output pixel_28, + output pixel_29 +); + + logic [29:0] [481:0] mem; + + always_ff @ ( posedge LCD_DE or posedge rst ) + if ( rst ) + mem <= '0; + else + mem <= {mem, pixel}; + + assign pixel_00 = mem [00] [0]; + assign pixel_01 = mem [01] [0]; + assign pixel_02 = mem [02] [0]; + assign pixel_03 = mem [03] [0]; + assign pixel_04 = mem [04] [0]; + assign pixel_05 = mem [05] [0]; + assign pixel_06 = mem [06] [0]; + assign pixel_07 = mem [07] [0]; + assign pixel_08 = mem [08] [0]; + assign pixel_09 = mem [09] [0]; + assign pixel_10 = mem [10] [0]; + assign pixel_11 = mem [11] [0]; + assign pixel_12 = mem [12] [0]; + assign pixel_13 = mem [13] [0]; + assign pixel_14 = mem [14] [0]; + assign pixel_15 = mem [15] [0]; + assign pixel_16 = mem [16] [0]; + assign pixel_17 = mem [17] [0]; + assign pixel_18 = mem [18] [0]; + assign pixel_19 = mem [19] [0]; + assign pixel_20 = mem [20] [0]; + assign pixel_21 = mem [21] [0]; + assign pixel_22 = mem [22] [0]; + assign pixel_23 = mem [23] [0]; + assign pixel_24 = mem [24] [0]; + assign pixel_25 = mem [25] [0]; + assign pixel_26 = mem [26] [0]; + assign pixel_27 = mem [27] [0]; + assign pixel_28 = mem [28] [0]; + assign pixel_29 = mem [29] [0]; + endmodule diff --git a/labs/2_graphics/2_8_crash_course_basics_and_graphics/gtkwave.tcl b/labs/2_graphics/2_8_crash_course_basics_and_graphics/gtkwave.tcl new file mode 100644 index 00000000..e9b71182 --- /dev/null +++ b/labs/2_graphics/2_8_crash_course_basics_and_graphics/gtkwave.tcl @@ -0,0 +1,74 @@ +# gtkwave::loadFile "dump.vcd" + +set all_signals [list] + +lappend all_signals tb.i_display.pixel_29 +lappend all_signals tb.i_display.pixel_28 +lappend all_signals tb.i_display.pixel_27 +lappend all_signals tb.i_display.pixel_26 +lappend all_signals tb.i_display.pixel_25 +lappend all_signals tb.i_display.pixel_24 +lappend all_signals tb.i_display.pixel_23 +lappend all_signals tb.i_display.pixel_22 +lappend all_signals tb.i_display.pixel_21 +lappend all_signals tb.i_display.pixel_20 +lappend all_signals tb.i_display.pixel_19 +lappend all_signals tb.i_display.pixel_18 +lappend all_signals tb.i_display.pixel_17 +lappend all_signals tb.i_display.pixel_16 +lappend all_signals tb.i_display.pixel_15 +lappend all_signals tb.i_display.pixel_14 +lappend all_signals tb.i_display.pixel_13 +lappend all_signals tb.i_display.pixel_12 +lappend all_signals tb.i_display.pixel_11 +lappend all_signals tb.i_display.pixel_10 +lappend all_signals tb.i_display.pixel_09 +lappend all_signals tb.i_display.pixel_08 +lappend all_signals tb.i_display.pixel_07 +lappend all_signals tb.i_display.pixel_06 +lappend all_signals tb.i_display.pixel_05 +lappend all_signals tb.i_display.pixel_04 +lappend all_signals tb.i_display.pixel_03 +lappend all_signals tb.i_display.pixel_02 +lappend all_signals tb.i_display.pixel_01 +lappend all_signals tb.i_display.pixel_00 + +lappend all_signals tb.i_lcd.LCD_DE +lappend all_signals tb.i_lcd.LCD_HSYNC +lappend all_signals tb.LCD_R +lappend all_signals tb.LCD_G +lappend all_signals tb.LCD_B +lappend all_signals tb.x +lappend all_signals tb.y + +set num_added [ gtkwave::addSignalsFromList $all_signals ] + +gtkwave::highlightSignalsFromList "tb.LCD_R\[4:0\]" +gtkwave::/Edit/Data_Format/Analog/Step +gtkwave::/Edit/Data_Format/Decimal + +gtkwave::highlightSignalsFromList "tb.LCD_G\[5:0\]" +gtkwave::/Edit/Data_Format/Analog/Step +gtkwave::/Edit/Data_Format/Decimal + +gtkwave::highlightSignalsFromList "tb.LCD_B\[4:0\]" +gtkwave::/Edit/Data_Format/Analog/Step +gtkwave::/Edit/Data_Format/Decimal + +gtkwave::highlightSignalsFromList "tb.x\[8:0\]" +gtkwave::/Edit/Data_Format/Analog/Step +gtkwave::/Edit/Data_Format/Decimal + +gtkwave::highlightSignalsFromList "tb.y\[8:0\]" +gtkwave::/Edit/Data_Format/Analog/Step +gtkwave::/Edit/Data_Format/Decimal + +gtkwave::/Time/Zoom/Zoom_Full +gtkwave::/Time/Zoom/Zoom_In +gtkwave::/Time/Zoom/Zoom_In +gtkwave::/Time/Zoom/Zoom_In +gtkwave::/Time/Zoom/Zoom_In +gtkwave::/Time/Zoom/Zoom_In +gtkwave::/Time/Zoom/Zoom_To_End + +gtkwave::/Edit/UnHighlight_All diff --git a/labs/2_graphics/2_8_crash_course_basics_and_graphics/surfer.scr b/labs/2_graphics/2_8_crash_course_basics_and_graphics/surfer.scr new file mode 100644 index 00000000..f2613945 --- /dev/null +++ b/labs/2_graphics/2_8_crash_course_basics_and_graphics/surfer.scr @@ -0,0 +1,74 @@ +variable_add tb.i_display.pixel_29 +variable_add tb.i_display.pixel_28 +variable_add tb.i_display.pixel_27 +variable_add tb.i_display.pixel_26 +variable_add tb.i_display.pixel_25 +variable_add tb.i_display.pixel_24 +variable_add tb.i_display.pixel_23 +variable_add tb.i_display.pixel_22 +variable_add tb.i_display.pixel_21 +variable_add tb.i_display.pixel_20 +variable_add tb.i_display.pixel_19 +variable_add tb.i_display.pixel_18 +variable_add tb.i_display.pixel_17 +variable_add tb.i_display.pixel_16 +variable_add tb.i_display.pixel_15 +variable_add tb.i_display.pixel_14 +variable_add tb.i_display.pixel_13 +variable_add tb.i_display.pixel_12 +variable_add tb.i_display.pixel_11 +variable_add tb.i_display.pixel_10 +variable_add tb.i_display.pixel_09 +variable_add tb.i_display.pixel_08 +variable_add tb.i_display.pixel_07 +variable_add tb.i_display.pixel_06 +variable_add tb.i_display.pixel_05 +variable_add tb.i_display.pixel_04 +variable_add tb.i_display.pixel_03 +variable_add tb.i_display.pixel_02 +variable_add tb.i_display.pixel_01 +variable_add tb.i_display.pixel_00 +variable_add tb.i_lcd.LCD_DE +variable_add tb.i_lcd.LCD_HSYNC +variable_add tb.LCD_R +variable_add tb.LCD_G +variable_add tb.LCD_B +variable_add tb.x +variable_add tb.y + +scope_select tb.i_lcd + +item_focus bo +item_set_format Unsigned +item_set_color Yellow + +item_focus bp +item_set_format Unsigned +item_set_color Gray + +item_focus ca +item_set_format Unsigned +item_set_color Red + +item_focus cb +item_set_format Unsigned +item_set_color Green + +item_focus cc +item_set_format Unsigned +item_set_color Blue + +item_focus cd +item_set_format Unsigned +item_set_color Gray + +item_focus ce +item_set_format Unsigned +item_set_color Gray + +zoom_in +zoom_in +zoom_in +zoom_in +zoom_in +scroll_to_end \ No newline at end of file diff --git a/labs/2_graphics/2_8_crash_course_basics_and_graphics/tb.sv b/labs/2_graphics/2_8_crash_course_basics_and_graphics/tb.sv index 4c88f3b5..4b7e9e78 100644 --- a/labs/2_graphics/2_8_crash_course_basics_and_graphics/tb.sv +++ b/labs/2_graphics/2_8_crash_course_basics_and_graphics/tb.sv @@ -1,57 +1,306 @@ `include "config.svh" + // Shows the image on the VGA screen using signal lines in Wave Analyzer + module tb; - localparam clk_mhz = 1, - w_key = 4, - w_sw = 8, - w_led = 8, - w_digit = 8, - w_gpio = 100; + timeunit 1ns; + timeprecision 1ps; + + //------------------------------------------------------------------------ + + localparam clk_mhz = 27, + pixel_mhz = 9, + w_key = 4, + w_sw = 4, + w_led = 8, + w_digit = 8, + w_gpio = 32, + w_red = 5, + w_green = 6, + w_blue = 5, + screen_width = 480, + screen_height = 272, + w_x = $clog2 ( screen_width ), + w_y = $clog2 ( screen_height ); + + localparam clk_period = 30ns; //------------------------------------------------------------------------ - logic clk; - logic rst; - logic [3:0] key; - logic [7:0] sw; + logic clk; + logic pixel_clk; + logic rst; + logic [w_key - 1:0] key; + logic [w_x - 1:0] x; + logic [w_y - 1:0] y; + logic [ 0:0] pixel; + logic LCD_DE; + logic LCD_VS; + logic LCD_HS; + logic LCD_CLK; + logic LCD_BL; + logic [ 4:0] LCD_R; + logic [ 5:0] LCD_G; + logic [ 4:0] LCD_B; //------------------------------------------------------------------------ lab_top # ( - .clk_mhz ( clk_mhz ), - .w_key ( w_key ), - .w_sw ( w_sw ), - .w_led ( w_led ), - .w_digit ( w_digit ), - .w_gpio ( w_gpio ) + .clk_mhz ( clk_mhz ), + .w_key ( w_key ), + .w_sw ( w_key ), + .w_led ( w_led ), + .w_digit ( w_digit ), + .w_gpio ( w_gpio ), + .screen_width ( screen_width ), + .screen_height ( screen_height ), + .w_red ( w_red ), + .w_green ( w_green ), + .w_blue ( w_blue ) ) i_lab_top ( - .clk ( clk ), - .slow_clk ( clk ), - .rst ( rst ), - .key ( key ), - .sw ( sw ) + .clk ( clk ), + .slow_clk ( slow_clk ), + .rst ( rst ), + .key ( key ), + .x ( x ), + .y ( y ), + .red ( LCD_R ), + .green ( LCD_G ), + .blue ( LCD_B ) + + ); + + // We output all the green pixels to signal lines in Wave Analyzer + + assign pixel = |LCD_R; // You can try it |LCD_G or |LCD_B or a mix of them + + //------------------------------------------------------------------------ + + tb_lcd_480_272 i_lcd + ( + .PixelClk ( pixel_clk ), + .rst ( rst ), + .LCD_DE ( LCD_DE ), + .LCD_HSYNC ( LCD_HS ), + .LCD_VSYNC ( LCD_VS ), + .x ( x ), + .y ( y ) + ); + + //------------------------------------------------------------------------ + + // We output pixels to signal lines in Wave Analyzer + + tb_lcd_display i_display + ( + .PixelClk ( pixel_clk ), + .rst ( rst ), + .LCD_DE ( LCD_DE ), + .LCD_HSYNC ( LCD_HS ), + .LCD_VSYNC ( LCD_VS ), + .pixel ( pixel ) ); + //------------------------------------------------------------------------ + initial + begin + clk = 1'b0; + + forever + # (clk_period / 2) clk = ~ clk; + end + + //------------------------------------------------------------------------ + + initial + begin + pixel_clk = 1'b0; + + forever + # (clk_period / 6) pixel_clk = ~ pixel_clk; + end + //------------------------------------------------------------------------ + initial + begin + rst <= 'bx; + repeat (2) @ (posedge clk); + rst <= 1; + repeat (2) @ (posedge clk); + rst <= 0; + end + + //------------------------------------------------------------------------ + + assign key = w_key' (0); + initial begin `ifdef __ICARUS__ $dumpvars; `endif - repeat (8) - begin - # 10 - key <= $urandom (); - sw <= $urandom (); - end + // Based on timescale is 1 ns / 1 ps + + # 0.0001740s // We simulate until the end of the first frame + + `ifdef MODEL_TECH // Mentor ModelSim and Questa + $stop; + `else + $finish; + `endif + end + +endmodule + + // Scan and Sync signal generator for VGA screen + +module tb_lcd_480_272 +( + input PixelClk, + input rst, + output LCD_DE, + output LCD_HSYNC, + output LCD_VSYNC, + output [8:0] x, + output [8:0] y +); - $finish; + // Calculation of visible, invisible pixel fields and synchronization signals + + parameter H_Pixel_Valid = 16'd480; + parameter H_FrontPorch = 16'd50; + parameter H_BackPorch = 16'd30; + parameter PixelForHS = H_Pixel_Valid + H_FrontPorch + H_BackPorch; + parameter V_Pixel_Valid = 16'd272; + parameter V_FrontPorch = 16'd20; + parameter V_BackPorch = 16'd5; + parameter PixelForVS = V_Pixel_Valid + V_FrontPorch + V_BackPorch; + + // Pixel counter + + logic [15:0] H_PixelCount; + logic [15:0] V_PixelCount; + + always_ff @ ( posedge PixelClk or posedge rst )begin + if ( rst ) begin + V_PixelCount <= 16'b0; + H_PixelCount <= 16'b0; + end + else if ( H_PixelCount == PixelForHS ) begin // We show every 9 lines using + V_PixelCount <= V_PixelCount + 4'd9; // signal lines in Wave Analyzer + H_PixelCount <= 16'b0; + end + else if ( V_PixelCount >= PixelForVS ) begin + V_PixelCount <= 16'b0; + H_PixelCount <= 16'b0; + end + else begin + V_PixelCount <= V_PixelCount ; + H_PixelCount <= H_PixelCount + 1'b1; + end end + // Synchronization signals + + assign LCD_HSYNC = H_PixelCount <= ( PixelForHS - H_FrontPorch ) ? 1'b0 : 1'b1; + assign LCD_VSYNC = V_PixelCount < ( PixelForVS ) ? 1'b0 : 1'b1; + assign LCD_DE = ( H_PixelCount >= H_BackPorch ) && + ( H_PixelCount <= H_Pixel_Valid + H_BackPorch ) && + ( V_PixelCount >= V_BackPorch ) && + ( V_PixelCount <= V_Pixel_Valid + V_BackPorch ) && PixelClk; + + // Current pixel position + + assign x = 9' (H_PixelCount - H_BackPorch); + assign y = 9' (V_PixelCount - V_BackPorch); + +endmodule + + // Shows the image on the VGA screen using signal lines in Wave Analyzer + +module tb_lcd_display +( + input PixelClk, + input rst, + input LCD_DE, + input LCD_HSYNC, + input LCD_VSYNC, + input pixel, + output pixel_00, + output pixel_01, + output pixel_02, + output pixel_03, + output pixel_04, + output pixel_05, + output pixel_06, + output pixel_07, + output pixel_08, + output pixel_09, + output pixel_10, + output pixel_11, + output pixel_12, + output pixel_13, + output pixel_14, + output pixel_15, + output pixel_16, + output pixel_17, + output pixel_18, + output pixel_19, + output pixel_20, + output pixel_21, + output pixel_22, + output pixel_23, + output pixel_24, + output pixel_25, + output pixel_26, + output pixel_27, + output pixel_28, + output pixel_29 +); + + logic [29:0] [481:0] mem; + + always_ff @ ( posedge LCD_DE or posedge rst ) + if ( rst ) + mem <= '0; + else + mem <= {mem, pixel}; + + assign pixel_00 = mem [00] [0]; + assign pixel_01 = mem [01] [0]; + assign pixel_02 = mem [02] [0]; + assign pixel_03 = mem [03] [0]; + assign pixel_04 = mem [04] [0]; + assign pixel_05 = mem [05] [0]; + assign pixel_06 = mem [06] [0]; + assign pixel_07 = mem [07] [0]; + assign pixel_08 = mem [08] [0]; + assign pixel_09 = mem [09] [0]; + assign pixel_10 = mem [10] [0]; + assign pixel_11 = mem [11] [0]; + assign pixel_12 = mem [12] [0]; + assign pixel_13 = mem [13] [0]; + assign pixel_14 = mem [14] [0]; + assign pixel_15 = mem [15] [0]; + assign pixel_16 = mem [16] [0]; + assign pixel_17 = mem [17] [0]; + assign pixel_18 = mem [18] [0]; + assign pixel_19 = mem [19] [0]; + assign pixel_20 = mem [20] [0]; + assign pixel_21 = mem [21] [0]; + assign pixel_22 = mem [22] [0]; + assign pixel_23 = mem [23] [0]; + assign pixel_24 = mem [24] [0]; + assign pixel_25 = mem [25] [0]; + assign pixel_26 = mem [26] [0]; + assign pixel_27 = mem [27] [0]; + assign pixel_28 = mem [28] [0]; + assign pixel_29 = mem [29] [0]; + endmodule