基于FPGA的串口传图SRAM缓存VGA显示( 二 )

<= 0;elseaddr <= addr + 1;endend// 串口传完整张图后,拉高receive_done,允许vga从sram中读取数据always @(posedge clk, negedge rst_n) beginif(!rst_n)receive_done <= 0;else if(cnt_end)receive_done <= 1;endendmodule
SRAM驱动模块
该SRAM为256k*16bit,为了存下300kb的灰度图,我将其包装为512k*8bit,写优先 。
包装方法:地址低于256k的数据写入SRAM的数据位低8位,地址高于高256kb数据写入SRAM的数据位高8位
module sram_ctrl(inputclk,inputrst_n,// wrinputwr_req,input[18:0]wr_addr,input[7:0]wr_data,// rdinputrd_req,input[18:0]rd_addr,output reg[7:0]rd_data,// sram sideoutput[17:0]SRAM_ADDR,inout[15:0]SRAM_DQ,outputSRAM_WE_N,outputSRAM_OE_N,outputSRAM_UB_N,outputSRAM_LB_N,outputSRAM_CE_N);assign SRAM_CE_N = 0;assign SRAM_OE_N = 0;assign SRAM_DQ= wr_req ? (SRAM_LB_N ? {wr_data, 8'hzz} : {8'hzz, wr_data}) : 16'hzzzz;assign SRAM_WE_N = ~wr_req;assign SRAM_ADDR = wr_req ? wr_addr[17:0] : rd_addr[17:0];// 将地址最高位作为256k分界线// 地址低于256k的数据写入SRAM的低8位,地址高于高256kb数据写入SRAM的高8位assign SRAM_LB_N = wr_req ? wr_addr[18] : rd_addr[18];assign SRAM_UB_N = ~SRAM_LB_N;// rd_dataalways @(posedge clk, negedge rst_n) beginif(!rst_n)rd_data <= 0;else if(rd_req) beginif(SRAM_LB_N)rd_data <= SRAM_DQ[15:8];elserd_data <= SRAM_DQ[7:0];endendendmodule
VGA驱动模块
使用友晶官方的VGA驱动模块,稍作修改,将输入输出的RGB信号从10位宽改为8位宽 。
module VGA_Ctrl ( // Host SideiRed,iGreen,iBlue,oCurrent_X,oCurrent_Y,oAddress,oRequest,// VGA SideoVGA_R,oVGA_G,oVGA_B,oVGA_HS,oVGA_VS,oVGA_SYNC,oVGA_BLANK,oVGA_CLOCK,// Control SignaliCLK,iRST_N );// Host Sideinput[7:0] iRed;input[7:0] iGreen;input[7:0] iBlue;output[21:0] oAddress;output[10:0] oCurrent_X;output[10:0] oCurrent_Y;outputoRequest;// VGA Sideoutput[7:0] oVGA_R;output[7:0] oVGA_G;output[7:0] oVGA_B;output regoVGA_HS;output regoVGA_VS;outputoVGA_SYNC;outputoVGA_BLANK;outputoVGA_CLOCK;// Control SignalinputiCLK;inputiRST_N; // Internal Registersreg[10:0] H_Cont;reg[10:0] V_Cont;// Horizontal Parameterparameter H_FRONT = 16;parameter H_SYNC = 96;parameter H_BACK = 48;parameter H_ACT = 640;parameter H_BLANK = H_FRONT+H_SYNC+H_BACK;parameter H_TOTAL = H_FRONT+H_SYNC+H_BACK+H_ACT;// Vertical Parameterparameter V_FRONT = 11;parameter V_SYNC = 2;parameter V_BACK = 31;parameter V_ACT = 480;parameter V_BLANK = V_FRONT+V_SYNC+V_BACK;parameter V_TOTAL = V_FRONT+V_SYNC+V_BACK+V_ACT;assign oVGA_SYNC = 1'b1;// This pin is unused.assign oVGA_BLANK = ~((H_Cont=H_BLANK && H_Cont=V_BLANK && V_Cont=H_BLANK) ? H_Cont-H_BLANK : 11'h0 ;assign oCurrent_Y = (V_Cont>=V_BLANK) ? V_Cont-V_BLANK : 11'h0 ;// Horizontal Generator: Refer to the pixel clockalways@(posedge iCLK or negedge iRST_N)beginif(!iRST_N)beginH_Cont<= 0;oVGA_HS<= 1;endelsebeginif(H_Cont
顶层模块
顶层模块例化所有模块进行连线,和上面的RTL图一致
【基于FPGA的串口传图SRAM缓存VGA显示】module uart_sram_vga(inputclk,inputrst_n,// uart sideinputrx,// sram sideoutput[17:0]SRAM_ADDR,inout[15:0]SRAM_DQ,outputSRAM_WE_N,outputSRAM_OE_N,outputSRAM_UB_N,outputSRAM_LB_N,outputSRAM_CE_N,// vga sideoutputVGA_HS,outputVGA_VS,output[9:0]VGA_R,output[9:0]VGA_G,output[9:0]VGA_B,outputVGA_CLK,outputVGA_BLANK,outputVGA_SYNC);// 用不上assign {VGA_R[1:0], VGA_G[1:0], VGA_B[1:0]} = 0;// pll输出25M时钟给vga_ctrlwireclk_25;// uart接收到的数据和有效位wirevalid;wire[7:0]data;// wr_addr:数据的写入地址,uart接收完数据后拉高receive_donewire[18:0]wr_addr;wirereceive_done;// vga_ctrl输出的坐标、地址、请求、rgbwire[9:0]x;wire[9:0]y;wire[21:0]address;wireoRequest;wire[7:0]R,G,B;// 从sram中读取的数据wire[7:0]rd_data;vga_pll inst_vga_pll (.inclk0 (clk),.c0(clk_25));uart_rx inst_uart_rx (.clk(clk),.rst_n (rst_n),.rx(rx),.valid (valid),.data(data));uart_rx_addr inst_uart_rx_addr (.clk(clk), .rst_n(rst_n), .valid(valid), .receive_done (receive_done),.addr(wr_addr));sram_ctrl inst_sram_ctrl (.clk(clk),.rst_n(rst_n),.wr_req(valid),.wr_addr(wr_addr),.wr_data(data),.rd_req(receive_done & oRequest),.rd_addr(address),.rd_data(rd_data),.SRAM_ADDR (SRAM_ADDR),.SRAM_DQ(SRAM_DQ),.SRAM_WE_N (SRAM_WE_N),.SRAM_OE_N (SRAM_OE_N),.SRAM_UB_N (SRAM_UB_N),.SRAM_LB_N (SRAM_LB_N),.SRAM_CE_N (SRAM_CE_N));VGA_Ctrl inst_VGA_Ctrl (.iRed(rd_data),.iGreen(rd_data),.iBlue(rd_data),.oCurrent_X (x),.oCurrent_Y (y),.oAddress(address),.oRequest(oRequest),.oVGA_R(VGA_R[9:2]),.oVGA_G(VGA_G[9:2]),.oVGA_B(VGA_B[9:2]),.oVGA_HS(VGA_HS),.oVGA_VS(VGA_VS),.oVGA_SYNC(VGA_SYNC),.oVGA_BLANK (VGA_BLANK),.oVGA_CLOCK (VGA_CLK),.iCLK(clk_25),.iRST_N(rst_n));endmodule