在做项目时,需要用到ZYNQ PL端与PS端的交互,目前采用BRAM的方式,PS端每次写入128bit,BRAM深度为1024,需要用到4个36k的BRAM资源。
在PL读数时,需要在BRAM使能en及we拉高时读数据,we为4字节,每次只能有1字节为高,标志可读的4字节数据。若想读出128bit数据,需要依次判断we信号。同时要读取BRAM输入数据的相应字节,但BRAM的地址不能变动。只有在读取第2个128bit时,地址才可以累加16。
读一个地址的128bit数据代码如下:
else if((BRAM_PORTA_0_en==1'b1)&(BRAM_PORTA_0_we==16'h000F))begin
case(BRAM_PORTA_0_addr[13:0])
14'h000:reg32_0 <= BRAM_PORTA_0_din;
default: reg32_0 <= reg32_0;
endcase
end
else if((BRAM_PORTA_0_en==1'b1)&&(BRAM_PORTA_0_we==16'h00F0))begin
case(BRAM_PORTA_0_addr[13:0])
14'h000:reg32_1 <= BRAM_PORTA_0_din[63:32];
default: reg32_1 <= reg32_1;
endcase
end
else if((BRAM_PORTA_0_en==1'b1)&(BRAM_PORTA_0_we==16'h0F00))begin
case(BRAM_PORTA_0_addr[13:0])
14'h000:reg32_2 <= BRAM_PORTA_0_din[95:64];
default: reg32_2 <= reg32_2;
endcase
end
else if((BRAM_PORTA_0_en==1'b1)&(BRAM_PORTA_0_we==16'hF000))begin
case(BRAM_PORTA_0_addr[13:0])
14'h000:reg32_3 <= BRAM_PORTA_0_din[127:96];
default: reg32_3 <= reg32_3;
endcase
end