(原創)由XPS生成AXI Lite 從設備IP模板我們能學到的東西


查看由XPS的向導生成的AXI Lite IP代碼模板中,我們能學習到用戶自定義IP的結構和實現方式。拿寫寄存器來說,我們能看到這樣的一段代碼

 1   // implement slave model register(s)
 2   always @( posedge Bus2IP_Clk )
 3     begin
 4 
 5       if ( Bus2IP_Resetn == 1'b0 )
 6         begin
 7           slv_reg0 <= 0;
 8           slv_reg1 <= 0;
 9           slv_reg2 <= 0;
10           slv_reg3 <= 0;
11           slv_reg4 <= 0;
12           slv_reg5 <= 0;
13           slv_reg6 <= 0;
14           slv_reg7 <= 0;
15         end
16       else
17         case ( slv_reg_write_sel )
18           8'b10000000 :
19             for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
20               if ( Bus2IP_BE[byte_index] == 1 )
21                 slv_reg0[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
22           8'b01000000 :
23             for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
24               if ( Bus2IP_BE[byte_index] == 1 )
25                 slv_reg1[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
26           8'b00100000 :
27             for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
28               if ( Bus2IP_BE[byte_index] == 1 )
29                 slv_reg2[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
30           8'b00010000 :
31             for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
32               if ( Bus2IP_BE[byte_index] == 1 )
33                 slv_reg3[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
34           8'b00001000 :
35             for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
36               if ( Bus2IP_BE[byte_index] == 1 )
37                 slv_reg4[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
38           8'b00000100 :
39             for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
40               if ( Bus2IP_BE[byte_index] == 1 )
41                 slv_reg5[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
42           8'b00000010 :
43             for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
44               if ( Bus2IP_BE[byte_index] == 1 )
45                 slv_reg6[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
46           8'b00000001 :
47             for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
48               if ( Bus2IP_BE[byte_index] == 1 )
49                 slv_reg7[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
50           default : begin
51             slv_reg0 <= slv_reg0;
52             slv_reg1 <= slv_reg1;
53             slv_reg2 <= slv_reg2;
54             slv_reg3 <= slv_reg3;
55             slv_reg4 <= slv_reg4;
56             slv_reg5 <= slv_reg5;
57             slv_reg6 <= slv_reg6;
58             slv_reg7 <= slv_reg7;
59                     end
60         endcase
61 
62     end // SLAVE_REG_WRITE_PROC

 

代碼實現的功能是將總線上的數據按字節寫入到寄存器中。代碼中有: 

slv_reg0~slv_reg7為8個寄存器

C_SLV_DWIDTH為數據位寬,是一個參數

slv_reg_write_sel 為寄存器選擇信號,如slv_reg_write_sel = 8‘1000_0000時,slv_reg0將在寫操作時被選中。

Bus2IP_Data為寫數據端口

Bus2IP_BE為字節使能信號

從這段代碼中,我們可以看到:

1、AXI Lite 從設備接口也是memory mapped的,但不像AVALON memory mapped 。一個從設備的基地址C_BASEADDR設定后,設備的寄存器是通過Bus2IP_WrCE / Bus2IP_RdCE 信號(這里即slv_reg_write_sel) 信號選擇的。當然,slv_reg_write_sel 信號的編碼源是地址線,AXI Lite 規定最高位為1時的基地址,在這里slv_reg_write_sel 為8’b1000_0000,寄存器slv_reg0地址就是基地址;slv_reg_write_sel 為8’b0100_0000,寄存器slv_reg1地址就是基地址+0x04;以此類推。從設備的地址空間由參數設定,而不是由地址線直接決定。

2、對於寄存器中的字節,代碼是這樣實現

1 for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
2     if ( Bus2IP_BE[byte_index] == 1 )
3        slv_reg3[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];

假如數據寬度C_SLV_DWIDTH是32bit,那么把參數用數字代入后,代碼是這樣的

1  for ( byte_index = 0; byte_index <= 3; byte_index = byte_index+1 )
2     if ( Bus2IP_BE[byte_index] == 1 )
3         slv_reg3[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];

很好理解,就是字節使能Bus2IP_BE對應為有效,則將對應字節從數據總線傳輸到相應寄存器上。能看到XPS生成的模板,很巧妙的用到了這樣的表達式

slv_reg3[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];

形式即為

a[startbit+: 8] <= b[startbit +: 8];

8為長度,等效為

a[startbit+7: startbit] <= b[startbit+7: startbit]

這種簡略寫法可以在以后的編程中參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM