在这篇文以及下面几篇文里里使用HPS-FPGA-Slave实现HPS读取一张bmp图片,发送至SDRAM,然后由自定义的IP读取SDRAM输出至VGA显示。
不妥当的地方还需多多指教
IP逻辑设计
VGA时序控制模块,选择mod控制输出不同的分辨率
//vga timing ctrl module // systemverilog // //by Sorin module vga_timctrl( input clk,//200MHz input [1:0] mod, //input rst, output hsync,// output vsync,// output logic [10:0] addr_x,// output logic [10:0] addr_y,// output video_on,//, output logic clk_cycle//actule clock output ); //800*600@72Hz //***************vga mode*************** ********************* // // 800 40 128 88 600 1 4 23 //"800x600@72" 50.0 800 856 976 1040 600 637 643 666 --mod0 //"800x600@60" 40.0 800 840 968 1056 600 601 605 628 --mod1 //"640x480@60" 25.2 640 656 752 800 480 490 492 525 --mod2 //"1280x960@60" 102.1 1280 1360 1496 1712 960 961 964 994 --mod3 //"1280x1024@60" 108.0 1280 1328 1440 1688 1024 1025 1028 1066 --not surport logic[10:0] V_W=1280;// logic[10:0] V_H=1024;// logic[10:0] H_Sync_Start=1328;// logic[10:0] H_Sync_Stop=1440;// logic[10:0] H_Total=1688;// logic[10:0] V_Sync_Start=1025;// logic[10:0] V_Sync_Stop=1028; logic[10:0] V_Total=1066;// logic [3:0] CLK_DIV_CNT=0; logic inner_clk; logic [2:0] clk_cnt=0; logic inner_clk_reg; //assign inner_clk=inner_clk_reg; //clk divider always @(posedge clk) begin clk_cnt<=clk_cnt+1; end wire[10:0] V_Counter; wire[10:0] H_Counter; wire H_Video_On; wire V_Video_On; wire V_Clk; wire H_CLR; wire V_CLR; assign V_Clk=H_Video_On; assign video_on=H_Video_On&&V_Video_On; assign addr_x=video_on?H_Counter:V_W; assign addr_y=video_on?V_Counter:V_H; //assign inner_clk=clk; c_counter_binary Counter_H(.CLK(inner_clk),.SCLR(H_CLR),.Q(H_Counter),.CE(1)); c_counter_binary Counter_V(.CLK(inner_clk),.SCLR(V_CLR),.Q(V_Counter),.CE(H_CLR)); assign H_Video_On=(H_Counter<V_W)?1:0; assign V_Video_On=(V_Counter<V_H)?1:0; assign H_CLR=(H_Counter==H_Total-1)?1:0; assign V_CLR=((V_Counter==V_Total-1)&&H_CLR)?1:0; assign hsync=(H_Counter<H_Sync_Stop&&H_Counter>H_Sync_Start)?0:1; assign vsync=(V_Counter<V_Sync_Stop&&V_Counter>V_Sync_Start)?0:1; assign test=V_CLR; //modset always_comb begin case(mod) 'b00: begin V_W=800; V_H=600; H_Sync_Start=856; H_Sync_Stop=976; H_Total=1040; V_Sync_Start=637; V_Sync_Stop=643; V_Total=666; //CLK_DIV_CNT=2;//200M/4=50M inner_clk=clk_cnt[1]; end 'b01: