热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

ZYNQPSPL通信(PL侧)

概述 ZYNQ分为PS和PL两部分,PS端即ARM,PL即FPGA。在使用ZYNQ的时候不免需要PS和PL端进行通信。大多是情况下PS作为主端,PL作为从端,通过AXI总线实现PS

概述

 ZYNQ分为PS和PL两部分,PS端即ARM,PL即FPGA。在使用ZYNQ的时候不免需要PS和PL端进行通信。大多是情况下PS作为主端,PL作为从端,通过AXI总线实现PS-PL端的通信。本文主要介绍PL(即FPGA)如何配置的。


Block Design创建

  1.点击Create Block Design,添加ZYNQ7 Processing System IP

 

  2.双击打开ZYNQ7 Processing System,下图所示表示PS作为主端的接口。

 

 

  3.加入AXI Interconnect IP,由于上一步只设置了一个主端,所以Slave和Master都需要设置为1

 

 

 接下来就需要AXI_Lite接口,这个可以自己写,官方也提供了模板。接下来就详细说明官方模板


AXI_Lite创建

  1.点击Tool > Create and Package New IP > Next,选择 Create a new AXI4 peripheral > Next

 

   2.接下来设置IP的名字和存放地址,然后 next。

 

 

   4.接下来设置参数,Number of Registers根据需要设置,其他的不变。设置成64,表示有64个寄存器,每个寄存器的数据位宽是32bit。点击Next

 

 

   5.这里选择Edit IP,我们可以对官方的模板进行一些修改。然后点击Finish会重新打开一个工程,在这个工程中我们可以对官方的模板进行修改。

 

 

 


AXI-Lite官方模板说明

  可以看出官方文档由两个文件组成,这个官方文档是实现loopback的,亦是PS对某个寄存器写下来什么数据,读到的就是什么数据,并没有给出接口来和PL通信的。接下来将对这两个代码进行说明。

 

 


axi_lite_v1_0文件说明

  这个代码主要功能是调用了axi_lite_v1_0_S00_AXI模块。在真实的使用中我们需要进行修改。添加一些信号来和PL通信。

 

 









































信号名称说明
o_axi_clkAXI-Lite的时钟
o_axi_rst_n复位信号
o_rx_addrPS写寄存器的地址(PS to PL)
o_rx_dataPS写寄存器的数据(PS to PL)
o_rx_data_vldPS写数据有效(PS to PL)
i_tx_addrPL给PS数据地址
i_tx_dataPL给PS的数据
i_tx_data_vldPL给PS数据有效信号

  时钟和复位信号直接把输入的引出就好,其他信号则需要在另一个模块中处理。

   

 

 

 


axi_lite_v1_0_S00_AXI

  该模块实现了AXI—Lite,我们需要做一些修改。

  1.和上一模块对应,需要添加一些接口。

 

 

   2.PS写寄存器

