ZYNQ PL与PS交互:BRAM(一)

        在做项目时,需要用到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         

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ZYNQ是一种SoC(System on Chip),它将处理器系统(PS)和可编程逻辑(PL)集成在一起。PLPS之间的交互可以通过AXI(Advanced eXtensible Interface)总线进行。AXI是一种高性能、低功耗的总线协议,用于连接处理器和外设。 在ZYNQ中,PL可以实现AXI4接口,通过S AXI HP(High Performance)接口读取PS侧DDR3数据。这意味着PL可以通过AXI总线与PS进行数据交互。例如,PL可以向指定地址写入数据,然后PS可以从该地址读取数据。 下面是一个简单的示例,演示了ZYNQ PLPS之间的交互: 1. 在PL中实现AXI4接口,通过S AXI HP接口读取PS侧DDR3数据。 ```c // PL代码 #include <stdio.h> // 定义AXI寄存器地址 #define DATA_ADDR 0x10000000 int main() { // 向指定地址写入数据 int data = 123; *(int*)(DATA_ADDR) = data; // 等待PS读取数据 while (*(int*)(DATA_ADDR) != 0); // 打印读取到的数据 printf("PS读取到的数据:%d\n", *(int*)(DATA_ADDR)); return 0; } ``` 2. 在PS中读取PL写入的数据。 ```c // PS代码 #include <stdio.h> // 定义AXI寄存器地址 #define DATA_ADDR 0x10000000 int main() { // 从指定地址读取数据 int data = *(int*)(DATA_ADDR); // 打印读取到的数据 printf("从PL读取到的数据:%d\n", data); // 将读取到的数据写回PL *(int*)(DATA_ADDR) = data; return 0; } ``` 这个示例演示了PLPS之间的简单数据交互过程。PL向指定地址写入数据,PS从该地址读取数据,并将读取到的数据写回给PL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值