趁着假期,把Lwip做了一个初步的了解。主要的学习资源都来自于Xilinx的官方例子,还有FPGADesigner同学的blog。
年纪大了,一边带孩子一边学习,效率实在低。还有很多地方搞不明白,只有在以后的日子里慢慢补。
一、设计
PL端产生数据,发送到双口RAM,写完数据后给一个done信号到gpio,gpio接收信号,产生中断,PS端将RAM里的数据用网口发送到上位机。
上位机通过网口下发PL端写数据的时间间隔,PS端通过Lwip接收这个数据,然后通过GPIO发送给PL端。
结构如图所示:
二、PL端数据产生模块
module mem_data(input clk,
input [31:0] number_value,
output reg [31:0] addr = 0,
output reg en = 1,
output reg rst = 0,
output reg [3:0] we = 0,
output reg [31:0] data = 0,
output reg data_done = 0);
reg [2:0] rom_state = 0;
reg [15:0] test_time = 0;
reg [7:0] delay_counter = 0;
reg [31:0] counter = 0;
reg start_sig = 0;
always @(posedge clk) begin
if (counter < number_value-1) begin
counter <= counter + 1;
start_sig <= 0;
end
else begin
counter <= 0;
start_sig <= 1;
end
case (rom_state)
0 : begin
if (start_sig) begin
rom_state <= 1;
test_time <= test_time + 1;
end
data <= test_time;
end
1 : begin
if (addr<4095-4) begin
we <= 4'b1111;
addr <= addr + 4;
data <= data + 1;
end
else begin
addr <= 0;
we <= 4'b0000;
rom_state <= 2;
end
end
2 : begin
if (delay_counter<20) begin
data_done <= 1;
delay_counter <= delay_counter + 1;
end
else begin
delay_counter <= 0;
data_done <= 0;
rom_state <= 3;
end
end
3 : begin
if (~start_sig) begin
rom_state <= 0;
end
end
default : begin
rom_state <= 0;
end
endcase
end
endmodule
三、PS端程序
PS端包括GPIO的初始化和Lwip的配置。
Lwip设置成tcp server模式,当上位机连接上板子后,PL端就会根据设置的间隔时间发送数据和done信号。
程序有点乱,放在了这里。
四、调试
程序在zedboard上调试通过。