always @( posedge S_AXI_ACLK )
begin
if ( S_AXI_ARESETN == 1'b0 )
begin
slv_reg0 <= 0;
slv_reg1 <= 0;
slv_reg2 <= 0;
slv_reg3 <= 0;
slv_reg4 <= 0;
slv_reg5 <= 0;
slv_reg6 <= 0;
slv_reg7 <= 0;
slv_reg8 <= 0;
slv_reg9 <= 0;
slv_reg10 <= 0;
slv_reg11 <= 0;
slv_reg12 <= 0;
slv_reg13 <= 0;
slv_reg14 <= 0;
slv_reg15 <= 0;
slv_reg16 <= 0;
slv_reg17 <= 0;
slv_reg18 <= 0;
slv_reg19 <= 0;
slv_reg20 <= 0;
slv_reg21 <= 0;
slv_reg22 <= 0;
slv_reg23 <= 0;
slv_reg24 <= 0;
slv_reg25 <= 0;
slv_reg26 <= 0;
slv_reg27 <= 0;
slv_reg28 <= 0;
slv_reg29 <= 0;
slv_reg30 <= 0;
slv_reg31 <= 0;
slv_reg32 <= 0;
slv_reg33 <= 0;
slv_reg34 <= 0;
slv_reg35 <= 0;
slv_reg36 <= 0;
slv_reg37 <= 0;
slv_reg38 <= 0;
slv_reg39 <= 0;
slv_reg40 <= 0;
slv_reg41 <= 0;
slv_reg42 <= 0;
slv_reg43 <= 0;
slv_reg44 <= 0;
slv_reg45 <= 0;
slv_reg46 <= 0;
slv_reg47 <= 0;
slv_reg48 <= 0;
slv_reg49 <= 0;
slv_reg50 <= 0;
slv_reg51 <= 0;
slv_reg52 <= 0;
slv_reg53 <= 0;
slv_reg54 <= 0;
slv_reg55 <= 0;
slv_reg56 <= 0;
slv_reg57 <= 0;
slv_reg58 <= 0;
slv_reg59 <= 0;
slv_reg60 <= 0;
slv_reg61 <= 0;
slv_reg62 <= 0;
slv_reg63 <= 0;
end
else begin
if (slv_reg_wren)
begin
case ( axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
6'h00:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 0
slv_reg0[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h01:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 1
slv_reg1[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h02:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 2
slv_reg2[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h03:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 3
slv_reg3[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h04:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 4
slv_reg4[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h05:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 5
slv_reg5[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h06:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 6
slv_reg6[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h07:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 7
slv_reg7[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h08:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 8
slv_reg8[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h09:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 9
slv_reg9[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h0A:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 10
slv_reg10[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h0B:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 11
slv_reg11[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h0C:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 12
slv_reg12[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h0D:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 13
slv_reg13[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h0E:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 14
slv_reg14[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h0F:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 15
slv_reg15[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h10:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 16
slv_reg16[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h11:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 17
slv_reg17[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h12:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 18
slv_reg18[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h13:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 19
slv_reg19[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h14:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 20
slv_reg20[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h15:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 21
slv_reg21[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h16:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 22
slv_reg22[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h17:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 23
slv_reg23[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h18:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 24
slv_reg24[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h19:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 25
slv_reg25[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h1A:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 26
slv_reg26[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h1B:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 27
slv_reg27[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h1C:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 28
slv_reg28[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h1D:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 29
slv_reg29[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h1E:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 30
slv_reg30[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h1F:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 31
slv_reg31[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h20:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 32
slv_reg32[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h21:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 33
slv_reg33[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h22:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 34
slv_reg34[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h23:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 35
slv_reg35[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h24:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 36
slv_reg36[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h25:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 37
slv_reg37[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h26:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 38
slv_reg38[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h27:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 39
slv_reg39[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h28:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 40
slv_reg40[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h29:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 41
slv_reg41[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h2A:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 42
slv_reg42[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h2B:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 43
slv_reg43[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h2C:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 44
slv_reg44[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h2D:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 45
slv_reg45[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h2E:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 46
slv_reg46[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h2F:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 47
slv_reg47[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h30:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 48
slv_reg48[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h31:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 49
slv_reg49[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h32:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 50
slv_reg50[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h33:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 51
slv_reg51[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h34:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 52
slv_reg52[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h35:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 53
slv_reg53[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h36:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 54
slv_reg54[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h37:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 55
slv_reg55[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h38:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 56
slv_reg56[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h39:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 57
slv_reg57[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h3A:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 58
slv_reg58[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h3B:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 59
slv_reg59[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h3C:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 60
slv_reg60[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h3D:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 61
slv_reg61[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h3E:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 62
slv_reg62[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
6'h3F:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 63
slv_reg63[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
default : begin
slv_reg0 <= slv_reg0;
slv_reg1 <= slv_reg1;
slv_reg2 <= slv_reg2;
slv_reg3 <= slv_reg3;
slv_reg4 <= slv_reg4;
slv_reg5 <= slv_reg5;
slv_reg6 <= slv_reg6;
slv_reg7 <= slv_reg7;
slv_reg8 <= slv_reg8;
slv_reg9 <= slv_reg9;
slv_reg10 <= slv_reg10;
slv_reg11 <= slv_reg11;
slv_reg12 <= slv_reg12;
slv_reg13 <= slv_reg13;
slv_reg14 <= slv_reg14;
slv_reg15 <= slv_reg15;
slv_reg16 <= slv_reg16;
slv_reg17 <= slv_reg17;
slv_reg18 <= slv_reg18;
slv_reg19 <= slv_reg19;
slv_reg20 <= slv_reg20;
slv_reg21 <= slv_reg21;
slv_reg22 <= slv_reg22;
slv_reg23 <= slv_reg23;
slv_reg24 <= slv_reg24;
slv_reg25 <= slv_reg25;
slv_reg26 <= slv_reg26;
slv_reg27 <= slv_reg27;
slv_reg28 <= slv_reg28;
slv_reg29 <= slv_reg29;
slv_reg30 <= slv_reg30;
slv_reg31 <= slv_reg31;
slv_reg32 <= slv_reg32;
slv_reg33 <= slv_reg33;
slv_reg34 <= slv_reg34;
slv_reg35 <= slv_reg35;
slv_reg36 <= slv_reg36;
slv_reg37 <= slv_reg37;
slv_reg38 <= slv_reg38;
slv_reg39 <= slv_reg39;
slv_reg40 <= slv_reg40;
slv_reg41 <= slv_reg41;
slv_reg42 <= slv_reg42;
slv_reg43 <= slv_reg43;
slv_reg44 <= slv_reg44;
slv_reg45 <= slv_reg45;
slv_reg46 <= slv_reg46;
slv_reg47 <= slv_reg47;
slv_reg48 <= slv_reg48;
slv_reg49 <= slv_reg49;
slv_reg50 <= slv_reg50;
slv_reg51 <= slv_reg51;
slv_reg52 <= slv_reg52;
slv_reg53 <= slv_reg53;
slv_reg54 <= slv_reg54;
slv_reg55 <= slv_reg55;
slv_reg56 <= slv_reg56;
slv_reg57 <= slv_reg57;
slv_reg58 <= slv_reg58;
slv_reg59 <= slv_reg59;
slv_reg60 <= slv_reg60;
slv_reg61 <= slv_reg61;
slv_reg62 <= slv_reg62;
slv_reg63 <= slv_reg63;
end
endcase
end
end
end

  这一段就是官方模板中PS写寄存器的代码。前面定义的就寄存器数量是64,可以看出判断的时候只用了地址axi_awaddr[7:2],这是因为数据位宽是32bit,而一个真实的寄存器地址只有8bit的数据,所以地址的偏移量为4。PS也可以只更新某个8bit的寄存器,这个可以S_AXI_WSTRB判断更新的是哪一个寄存器,一般情况下PS也是32bit一起更新,所以无需使用S_AXI_WSTRB信号。

always @( posedge S_AXI_ACLK )
begin
if ( S_AXI_ARESETN == 1'b0 )
begin
o_rx_addr <= 0;
o_rx_data <= 0;
o_rx_data_vld <= 0;
end
else begin
if (slv_reg_wren)
begin
case ( axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
6'h00: begin
o_rx_addr <= 6'h00;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h01: begin
o_rx_addr <= 6'h01;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h02: begin
o_rx_addr <= 6'h02;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h03: begin
o_rx_addr <= 6'h03;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h04: begin
o_rx_addr <= 6'h04;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h05: begin
o_rx_addr <= 6'h05;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h06: begin
o_rx_addr <= 6'h06;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h07: begin
o_rx_addr <= 6'h07;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h08: begin
o_rx_addr <= 6'h08;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h09: begin
o_rx_addr <= 6'h09;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h0A: begin
o_rx_addr <= 6'h0A;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h0B: begin
o_rx_addr <= 6'h0B;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h0C: begin
o_rx_addr <= 6'h0C;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h0D: begin
o_rx_addr <= 6'h0D;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h0E: begin
o_rx_addr <= 6'h0E;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h0F: begin
o_rx_addr <= 6'h0F;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h10: begin
o_rx_addr <= 6'h10;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h11: begin
o_rx_addr <= 6'h11;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h12: begin
o_rx_addr <= 6'h12;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h13: begin
o_rx_addr <= 6'h13;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h14: begin
o_rx_addr <= 6'h14;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h15: begin
o_rx_addr <= 6'h15;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h16: begin
o_rx_addr <= 6'h16;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h17: begin
o_rx_addr <= 6'h17;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h18: begin
o_rx_addr <= 6'h18;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h19: begin
o_rx_addr <= 6'h19;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h1A: begin
o_rx_addr <= 6'h1A;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h1B: begin
o_rx_addr <= 6'h1B;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h1C: begin
o_rx_addr <= 6'h1C;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h1D: begin
o_rx_addr <= 6'h1D;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h1E: begin
o_rx_addr <= 6'h1E;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h1F: begin
o_rx_addr <= 6'h1F;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h20: begin
o_rx_addr <= 6'h20;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h21: begin
o_rx_addr <= 6'h21;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h22: begin
o_rx_addr <= 6'h22;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h23: begin
o_rx_addr <= 6'h23;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h24: begin
o_rx_addr <= 6'h24;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h25: begin
o_rx_addr <= 6'h25;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h26: begin
o_rx_addr <= 6'h26;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h27: begin
o_rx_addr <= 6'h27;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h28: begin
o_rx_addr <= 6'h28;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h29: begin
o_rx_addr <= 6'h29;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h2A: begin
o_rx_addr <= 6'h2A;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h2B: begin
o_rx_addr <= 6'h2B;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h2C: begin
o_rx_addr <= 6'h2C;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h2D: begin
o_rx_addr <= 6'h2D;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h2E: begin
o_rx_addr <= 6'h2E;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h2F: begin
o_rx_addr <= 6'h2F;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h30: begin
o_rx_addr <= 6'h30;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h31: begin
o_rx_addr <= 6'h31;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h32: begin
o_rx_addr <= 6'h32;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h33: begin
o_rx_addr <= 6'h33;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h34: begin
o_rx_addr <= 6'h34;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h35: begin
o_rx_addr <= 6'h35;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h36: begin
o_rx_addr <= 6'h36;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h37: begin
o_rx_addr <= 6'h37;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h38: begin
o_rx_addr <= 6'h38;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h39: begin
o_rx_addr <= 6'h39;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h3A: begin
o_rx_addr <= 6'h3A;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h3B: begin
o_rx_addr <= 6'h3B;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h3C: begin
o_rx_addr <= 6'h3C;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h3D: begin
o_rx_addr <= 6'h3D;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h3E: begin
o_rx_addr <= 6'h3E;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
6'h3F: begin
o_rx_addr <= 6'h3F;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b1;
end
default : begin
o_rx_addr <= 6'h3F;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b0;
end
endcase
end
else begin
o_rx_addr <= 6'h00;
o_rx_data <= S_AXI_WDATA;
o_rx_data_vld <= 1'b0;
end
end
end

 

  3.PS读寄存器

  官方模板中PS读寄存器代买如下。原本slv_reg的值为PS写的值。

always @(*)
begin
// Address decoding for reading registers
case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
6'h00 : reg_data_out <= slv_reg0;
6'h01 : reg_data_out <= slv_reg1;
6'h02 : reg_data_out <= slv_reg2;
6'h03 : reg_data_out <= slv_reg3;
6'h04 : reg_data_out <= slv_reg4;
6'h05 : reg_data_out <= slv_reg5;
6'h06 : reg_data_out <= slv_reg6;
6'h07 : reg_data_out <= slv_reg7;
6'h08 : reg_data_out <= slv_reg8;
6'h09 : reg_data_out <= slv_reg9;
6'h0A : reg_data_out <= slv_reg10;
6'h0B : reg_data_out <= slv_reg11;
6'h0C : reg_data_out <= slv_reg12;
6'h0D : reg_data_out <= slv_reg13;
6'h0E : reg_data_out <= slv_reg14;
6'h0F : reg_data_out <= slv_reg15;
6'h10 : reg_data_out <= slv_reg16;
6'h11 : reg_data_out <= slv_reg17;
6'h12 : reg_data_out <= slv_reg18;
6'h13 : reg_data_out <= slv_reg19;
6'h14 : reg_data_out <= slv_reg20;
6'h15 : reg_data_out <= slv_reg21;
6'h16 : reg_data_out <= slv_reg22;
6'h17 : reg_data_out <= slv_reg23;
6'h18 : reg_data_out <= slv_reg24;
6'h19 : reg_data_out <= slv_reg25;
6'h1A : reg_data_out <= slv_reg26;
6'h1B : reg_data_out <= slv_reg27;
6'h1C : reg_data_out <= slv_reg28;
6'h1D : reg_data_out <= slv_reg29;
6'h1E : reg_data_out <= slv_reg30;
6'h1F : reg_data_out <= slv_reg31;
6'h20 : reg_data_out <= slv_reg32;
6'h21 : reg_data_out <= slv_reg33;
6'h22 : reg_data_out <= slv_reg34;
6'h23 : reg_data_out <= slv_reg35;
6'h24 : reg_data_out <= slv_reg36;
6'h25 : reg_data_out <= slv_reg37;
6'h26 : reg_data_out <= slv_reg38;
6'h27 : reg_data_out <= slv_reg39;
6'h28 : reg_data_out <= slv_reg40;
6'h29 : reg_data_out <= slv_reg41;
6'h2A : reg_data_out <= slv_reg42;
6'h2B : reg_data_out <= slv_reg43;
6'h2C : reg_data_out <= slv_reg44;
6'h2D : reg_data_out <= slv_reg45;
6'h2E : reg_data_out <= slv_reg46;
6'h2F : reg_data_out <= slv_reg47;
6'h30 : reg_data_out <= slv_reg48;
6'h31 : reg_data_out <= slv_reg49;
6'h32 : reg_data_out <= slv_reg50;
6'h33 : reg_data_out <= slv_reg51;
6'h34 : reg_data_out <= slv_reg52;
6'h35 : reg_data_out <= slv_reg53;
6'h36 : reg_data_out <= slv_reg54;
6'h37 : reg_data_out <= slv_reg55;
6'h38 : reg_data_out <= slv_reg56;
6'h39 : reg_data_out <= slv_reg57;
6'h3A : reg_data_out <= slv_reg58;
6'h3B : reg_data_out <= slv_reg59;
6'h3C : reg_data_out <= slv_reg60;
6'h3D : reg_data_out <= slv_reg61;
6'h3E : reg_data_out <= slv_reg62;
6'h3F : reg_data_out <= slv_reg63;
default : reg_data_out <= 0;
endcase
end

 

在后面增加一段代码,将PL要发送给PS的数据,给到slv_reg*。(由于PS是主端,只有PS主动读某个寄存器地址后,才能完成PL发送给PS)。

 

// Add user logic here
always @( posedge S_AXI_ACLK )
begin
if ( S_AXI_ARESETN == 1'b0 )
begin
slv_reg0 <= 0;
slv_reg1 <= 0;
slv_reg2 <= 0;
slv_reg3 <= 0;
slv_reg4 <= 0;
slv_reg5 <= 0;
slv_reg6 <= 0;
slv_reg7 <= 0;
slv_reg8 <= 0;
slv_reg9 <= 0;
slv_reg10 <= 0;
slv_reg11 <= 0;
slv_reg12 <= 0;
slv_reg13 <= 0;
slv_reg14 <= 0;
slv_reg15 <= 0;
slv_reg16 <= 0;
slv_reg17 <= 0;
slv_reg18 <= 0;
slv_reg19 <= 0;
slv_reg20 <= 0;
slv_reg21 <= 0;
slv_reg22 <= 0;
slv_reg23 <= 0;
slv_reg24 <= 0;
slv_reg25 <= 0;
slv_reg26 <= 0;
slv_reg27 <= 0;
slv_reg28 <= 0;
slv_reg29 <= 0;
slv_reg30 <= 0;
slv_reg31 <= 0;
slv_reg32 <= 0;
slv_reg33 <= 0;
slv_reg34 <= 0;
slv_reg35 <= 0;
slv_reg36 <= 0;
slv_reg37 <= 0;
slv_reg38 <= 0;
slv_reg39 <= 0;
slv_reg40 <= 0;
slv_reg41 <= 0;
slv_reg42 <= 0;
slv_reg43 <= 0;
slv_reg44 <= 0;
slv_reg45 <= 0;
slv_reg46 <= 0;
slv_reg47 <= 0;
slv_reg48 <= 0;
slv_reg49 <= 0;
slv_reg50 <= 0;
slv_reg51 <= 0;
slv_reg52 <= 0;
slv_reg53 <= 0;
slv_reg54 <= 0;
slv_reg55 <= 0;
slv_reg56 <= 0;
slv_reg57 <= 0;
slv_reg58 <= 0;
slv_reg59 <= 0;
slv_reg60 <= 0;
slv_reg61 <= 0;
slv_reg62 <= 0;
slv_reg63 <= 0;
end
else if (i_tx_data_vld)
begin
case (i_tx_addr)
6'h00 : slv_reg0 <= i_tx_data;
6'h01 : slv_reg1 <= i_tx_data;
6'h02 : slv_reg2 <= i_tx_data;
6'h03 : slv_reg3 <= i_tx_data;
6'h04 : slv_reg4 <= i_tx_data;
6'h05 : slv_reg5 <= i_tx_data;
6'h06 : slv_reg6 <= i_tx_data;
6'h07 : slv_reg7 <= i_tx_data;
6'h08 : slv_reg8 <= i_tx_data;
6'h09 : slv_reg9 <= i_tx_data;
6'h0A : slv_reg10 <= i_tx_data;
6'h0B : slv_reg11 <= i_tx_data;
6'h0C : slv_reg12 <= i_tx_data;
6'h0D : slv_reg13 <= i_tx_data;
6'h0E : slv_reg14 <= i_tx_data;
6'h0F : slv_reg15 <= i_tx_data;
6'h10 : slv_reg16 <= i_tx_data;
6'h11 : slv_reg17 <= i_tx_data;
6'h12 : slv_reg18 <= i_tx_data;
6'h13 : slv_reg19 <= i_tx_data;
6'h14 : slv_reg20 <= i_tx_data;
6'h15 : slv_reg21 <= i_tx_data;
6'h16 : slv_reg22 <= i_tx_data;
6'h17 : slv_reg23 <= i_tx_data;
6'h18 : slv_reg24 <= i_tx_data;
6'h19 : slv_reg25 <= i_tx_data;
6'h1A : slv_reg26 <= i_tx_data;
6'h1B : slv_reg27 <= i_tx_data;
6'h1C : slv_reg28 <= i_tx_data;
6'h1D : slv_reg29 <= i_tx_data;
6'h1E : slv_reg30 <= i_tx_data;
6'h1F : slv_reg31 <= i_tx_data;
6'h20 : slv_reg32 <= i_tx_data;
6'h21 : slv_reg33 <= i_tx_data;
6'h22 : slv_reg34 <= i_tx_data;
6'h23 : slv_reg35 <= i_tx_data;
6'h24 : slv_reg36 <= i_tx_data;
6'h25 : slv_reg37 <= i_tx_data;
6'h26 : slv_reg38 <= i_tx_data;
6'h27 : slv_reg39 <= i_tx_data;
6'h28 : slv_reg40 <= i_tx_data;
6'h29 : slv_reg41 <= i_tx_data;
6'h2A : slv_reg42 <= i_tx_data;
6'h2B : slv_reg43 <= i_tx_data;
6'h2C : slv_reg44 <= i_tx_data;
6'h2D : slv_reg45 <= i_tx_data;
6'h2E : slv_reg46 <= i_tx_data;
6'h2F : slv_reg47 <= i_tx_data;
6'h30 : slv_reg48 <= i_tx_data;
6'h31 : slv_reg49 <= i_tx_data;
6'h32 : slv_reg50 <= i_tx_data;
6'h33 : slv_reg51 <= i_tx_data;
6'h34 : slv_reg52 <= i_tx_data;
6'h35 : slv_reg53 <= i_tx_data;
6'h36 : slv_reg54 <= i_tx_data;
6'h37 : slv_reg55 <= i_tx_data;
6'h38 : slv_reg56 <= i_tx_data;
6'h39 : slv_reg57 <= i_tx_data;
6'h3A : slv_reg58 <= i_tx_data;
6'h3B : slv_reg59 <= i_tx_data;
6'h3C : slv_reg60 <= i_tx_data;
6'h3D : slv_reg61 <= i_tx_data;
6'h3E : slv_reg62 <= i_tx_data;
6'h3F : slv_reg63 <= i_tx_data;
default : begin
slv_reg0 <= slv_reg0 ;
slv_reg1 <= slv_reg1 ;
slv_reg2 <= slv_reg2 ;
slv_reg3 <= slv_reg3 ;
slv_reg4 <= slv_reg4 ;
slv_reg5 <= slv_reg5 ;
slv_reg6 <= slv_reg6 ;
slv_reg7 <= slv_reg7 ;
slv_reg8 <= slv_reg8 ;
slv_reg9 <= slv_reg9 ;
slv_reg10 <= slv_reg10;
slv_reg11 <= slv_reg11;
slv_reg12 <= slv_reg12;
slv_reg13 <= slv_reg13;
slv_reg14 <= slv_reg14;
slv_reg15 <= slv_reg15;
slv_reg16 <= slv_reg16;
slv_reg17 <= slv_reg17;
slv_reg18 <= slv_reg18;
slv_reg19 <= slv_reg19;
slv_reg20 <= slv_reg20;
slv_reg21 <= slv_reg21;
slv_reg22 <= slv_reg22;
slv_reg23 <= slv_reg23;
slv_reg24 <= slv_reg24;
slv_reg25 <= slv_reg25;
slv_reg26 <= slv_reg26;
slv_reg27 <= slv_reg27;
slv_reg28 <= slv_reg28;
slv_reg29 <= slv_reg29;
slv_reg30 <= slv_reg30;
slv_reg31 <= slv_reg31;
slv_reg32 <= slv_reg32;
slv_reg33 <= slv_reg33;
slv_reg34 <= slv_reg34;
slv_reg35 <= slv_reg35;
slv_reg36 <= slv_reg36;
slv_reg37 <= slv_reg37;
slv_reg38 <= slv_reg38;
slv_reg39 <= slv_reg39;
slv_reg40 <= slv_reg40;
slv_reg41 <= slv_reg41;
slv_reg42 <= slv_reg42;
slv_reg43 <= slv_reg43;
slv_reg44 <= slv_reg44;
slv_reg45 <= slv_reg45;
slv_reg46 <= slv_reg46;
slv_reg47 <= slv_reg47;
slv_reg48 <= slv_reg48;
slv_reg49 <= slv_reg49;
slv_reg50 <= slv_reg50;
slv_reg51 <= slv_reg51;
slv_reg52 <= slv_reg52;
slv_reg53 <= slv_reg53;
slv_reg54 <= slv_reg54;
slv_reg55 <= slv_reg55;
slv_reg56 <= slv_reg56;
slv_reg57 <= slv_reg57;
slv_reg58 <= slv_reg58;
slv_reg59 <= slv_reg59;
slv_reg60 <= slv_reg60;
slv_reg61 <= slv_reg61;
slv_reg62 <= slv_reg62;
slv_reg63 <= slv_reg63;
end
endcase
end
else begin
slv_reg0 <= slv_reg0 ;
slv_reg1 <= slv_reg1 ;
slv_reg2 <= slv_reg2 ;
slv_reg3 <= slv_reg3 ;
slv_reg4 <= slv_reg4 ;
slv_reg5 <= slv_reg5 ;
slv_reg6 <= slv_reg6 ;
slv_reg7 <= slv_reg7 ;
slv_reg8 <= slv_reg8 ;
slv_reg9 <= slv_reg9 ;
slv_reg10 <= slv_reg10;
slv_reg11 <= slv_reg11;
slv_reg12 <= slv_reg12;
slv_reg13 <= slv_reg13;
slv_reg14 <= slv_reg14;
slv_reg15 <= slv_reg15;
slv_reg16 <= slv_reg16;
slv_reg17 <= slv_reg17;
slv_reg18 <= slv_reg18;
slv_reg19 <= slv_reg19;
slv_reg20 <= slv_reg20;
slv_reg21 <= slv_reg21;
slv_reg22 <= slv_reg22;
slv_reg23 <= slv_reg23;
slv_reg24 <= slv_reg24;
slv_reg25 <= slv_reg25;
slv_reg26 <= slv_reg26;
slv_reg27 <= slv_reg27;
slv_reg28 <= slv_reg28;
slv_reg29 <= slv_reg29;
slv_reg30 <= slv_reg30;
slv_reg31 <= slv_reg31;
slv_reg32 <= slv_reg32;
slv_reg33 <= slv_reg33;
slv_reg34 <= slv_reg34;
slv_reg35 <= slv_reg35;
slv_reg36 <= slv_reg36;
slv_reg37 <= slv_reg37;
slv_reg38 <= slv_reg38;
slv_reg39 <= slv_reg39;
slv_reg40 <= slv_reg40;
slv_reg41 <= slv_reg41;
slv_reg42 <= slv_reg42;
slv_reg43 <= slv_reg43;
slv_reg44 <= slv_reg44;
slv_reg45 <= slv_reg45;
slv_reg46 <= slv_reg46;
slv_reg47 <= slv_reg47;
slv_reg48 <= slv_reg48;
slv_reg49 <= slv_reg49;
slv_reg50 <= slv_reg50;
slv_reg51 <= slv_reg51;
slv_reg52 <= slv_reg52;
slv_reg53 <= slv_reg53;
slv_reg54 <= slv_reg54;
slv_reg55 <= slv_reg55;
slv_reg56 <= slv_reg56;
slv_reg57 <= slv_reg57;
slv_reg58 <= slv_reg58;
slv_reg59 <= slv_reg59;
slv_reg60 <= slv_reg60;
slv_reg61 <= slv_reg61;
slv_reg62 <= slv_reg62;
slv_reg63 <= slv_reg63;
end
end
// User logic ends

 

 

修改之后生成IP,并将该IP加入到工程中后,添加到Block Design中。

 

 


结束语

除了上述修改的方法之外,还可以根据需要,在官方模板上修改,比如有些寄存器是PS只读的,在写的部分我们就将其注释掉;有些是只写的,在读的部分可以将其注释掉。

新人一枚,难免有错,欢迎指正!



推荐阅读
  • 乐视手机S1 Pro发布,声称手机真不卡,外观酷似iPhone
    乐视宣布即将发布乐视手机S1 Pro,搭载虎贲T7510芯片,声称手机真不卡。该手机外观与iPhone 14 Pro相似,采用居中药丸式挖孔屏和方形三摄模组。官方定位该手机为便宜的5G手机,售价预计在千元价位。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • PL2303HXD电路图(USB转UART)介绍及应用
    本文介绍了PL2303HXD电路图(USB转UART)的特性和应用,该电路图可以实现RS232和USB信号的转换,方便嵌入到手持设备中。PL2303HXD作为USB/RS232双向转换器,可以将USB数据转换为RS232信息流格式发送给外设,并将RS232外设的数据转换为USB数据格式传送回主机。通过利用USB块传输模式和自动流量控制,PL2303HXD能够实现更高的数据传输吞吐量比传统的UART端口。 ... [详细]
  • 解决Sharepoint 2013运行状况分析出现的“一个或多个服务器未响应”问题的方法
    本文介绍了解决Sharepoint 2013运行状况分析中出现的“一个或多个服务器未响应”问题的方法。对于有高要求的客户来说,系统检测问题的存在是不可接受的。文章详细描述了解决该问题的步骤,包括删除服务器、处理分布式缓存留下的记录以及使用代码等方法。同时还提供了相关关键词和错误提示信息,以帮助读者更好地理解和解决该问题。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 本文整理了Java中com.evernote.android.job.JobRequest.getTransientExtras()方法的一些代码示例,展示了 ... [详细]
  • python中安装并使用redis相关的知识
    本文介绍了在python中安装并使用redis的相关知识,包括redis的数据缓存系统和支持的数据类型,以及在pycharm中安装redis模块和常用的字符串操作。 ... [详细]
  • 本文介绍了在Ubuntu 11.10 x64环境下安装Android开发环境的步骤,并提供了解决常见问题的方法。其中包括安装Eclipse的ADT插件、解决缺少GEF插件的问题以及解决无法找到'userdata.img'文件的问题。此外,还提供了相关插件和系统镜像的下载链接。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • 关于两个RTC时钟闹钟,求助?
    在系统启动2秒后,实时时钟(RTC)每3秒钟产生一个闹钟事件(Alarmevent),使系统进入停机模式以降低功耗设置实时时钟。 ... [详细]
  • mysql如何插入一列数据
    mysql插入一列数据的方法:首先打开终端;然后给表添加一列,代码为【altertableuseraddgendervarchar(2);】,其中列名为gender,类型为var ... [详细]
  • Harmony 与 Game Space 达成合作,在 Shard1 上扩展 Web3 游戏
    旧金山20 ... [详细]
  • 原文地址http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/最开始时 ... [详细]
author-avatar
自由的成长_563_742_784
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有