- 实现目标:上位机通过串口发送图片到FPGA中,FPGA接收图片并保存在DDR2中,保存在 DDR2中的图片分为两路,一路经过VGA时序输出到RGB触摸屏上,另一路按照以太网帧格式进 行编码, 将以太网帧发送到PC端后,可用上位机软件实时显示视频图像。
- 主要工作:1.FPGA串口图像接收。2.DDR2读写。3.千兆以太网发送。4.VGA视频图像显示。
- 使用工具:Quartus ii、Modelsim、Wireshark、小梅哥UDP摄像头、串口传图工具。
二、串口数据转换(将串口单字节数据拼接成图像原来的16位RGB565格式)
转换简易波形图如下:
module uart2ddr2(
clk50M,
rst_n,
data8bit,
data8bit_en,
wr1_data,
wr1,
ctrl_state,
rx_img_done
);
input clk50M;
input rst_n;
input [7:0]data8bit;
input data8bit_en;
output reg wr1;
output [15:0]wr1_data;
output reg rx_img_done;
output reg ctrl_state;
localparam h_pixel = 800,
v_pixel = 480;
parameter tft_data_cnt_max = h_pixel*v_pixel;
parameter rx_data_cnt_max = tft_data_cnt_max*2;
reg [19:0]data_cnt;
always@(posedge clk50M or negedge rst_n)
begin
if(!rst_n)
data_cnt <= 20'd0;
else if(rx_img_done)
data_cnt <= 20'd0;
else if(data8bit_en)
data_cnt <= data_cnt + 20'd1;
else
data_cnt <= data_cnt;
end
reg [7:0]r1_data8bit;
always@(posedge clk50M or negedge rst_n)
begin
if(!rst_n)
r1_data8bit <= 8'd0;
else
r1_data8bit <= data8bit;
end
reg r1_data8bit_en;
always@(posedge clk50M or negedge rst_n)
begin
if(!rst_n)
r1_data8bit_en <= 1'b0;
else
r1_data8bit_en <= data8bit_en;
end
reg [15:0] data16bit;
always@(posedge clk50M or negedge rst_n)
begin
if(!rst_n)
data16bit <= 16'd0;
else if(r1_data8bit_en && data_cnt[0]==0)
data16bit <= {r1_data8bit,data8bit};
else
data16bit <= data16bit;
end
assign wr1_data = data16bit;
always@(posedge clk50M or negedge rst_n)
begin
if(!rst_n)
wr1 <= 1'b0;
else if(r1_data8bit_en && data_cnt[0]==0)
wr1 <= 1'b1;
else
wr1 <= 1'b0;
end
always@(posedge clk50M or negedge rst_n)
begin
if(!rst_n)
rx_img_done <= 1'b0;
else if(r1_data8bit_en && data_cnt == rx_data_cnt_max)
rx_img_done <= 1'b1;
else
rx_img_done <= 1'b0;
end
always@(posedge clk50M or negedge rst_n)
begin
if(!rst_n)
ctrl_state <= 1'b1;
else if(rx_img_done)
ctrl_state <= 1'b0;
else
ctrl_state <= ctrl_state;
end
endmodule ```