赞
踩
参考文章:https://www.cnblogs.com/fbur/p/16518333.html
源码下载:GitHub - Redamancy785/FPGA-Learning-Record: 项目博客:https://blog.csdn.net/weixin_51460407
本案例通过串口调试上位机将一张256×256照片的十六进制文本发送至开发板串口,接着开发板通过串口将数据存储入RAM中,最后从RAM读取数据并显示在屏幕上。
开发板:小梅哥ACZ7015开发板+拓展板+800×640RGB-TFT屏幕
串口调试上位机:友善调试助手
图片生成十六进制文本工具:Img2Lcd
链接:https://pan.baidu.com/s/147E_xyWExGrXG_0qOAeLsQ?pwd=ydgb
局部放大
uart_receive模块负责遵守urat协议接收上位机发送的数据并传送给uart_to_ram模块,uart_to_ram模块将接收的八位并行数据打包为十六位并行数据并传送给rom_image模块,rom_image模块负责存储接收的数据。以上是数据写入逻辑。
disp_driver模块实时输出屏幕将要显示的坐标以向image_extract模块索要该坐标的的图像数据,从而在接收到数据之后驱动屏幕。所以,image_extract模块是一个“控制什么位置输出什么数据”的模块,当判断到该坐标需要使用RAM中的数据时,会向rom_image模块索要数据。以上是数据读出逻辑。
- module rom_image_tft_hdmi(
- clk50M,
- reset_n,
- uart_tx,
- TFT_rgb,
- TFT_hs,
- TFT_vs,
- TFT_clk,
- TFT_de,
- TFT_pwm,
-
- //HDMI
- SiI9022_sclk,
- SiI9022_sdat,
- led
- );
-
- input clk50M; //系统时钟输入,50M
- input reset_n; //复位信号输入,低有效
- input uart_tx ; //串口接受接口
- output [15:0] TFT_rgb; //TFT数据输出
- output TFT_hs; //TFT行同步信号
- output TFT_vs; //TFT场同步信号
- output TFT_clk; //TFT像素时钟
- output TFT_de; //TFT数据使能
- output TFT_pwm; //TFT背光控制
-
- inout SiI9022_sdat;
- output SiI9022_sclk;
- output led;
-
- /参数/
- //设置待显示图片尺寸,和存储图片ROM的地址位宽,显示背景颜色
- parameter DISP_IMAGE_W = 256;
- parameter DISP_IMAGE_H = 256;
- parameter ROM_ADDR_WIDTH = 16;
- parameter DISP_BACK_COLOR = 16'hFFFF; //白色
-
- //设置屏幕尺寸
- parameter TFT_WIDTH = 800;
- parameter TFT_HEIGHT = 480;
-
- //图片显示在屏幕中间位置
- parameter DISP_HBEGIN = (TFT_WIDTH - DISP_IMAGE_W)/2;
- parameter DISP_VBEGIN = (TFT_HEIGHT - DISP_IMAGE_H)/2;
-
- /网表型/
- 寄存器型/
- 时序逻辑/
-
- //pll模块
- wire pll_locked;
- wire loc_clk33M;
- pll pll(
- .clk_out1(loc_clk33M ), // output clk_out1
- .resetn (reset_n ), // input reset,active low
- .locked (pll_locked ), // output locked
- .clk_in1 (clk50M ) // input clk_in1
- );
- //uart接收模块
- wire [7:0]parallel_data ;//串口接收模块接收的并行数据8位
- wire rx_done ;//串口接收模块接收8位数据结束信号
-
- uart_receive_1 uart_receive(//串口接收模块
- .clk(clk50M) ,
- .reset(reset_n) ,
- .baud_rate(5) ,
- .uart_tx(uart_tx),
- .data(parallel_data) ,
- .rx_done(rx_done)
- );
-
- //uart_to_ram模块
- wire [15:0]addr_write ;//串口接收模块接收的并行数据8位
- wire [15:0]data_write ;//串口接收模块接收8位数据结束信号
- wire write_enable ;//写入使能信号
-
- uart_to_ram uart_to_ram(//将uart串口接收模块输出的数据写入ram中
- .clk(clk50M) ,
- .reset(reset_n) ,
- .data(parallel_data),
- .rx_done(rx_done),
- .addr(addr_write) ,
- .dout(data_write) ,
- .wenable(write_enable )
- );
-
- //rom_image模块
- wire [ROM_ADDR_WIDTH-1:0] rom_addra;
- wire [15:0] rom_data;
-
- rom_image rom_image (
- .clka(clk50M), // input wire clka
- .ena(1), // input wire ena
- .wea(write_enable), // input wire [0 : 0] wea
- .addra(addr_write), // input wire [15 : 0] addra
- .dina(data_write), // input wire [15 : 0] dina
- .clkb(loc_clk33M), // input wire clkb
- .addrb(rom_addra), // input wire [15 : 0] addrb
- .doutb(rom_data) // output wire [15 : 0] doutb
- );
- //image_extract模块
- wire [15:0] disp_data;
- wire disp_data_req;
- wire [11:0] visible_hcount;
- wire [11:0] visible_vcount;
- wire Frame_Begin;
- image_extract#(
- .H_Visible_area (TFT_WIDTH ), //屏幕显示区域宽度
- .V_Visible_area (TFT_HEIGHT ), //屏幕显示区域高度
- .IMG_WIDTH (DISP_IMAGE_W ), //图片宽度
- .IMG_HEIGHT (DISP_IMAGE_W ), //图片高度
- .IMG_DATA_WIDTH (16 ), //图片像素点位宽
- .ROM_ADDR_WIDTH (ROM_ADDR_WIDTH ) //存储图片ROM的地址位宽
- )
- image_extract(
- .clk_ctrl (loc_clk33M ),
- .reset_n (pll_locked ),
- .img_disp_hbegin(DISP_HBEGIN ),
- .img_disp_vbegin(DISP_VBEGIN ),
- .disp_back_color(DISP_BACK_COLOR),
- .rom_addra (rom_addra ),
- .rom_data (rom_data ),
- .Frame_Begin (Frame_Begin ),
- .disp_data_req (disp_data_req ),
- .visible_hcount (visible_hcount ),
- .visible_vcount (visible_vcount ),
- .disp_data (disp_data )
- );
-
- //disp_driver模块
- wire tft_reset_p;
- wire [4:0]Disp_Red;
- wire [5:0]Disp_Green;
- wire [4:0]Disp_Blue;
- wire [15:0]TFT_rgb;
-
- disp_driver disp_driver(
- .ClkDisp(loc_clk33M),
- .Rst_p(tft_reset_p),
- .Data(disp_data),
- .DataReq(disp_data_req),
- .H_Addr(visible_hcount),
- .V_Addr(visible_vcount),
- .Disp_HS(TFT_hs),
- .Disp_VS(TFT_vs),
- .Disp_Red(Disp_Red),
- .Disp_Green(Disp_Green),
- .Disp_Blue(Disp_Blue),
- .Frame_Begin(Frame_Begin),
- .Disp_DE(TFT_de),
- .Disp_PCLK(TFT_clk)
- );
-
-
- /组合逻辑/
- assign tft_reset_p = ~pll_locked; //锁相环提供的TFT屏复位信号进行取反,满足高电平复位
- assign TFT_rgb={Disp_Red,Disp_Green,Disp_Blue};
- assign TFT_pwm=1'b1;
-
-
- /*
- //HDMI模块
- reg [20:0]cnt;
- reg Go;
-
- always@(posedge clk50M or negedge reset_n)
- if(!reset_n)
- cnt <= 0;
- else if(cnt <= 499999)
- cnt <= cnt + 1 ;
- else
- cnt <= 500001;
-
- always@(posedge clk50M or negedge reset_n)
- if(!reset_n)
- Go <= 0;
- else if(cnt == 499999)
- Go <= 1'b1;
- else
- Go <= 0;
-
- SiI9022_Init SiI9022_Init(
- .Clk(clk50M),
- .Rst_n(reset_n),
-
- .Go(Go),
- .device_id(8'h72),
- .Init_Done(led),
-
- .i2c_sclk(SiI9022_sclk),
- .i2c_sdat(SiI9022_sdat)
- );
- */
-
- endmodule

