Zynq上用Lwip接收命令,发送数据

趁着假期,把Lwip做了一个初步的了解。主要的学习资源都来自于Xilinx的官方例子,还有FPGADesigner同学的blog。
年纪大了,一边带孩子一边学习,效率实在低。还有很多地方搞不明白,只有在以后的日子里慢慢补。

一、设计

PL端产生数据,发送到双口RAM,写完数据后给一个done信号到gpio,gpio接收信号,产生中断,PS端将RAM里的数据用网口发送到上位机。
上位机通过网口下发PL端写数据的时间间隔,PS端通过Lwip接收这个数据,然后通过GPIO发送给PL端。

结构如图所示:

Zynq上用Lwip接收命令,发送数据_第1张图片

二、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上调试通过。

你可能感兴趣的:(zynq,Lwip,fpga开发,嵌入式硬件,网络)