关于VGA显示图片的问题

2019-07-15 22:06发布

  1. module test_ram(
  2.     input clk_100MHz,
  3.     input rst,
  4.     output reg[3:0] R,
  5.     output reg[3:0] G,
  6.     output reg[3:0] B,
  7.     output HS,
  8.     output VS);
  9.     reg[17:0] addra=0;
  10.     wire douta;
  11.     reg[1:0] cnt = 0;
  12.     wire clk_25MHz;
  13.     reg color=0;
  14.     always @(posedge clk_100MHz)
  15.     begin
  16.         if(rst) cnt<=0;
  17.         else cnt<=cnt+1;
  18.     end
  19.     assign clk_25MHz = cnt[1];
  20.    
  21.     //row parameter
  22.         parameter H_CNT_MAX=10'd800;
  23.         parameter H_HS=10'd96;
  24.         parameter H_BP=10'd48;
  25.         parameter H_DISP=10'd640;
  26.         parameter H_FP=10'd16;
  27.         parameter H_Left=H_HS+H_BP;
  28.         parameter H_Right=H_HS+H_BP+H_DISP;
  29.         //colum
  30.         parameter V_CNT_MAX=10'd521;
  31.         parameter V_HS=10'd2;
  32.         parameter V_BP=10'd29;
  33.         parameter V_DISP=10'd480;
  34.         parameter V_FP=10'd10;
  35.         parameter V_Left=V_HS+V_BP;
  36.         parameter V_Right=V_HS+V_BP+V_DISP;
  37.         reg[9:0] h_cnt=0;
  38.         reg[9:0] v_cnt=0;
  39.     wire disp_vaild;
  40.     always @(posedge clk_25MHz or posedge rst)
  41.     begin
  42.         if(rst)
  43.         begin
  44.             h_cnt<=0;
  45.             v_cnt<=0;
  46.             addra<=0;
  47.         end
  48.         else
  49.         begin
  50.             if(h_cnt==(H_CNT_MAX-1))
  51.             begin
  52.                 h_cnt<=0;
  53.                 if(v_cnt==(V_CNT_MAX-1)) v_cnt<=0;
  54.                 else v_cnt<=v_cnt+1;
  55.             end
  56.             else
  57.             begin
  58.                 if(h_cnt>H_Left&& h_cnt<H_Left+600 && v_cnt>V_Left && v_cnt<V_Left+400)
  59.                 begin
  60.                     color = douta;
  61.                     if(addra==239999)
  62.                         addra<=0;
  63.                     else
  64.                         addra<=addra+1;
  65.                 end
  66.                 h_cnt<=h_cnt+1;
  67.                
  68.             end
  69.         end
  70.     end
  71.     //HS
  72.     assign HS=(h_cnt<H_HS)?1'b0:1'b1;
  73.     //VS
  74.     assign VS=(v_cnt<V_HS)?1'b0:1'b1;
  75.     //vaild region for display
  76.     assign disp_vaild=((h_cnt>=H_Left)&(h_cnt<=H_Right)&(v_cnt>=V_Left)&(v_cnt<=V_Right))?1'b1:1'b0;
  77.     //dispaly strips, one color per 32 lines,begin from v_cnt=31
  78.     always@(*)
  79.     begin
  80.         R=0;G=0;B=0; //color black
  81.         if(disp_vaild)
  82.         begin
  83.             if(h_cnt>H_Left && h_cnt<H_Left+600 && v_cnt>V_Left && v_cnt<V_Left+400)
  84.             begin
  85.                 case(color)
  86.                 0:begin R=0;G=0;B=0; end
  87.                 1:begin R=4'b1111;G=4'b1111;B=4'b1111; end
  88.                 endcase
  89.             end
  90.         end
  91.     end
  92.     blk_mem_gen_0 ram0 (
  93.       .clka(clk_100MHz),    // input wire clka
  94.       .ena(1),      // input wire ena
  95.       .wea(0),      // input wire [0 : 0] wea
  96.       .addra(addra),  // input wire [17 : 0] addra
  97.       .dina(0),    // input wire [0 : 0] dina
  98.       .douta(douta)  // output wire [0 : 0] douta
  99.     );
  100. endmodule
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。