- module uart_receive_1(
- clk ,
- reset ,
- baud_rate ,
- uart_tx,
- data ,
- rx_done
- );
- input clk ;
- input reset ;
- input [2:0]baud_rate ;
- input uart_tx ;
- output reg [7:0]data ;
- output reg rx_done ;
-
- reg rx_done_sig ;
- reg [2:0]r_data[7:0] ;//接收每一位数据
- reg [2:0]sta_bit ;
- reg [2:0]sto_bit ;
- reg [17:0]bit_tim ;//每一位持续的时间(计数)
-
- always@(baud_rate) //在这里一个 码元由一位组成,所以波特率=比特率
- begin
- case(baud_rate) //常见的串口传输波特率
- 3'd0 : bit_tim = 1000000000/300/20 ; //波特率为300
- 3'd1 : bit_tim = 1000000000/1200/20 ; //波特率为1200
- 3'd2 : bit_tim = 1000000000/2400/20 ; //波特率为2400
- 3'd3 : bit_tim = 1000000000/9600/20 ; //波特率为9600
- 3'd4 : bit_tim = 1000000000/19200/20 ; //波特率为19200
- 3'd5 : bit_tim = 1000000000/115200/20 ; //波特率为115200
- default bit_tim = 1000000000/9600/20 ; //多余的寄存器位置放什么:默认速率
- endcase
- end
-
- wire [17:0]bit_tim_16 ;//每1/16位的持续时间(计数)
- assign bit_tim_16 = bit_tim / 16;
-
- wire [8:0]bit16_mid ; //在中心点产生采样脉冲
- assign bit16_mid = bit_tim_16 / 2 ;
-
- //边沿检测
- reg [1:0]edge_detect ;
- always @( posedge clk or negedge reset )
- begin
- if (!reset )
- edge_detect <= 2'd0 ;
- else
- begin
- edge_detect[0] <= uart_tx ;
- edge_detect[1] <= edge_detect[0] ;
- end
- end
- wire byte_sta_neg ;
- assign byte_sta_neg = ( edge_detect == 2'b10 ) ? 1 : 0 ;//输入的数据开始出现下降沿,说明出现了起始位(一直运行?)
-
- reg receive_en ;//接收使能端
- reg [17:0]div_cnt ;//每1/16bit内的计数
- reg [7:0]bit16_cnt ;//计数到了第几个状态(10位,每位分成16份,总共160个状态)
- always @( posedge clk or negedge reset )
- begin
- if (!reset )
- receive_en <= 1'd0 ;
- else if ( byte_sta_neg ) //检测到下降沿,使能段有效(只要有下降沿就使能?)
- receive_en <= 1'd1 ;
- else if ( (rx_done) || (sta_bit >= 3'd4 ))
- receive_en <= 1'd0 ; //检测到结束信号,使能端无效
- else if ( ( bit16_cnt == 8'd159 ) && (div_cnt == bit_tim_16 - 1'd1 ) )//跑完159后re_en置零
- receive_en <= 1'd0 ;
- end
-
-
- always@( posedge clk or negedge reset )
- begin
- if ( ! reset )
- div_cnt <= 18'd0 ;
- else if (receive_en)
- begin
- if ( div_cnt == bit_tim_16 - 1'd1 )//计数,每1/16bit清零
- div_cnt <= 18'd0 ;
- else
- div_cnt <= div_cnt + 1'b1 ;
- end
- else
- div_cnt <= 18'd0 ;
- end
-
- reg bit16_pulse ;//产生采样脉冲
- always@( posedge clk or negedge reset )
- begin
- if ( ! reset )
- bit16_pulse <= 18'd0 ;
- else if (receive_en)
- if ( div_cnt == bit16_mid )
- bit16_pulse <= 1'd1 ;
- else
- bit16_pulse <= 1'd0 ;
- else
- bit16_pulse <= 1'd0 ;
- end
-
- always@( posedge clk or negedge reset )
- begin
- if ( ! reset )
- bit16_cnt <= 8'd0 ;
- else if (receive_en)
- begin
- if (( bit16_cnt == 8'd159 ) && (div_cnt == bit_tim_16 - 1'd1 ))
- bit16_cnt <= 8'd0 ;
- else if ( div_cnt == bit_tim_16 - 1'd1 )
- bit16_cnt <= bit16_cnt + 1'b1 ;
- end
- end
-
- always@(posedge clk or negedge reset)
- begin
- if(!reset)
- begin
- sta_bit <= 3'd0 ;
- r_data[0] <= 3'd0 ;
- r_data[1] <= 3'd0 ;
- r_data[2] <= 3'd0 ;
- r_data[3] <= 3'd0 ;
- r_data[4] <= 3'd0 ;
- r_data[5] <= 3'd0 ;
- r_data[6] <= 3'd0 ;
- r_data[7] <= 3'd0 ;
- sto_bit <= 3'd0 ;
- end
- else if (bit16_pulse)//舍弃前5后4取中7
- case(bit16_cnt)
- 0:
- begin
- sta_bit <= 3'd0 ;
- r_data[0] <= 3'd0 ;
- r_data[1] <= 3'd0 ;
- r_data[2] <= 3'd0 ;
- r_data[3] <= 3'd0 ;
- r_data[4] <= 3'd0 ;
- r_data[5] <= 3'd0 ;
- r_data[6] <= 3'd0 ;
- r_data[7] <= 3'd0 ;
- sto_bit <= 3'd0 ;
- end
- 5,6,7,8,9,10,11 : sta_bit <= sta_bit + uart_tx ;
- 21,22,23,24,25,26,27 : r_data[0] <= r_data[0] + uart_tx ;
- 37,38,39,41,42,43,44 : r_data[1] <= r_data[1] + uart_tx ;
- 53,54,55,56,57,58,59 : r_data[2] <= r_data[2] + uart_tx ;
- 69,70,71,72,73,74,75 : r_data[3] <= r_data[3] + uart_tx ;
- 85,86,87,88,89,90,91 : r_data[4] <= r_data[4] + uart_tx ;
- 101,102,103,104,105,106,107 : r_data[5] <= r_data[5] + uart_tx ;
- 117,118,119,120,121,122,123 : r_data[6] <= r_data[6] + uart_tx ;
- 133,134,135,136,137,138,139 : r_data[7] <= r_data[7] + uart_tx ;
- 149,150,151,152,153,154,155 : sto_bit <= sto_bit + uart_tx ;
- default ;
- endcase
- end
-
- always@( posedge clk or negedge reset )
- begin
- if ( ! reset )
- rx_done_sig <= 8'd0 ;
- else if ( ( bit16_cnt == 8'd159 ) && (div_cnt == bit_tim_16 - 2'd2 ) )//跑完159后产生一个rx_done信号
- rx_done_sig <= 8'd1 ;
- else if (rx_done_sig <= 8'd1 )
- rx_done_sig <= 8'd0 ;
- end
-
- always@( posedge clk or negedge reset )//接收完数据发出rx_done
- if(!reset )
- rx_done <= 0 ;
- else if (rx_done_sig)
- rx_done <= 1 ;
- else if (rx_done )
- rx_done <= 0 ;
-
-
- always@( posedge clk or negedge reset )//接收完数据发出rx_done后,把数据从r_data传递给data
- begin
- if ( ! reset )
- data <= 8'd0 ;
- else if ( rx_done_sig )
- begin
- data[0] = ( r_data[0] >3 ) ? 1 : 0 ;
- data[1] = ( r_data[1] >3 ) ? 1 : 0 ;
- data[2] = ( r_data[2] >3 ) ? 1 : 0 ;
- data[3] = ( r_data[3] >3 ) ? 1 : 0 ;
- data[4] = ( r_data[4] >3 ) ? 1 : 0 ;
- data[5] = ( r_data[5] >3 ) ? 1 : 0 ;
- data[6] = ( r_data[6] >3 ) ? 1 : 0 ;
- data[7] = ( r_data[7] >3 ) ? 1 : 0 ;
- end
- // else if ( receive_en )
- // data <= 8'd0 ;
- end
-
- endmodule

- module uart_to_ram(
- clk ,
- reset ,
- data,
- rx_done,
- addr ,
- dout ,
- wenable
- );
-
- input clk ;
- input reset ;
- input [7:0]data;
- input rx_done;
- output reg [15:0]addr ;
- output reg [15:0]dout ;
- output reg wenable ;
-
- //ram的容量为256*256个像素,每个像素位宽16,共需256*256*2个8位的数据(131072)
- //用计数器来计数
- reg [16:0]pixel_cnt ;//131072
- always@(posedge clk or negedge reset)
- if(!reset)
- pixel_cnt <= 17'd0 ;
- else if ( ( pixel_cnt < 131071 ) && ( rx_done ) )
- pixel_cnt <= pixel_cnt + 1 ;
- else if (( pixel_cnt >= 131071 ) && ( rx_done ))
- pixel_cnt <= 17'd0 ;
-
- //需要一个寄存器,存两个8位,共16位
- reg [15:0]data_register ;
- always@(posedge clk or negedge reset)
- if(!reset)
- data_register <= 16'd0 ;
- else if ( rx_done )
- data_register <= { data_register[7:0] , data } ;
-
- //添加一个变化条件信号
- reg change_sig ;
- always@(posedge clk or negedge reset)
- if(!reset)
- change_sig <= 1'd0 ;
- else if ( rx_done && ( pixel_cnt[0] == 1 ) )
- change_sig <= 1'd1 ;
- else if ( change_sig == 1'd1 )
- change_sig <= 1'd0 ;
-
- //把每16位数据存进ram中,即输出16位数据
- always@(posedge clk or negedge reset)
- if(!reset)
- dout <= 16'd0 ;
- else if ( change_sig )
- dout <= data_register ;
-
- //产生一个写入ram的使能信号
- always@(posedge clk or negedge reset)
- if(!reset)
- wenable <= 0 ;
- else if ( change_sig )
- wenable <= 1 ;
- else if (wenable == 1)
- wenable <= 0 ;
-
- //产生写入ram的地址 //比weanbel和data提前变化,不然不满足下面除于2的条件,第0个地址将没有数据
- always@(posedge clk or negedge reset)
- if(!reset)
- addr <= 16'd0 ;
- else if ( rx_done && ( pixel_cnt[0] == 1 ) )
- addr <= pixel_cnt[16:1] ; //除于2 即舍弃最后一位(右移一位)
-
- endmodule

- module image_extract
- #(
- parameter H_Visible_area = 800, //整个屏幕显示区域宽度
- parameter V_Visible_area = 480, //整个屏幕显示区域高度
- parameter IMG_WIDTH = 160, //图片宽度
- parameter IMG_HEIGHT = 120, //图片高度
- parameter IMG_DATA_WIDTH = 16, //图片像素点位宽
- parameter ROM_ADDR_WIDTH = 16 //存储图片ROM的地址位宽
- )
- (
- clk_ctrl,
- reset_n,
- img_disp_hbegin,
- img_disp_vbegin,
- disp_back_color,
- Frame_Begin,
- rom_addra,
- rom_data,
- disp_data_req,
- visible_hcount,
- visible_vcount,
- disp_data
- );
-
- input clk_ctrl ; //时钟输入,与TFT屏时钟保持一致
- input reset_n ; //复位信号,低电平有效
-
- input [15:0] img_disp_hbegin; //待显示图片左上角第一个像素点在TFT屏的行向坐标
- input [15:0] img_disp_vbegin; //待显示图片左上角第一个像素点在TFT屏的场向坐标
- input [IMG_DATA_WIDTH-1:0] disp_back_color; //显示的背景颜色
-
- output [ROM_ADDR_WIDTH-1:0] rom_addra ; //读图片数据ROM地址
- input [IMG_DATA_WIDTH-1:0] rom_data ; //读图片数据ROM数据
-
- input Frame_Begin ; //一帧图像起始标识信号,clk_ctrl时钟域
- input disp_data_req ; //
- input [11:0] visible_hcount ; //TFT可见区域行扫描计数器
- input [11:0] visible_vcount ; //TFT可见区域场扫描计数器
- output [IMG_DATA_WIDTH-1:0] disp_data ; //待显示图片数据
-
- reg [ROM_ADDR_WIDTH-1:0] rom_addra ; //读图片数据rom地址
-
- wire h_exceed;
- wire v_exceed;
- wire img_h_disp;
- wire img_v_disp;
- wire img_disp;
- wire [15:0]hcount_max;
-
- //判断设置的显示的起始位置是否会导致显示超出范围
- assign h_exceed = img_disp_hbegin + IMG_WIDTH > H_Visible_area - 1'b1;
- assign v_exceed = img_disp_vbegin + IMG_HEIGHT > V_Visible_area - 1'b1;
- //不同的设置情况,显示区域做不同的处理
- assign img_h_disp = h_exceed ? (visible_hcount >= img_disp_hbegin && visible_hcount < H_Visible_area):
- (visible_hcount >= img_disp_hbegin && visible_hcount < img_disp_hbegin + IMG_WIDTH);
-
- assign img_v_disp = v_exceed ? (visible_vcount >= img_disp_vbegin && visible_vcount < V_Visible_area):
- (visible_vcount >= img_disp_vbegin && visible_vcount < img_disp_vbegin + IMG_HEIGHT);
-
- assign img_disp = disp_data_req && img_h_disp && img_v_disp;
-
- assign hcount_max = h_exceed ? (H_Visible_area - 1'b1):(img_disp_hbegin + IMG_WIDTH - 1'b1);
-
- always@(posedge clk_ctrl or negedge reset_n)
- begin
- if(!reset_n)
- rom_addra <= 'd0;
- else if(Frame_Begin)
- rom_addra <= 'd0;
- else if(img_disp)
- begin
- if(visible_hcount == hcount_max)
- rom_addra <= rom_addra + (img_disp_hbegin + IMG_WIDTH - hcount_max);
- else
- rom_addra <= rom_addra + 1'b1;
- end
- else
- rom_addra <= rom_addra;
- end
- assign disp_data = img_disp ? rom_data : disp_back_color;
- endmodule

- `include "disp_parameter_cfg.v"
-
- module disp_driver(
- ClkDisp,
- Rst_p,
-
- Data,
- DataReq,
-
- H_Addr,
- V_Addr,
-
- Disp_HS,
- Disp_VS,
- Disp_Red,
- Disp_Green,
- Disp_Blue,
- Frame_Begin,
- Disp_DE,
- Disp_PCLK
- );
-
- input ClkDisp;
- input Rst_p;
- input [`Red_Bits + `Green_Bits + `Blue_Bits - 1:0] Data;
- output DataReq;
-
- output [11:0] H_Addr;
- output [11:0] V_Addr;
-
- output reg Disp_HS;
- output reg Disp_VS;
-
- output reg [`Red_Bits - 1 :0]Disp_Red;
- output reg [`Green_Bits - 1 :0]Disp_Green;
- output reg [`Blue_Bits - 1 :0]Disp_Blue;
-
- output reg Frame_Begin; //一帧图像起始标识信号,ClkDisp时钟域
- output reg Disp_DE;
- output Disp_PCLK;
-
- wire hcount_ov;
- wire vcount_ov;
-
- //----------------内部寄存器定义----------------
- reg [11:0] hcount_r; //行扫描计数器
- reg [11:0] vcount_r; //场扫描计数器
-
- `ifdef HW_VGA
- assign Disp_PCLK = ~ClkDisp;
- `else
- assign Disp_PCLK = ClkDisp;
- `endif
-
- assign DataReq = Disp_DE;
-
- parameter hdat_begin = `H_Sync_Time + `H_Back_Porch + `H_Left_Border - 1'b1;
- parameter hdat_end = `H_Total_Time - `H_Right_Border - `H_Front_Porch - 1'b1;
-
- parameter vdat_begin = `V_Sync_Time + `V_Back_Porch + `V_Top_Border - 1'b1;
- parameter vdat_end = `V_Total_Time - `V_Bottom_Border - `V_Front_Porch - 1'b1;
-
- assign H_Addr = Disp_DE?(hcount_r - hdat_begin):12'd0;
- assign V_Addr = Disp_DE?(vcount_r - vdat_begin):12'd0;
-
- //行扫描
- assign hcount_ov = (hcount_r >= `H_Total_Time - 1);
-
- always@(posedge ClkDisp or posedge Rst_p)
- if(Rst_p)
- hcount_r <= 0;
- else if(hcount_ov)
- hcount_r <= 0;
- else
- hcount_r <= hcount_r + 1'b1;
- //场扫描
- assign vcount_ov = (vcount_r >= `V_Total_Time - 1);
- always@(posedge ClkDisp or posedge Rst_p)
- if(Rst_p)
- vcount_r <= 0;
- else if(hcount_ov) begin
- if(vcount_ov)
- vcount_r <= 0;
- else
- vcount_r <= vcount_r + 1'd1;
- end
- else
- vcount_r <= vcount_r;
-
- always@(posedge ClkDisp)
- Disp_DE <= ((hcount_r >= hdat_begin)&&(hcount_r < hdat_end))&&
- ((vcount_r >= vdat_begin)&&(vcount_r < vdat_end));
-
- always@(posedge ClkDisp) begin
- Disp_HS <= (hcount_r > `H_Sync_Time - 1);
- Disp_VS <= (vcount_r > `V_Sync_Time - 1);
- {Disp_Red,Disp_Green,Disp_Blue} <= (Disp_DE)?Data:1'd0;
- end
- /*******************************************/
- reg Disp_VS_dly1;
- always@(posedge ClkDisp)
- begin
- Disp_VS_dly1 <= Disp_VS;
- end
- always@(posedge ClkDisp or posedge Rst_p)
- begin
- if(Rst_p)
- Frame_Begin <= 1'b0;
- else if(!Disp_VS_dly1 && Disp_VS)
- Frame_Begin <= 1'b1;
- else
- Frame_Begin <= 1'b0;
- end
- /*******************************************/
-
- endmodule

- /*使用说明
- 使用时根据实际工作需求选择2个预定义参数就可以
-
- 参数1: MODE_RGBxxx
- 预定义用来决定驱动工作在16位模式还是24位模式,二选一
- MODE_RGB888:24位模式
- MODE_RGB565:16位模式
- 针对小梅哥提供的一系列显示设备,各个设备该参数的选择
- 4.3寸TFT显示屏------使用16位色RGB565模式
- 5寸TFT显示屏--------使用16位色RGB565模式
- GM7123模块----------使用24位色RGB888模式
-
- 参数2: Resolution_xxxx
- 预定义用来决定显示设备分辨率,常见设备分辨率如下所述
-
- 4.3寸TFT显示屏:
- Resolution_480x272
-
- 5寸TFT显示屏:
- Resolution_800x480
-
- VGA常见分辨率:
- Resolution_640x480
- Resolution_800x600
- Resolution_1024x600
- Resolution_1024x768
- Resolution_1280x720
- Resolution_1920x1080
- */
-
- //也可通过宏定义显示设备类型来进行设置,选择一个使能,其他使用注释的方式屏蔽
- //使用4.3寸480*272分辨率显示屏
- //`define HW_TFT43
-
- //使用5寸800*480分辨率显示屏
- `define HW_TFT50
-
- //使用VGA显示器,默认为640*480分辨率,24位模式,其他分辨率或需16位模式可在代码63行至75行进行重配置
- //`define HW_VGA
-
- //=====================================
- //以下宏定义选择用于根据显示设备进行位模式和分辨率2个参数的设置
- //=====================================
- `ifdef HW_TFT43 //使用4.3寸480*272分辨率显示屏
- `define MODE_RGB565
- `define Resolution_480x272 1 //时钟为9MHz
-
- `elsif HW_TFT50 //使用5寸800*480分辨率显示屏
- `define MODE_RGB565
- `define Resolution_800x480 1 //时钟为33MHz
-
- `elsif HW_VGA //使用VGA显示器,默认为640*480分辨率,24位模式
- //=====================================
- //可选择其他分辨率和16位模式,需用户根据实际需求设置
- //代码下方三行和四行设置位模式
- //代码下方五行以后连续宏定义部分设置分辨率
- //=====================================
- `define MODE_RGB565
- // `define MODE_RGB888
- `define Resolution_640x480 1 //时钟为25.175MHz
- //`define Resolution_800x600 1 //时钟为40MHz
- //`define Resolution_1024x600 1 //时钟为51MHz
- //`define Resolution_1024x768 1 //时钟为65MHz
- //`define Resolution_1280x720 1 //时钟为74.25MHz
- //`define Resolution_1920x1080 1 //时钟为148.5MHz
- `endif
-
- //=====================================
- //非特殊需求,以下内容用户不需修改
- //=====================================
- //定义不同的颜色深度
- `ifdef MODE_RGB888
- `define Red_Bits 8
- `define Green_Bits 8
- `define Blue_Bits 8
-
- `elsif MODE_RGB565
- `define Red_Bits 5
- `define Green_Bits 6
- `define Blue_Bits 5
- `endif
-
- //定义不同分辨率的时序参数
- `ifdef Resolution_480x272
- `define H_Total_Time 12'd525
- `define H_Right_Border 12'd0
- `define H_Front_Porch 12'd2
- `define H_Sync_Time 12'd41
- `define H_Back_Porch 12'd2
- `define H_Left_Border 12'd0
-
- `define V_Total_Time 12'd286
- `define V_Bottom_Border 12'd0
- `define V_Front_Porch 12'd2
- `define V_Sync_Time 12'd10
- `define V_Back_Porch 12'd2
- `define V_Top_Border 12'd0
-
- `elsif Resolution_640x480
- `define H_Total_Time 12'd800
- `define H_Right_Border 12'd8
- `define H_Front_Porch 12'd8
- `define H_Sync_Time 12'd96
- `define H_Back_Porch 12'd40
- `define H_Left_Border 12'd8
-
- `define V_Total_Time 12'd525
- `define V_Bottom_Border 12'd8
- `define V_Front_Porch 12'd2
- `define V_Sync_Time 12'd2
- `define V_Back_Porch 12'd25
- `define V_Top_Border 12'd8
-
- `elsif Resolution_800x480
- `define H_Total_Time 12'd1056
- `define H_Right_Border 12'd0
- `define H_Front_Porch 12'd40
- `define H_Sync_Time 12'd128
- `define H_Back_Porch 12'd88
- `define H_Left_Border 12'd0
-
- `define V_Total_Time 12'd525
- `define V_Bottom_Border 12'd8
- `define V_Front_Porch 12'd2
- `define V_Sync_Time 12'd2
- `define V_Back_Porch 12'd25
- `define V_Top_Border 12'd8
-
- `elsif Resolution_800x600
- `define H_Total_Time 12'd1056
- `define H_Right_Border 12'd0
- `define H_Front_Porch 12'd40
- `define H_Sync_Time 12'd128
- `define H_Back_Porch 12'd88
- `define H_Left_Border 12'd0
-
- `define V_Total_Time 12'd628
- `define V_Bottom_Border 12'd0
- `define V_Front_Porch 12'd1
- `define V_Sync_Time 12'd4
- `define V_Back_Porch 12'd23
- `define V_Top_Border 12'd0
-
- `elsif Resolution_1024x600
- `define H_Total_Time 12'd1344
- `define H_Right_Border 12'd0
- `define H_Front_Porch 12'd24
- `define H_Sync_Time 12'd136
- `define H_Back_Porch 12'd160
- `define H_Left_Border 12'd0
-
- `define V_Total_Time 12'd628
- `define V_Bottom_Border 12'd0
- `define V_Front_Porch 12'd1
- `define V_Sync_Time 12'd4
- `define V_Back_Porch 12'd23
- `define V_Top_Border 12'd0
-
- `elsif Resolution_1024x768
- `define H_Total_Time 12'd1344
- `define H_Right_Border 12'd0
- `define H_Front_Porch 12'd24
- `define H_Sync_Time 12'd136
- `define H_Back_Porch 12'd160
- `define H_Left_Border 12'd0
-
- `define V_Total_Time 12'd806
- `define V_Bottom_Border 12'd0
- `define V_Front_Porch 12'd3
- `define V_Sync_Time 12'd6
- `define V_Back_Porch 12'd29
- `define V_Top_Border 12'd0
-
- `elsif Resolution_1280x720
- `define H_Total_Time 12'd1650
- `define H_Right_Border 12'd0
- `define H_Front_Porch 12'd110
- `define H_Sync_Time 12'd40
- `define H_Back_Porch 12'd220
- `define H_Left_Border 12'd0
-
- `define V_Total_Time 12'd750
- `define V_Bottom_Border 12'd0
- `define V_Front_Porch 12'd5
- `define V_Sync_Time 12'd5
- `define V_Back_Porch 12'd20
- `define V_Top_Border 12'd0
-
- `elsif Resolution_1920x1080
- `define H_Total_Time 12'd2200
- `define H_Right_Border 12'd0
- `define H_Front_Porch 12'd88
- `define H_Sync_Time 12'd44
- `define H_Back_Porch 12'd148
- `define H_Left_Border 12'd0
-
- `define V_Total_Time 12'd1125
- `define V_Bottom_Border 12'd0
- `define V_Front_Porch 12'd4
- `define V_Sync_Time 12'd5
- `define V_Back_Porch 12'd36
- `define V_Top_Border 12'd0
-
- `endif

打开网盘中111.c,全选复制输入串口助手
点击发送
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。