<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ` `Zynq7021有1G的DDR,PS和PL都可以對DDR進行訪問。PS端對DDR的讀寫,在Xil_io.h文件中,使用Xil_Out函數可以向 DDR寫入數據,使用Xil_In函數可以從DDR讀取數據。但是要注意ARM的二級緩存問題。 ## 大端存儲和小端存儲 ` `在CPU內部的地址總線和數據總線是與內存的地址總線和數據總線連接在一起的。當一個數從內存中向CPU傳送時,有時是以字節為單位,有時又以字(4字節)為單位。傳過來是放在寄存器里(一般是32字節),在寄存器中,一個字的表示是右邊應該屬于低位,左邊屬于高位,如果寄存器的高位和內存中的高地址相對應,低位和內存的低地址相對應,這就屬于小端存儲。反之則稱為大端存儲。大部分處理器都是小端存儲的。 ` `因為十六進制的2位正好是1字節,所以選十六進制0x0A0B0C0D為例,如圖2-1所示,對小端存儲,低位是0x0D,應存入低位地址,所以存入的順序是`0x0D 0x0C 0x0B 0x0A `。反之,對于大端存儲則為`0x0A 0x0B 0x0C 0x0D `。 ![](https://img.kancloud.cn/f4/7e/f47e5e2d4a028a7d97d3b959f951092e_1249x765.png) ## zynq的存儲方式 ` `驗證zynq存儲方式: ``` /** * PS對DDR的讀寫,以及驗證設備是屬于大端存儲還是小端存儲 */ void DDR_PS_TEST() { Xil_Out32(0x30000000,0x12345678); u32 data1 = Xil_In8(0x30000000); u32 data2 = Xil_In8(0x30000000 + 1); u32 data3 = Xil_In8(0x30000000 + 2); u32 data4 = Xil_In8(0x30000000 + 3); printf("地址:%x 8位數據:%x\n",0x30000000,data1); printf("地址:%x 8位數據:%x\n",0x30000001,data2); printf("地址:%x 8位數據:%x\n",0x30000002,data3); printf("地址:%x 8位數據:%x\n",0x30000003,data4); while(1)usleep(1000000); } ``` ![](https://img.kancloud.cn/1c/72/1c721152c4cd9028de482cde45c36c8a_302x149.png) ` `可以看到在zynq中是屬于小端存儲。因此使用PL端AXI總線實現寫入8位的數據的示例代碼: ``` module module ( input clk, output reg [31:0]addr, output reg [31:0]data ); reg [7:0]new_byte; always@(posedge clk) begin data <= data{data[23:0],new_byte}; addr <= addr + 1; new_byte <= new_byte + 1'b1; end endmodule ``` ` ` 同理可得,寫入16位的數據如下: ``` module ( input clk, output reg [31:0]addr, output reg [31:0]data ); reg [15:0]new_word; always@(posedge clk) begin data <= data{data[15:0],new_word}; addr <= addr + 2; new_word <= new_word + 1'b1; end endmodule ``` ` `采用這種方式,必須在一種數據類型的最高地址后空出3的地址,避免后續數據被覆蓋。 ## C語言中與存儲有關的情況 ` `下面,分享一道有趣的編程題,加深印象,此題來自> 在32位的X86系統下,輸出的值為: ``` #include <stdio.h> int main() { int a[5]={1,2,3,4,5}; //A int *ptr1=(int *)(&a+1); //B int *ptr2=(int *)((int)a+1); //C printf("%x,%x",ptr1[-1],*ptr2); //D return 0; } ``` ` `首先,由題目可知32位的X86系統是采用小端存儲的,即高位放高地址,低位放地址。執行完A語句后,假設該數組是放在0起始地址上。 ![](https://img.kancloud.cn/28/0a/280a90ebbc1ec155a54fd6fe2d06f6e5_522x657.png) ` `&a+1是整個數組長度再加1,指向20地址,而&a\[0\]+1則是指向2地址,雖然&a與&a\[0\]地址一樣,但是有著本質的不同。ptr1\[-1\]被解析成\*(ptr1-1),即ptr1往后退四字節,所以ptr1\[-1\]十六進制為5。對于C賦值語句,(int)a+1指向的地址為1,因為是低端存儲,所以\*ptr2=2000000,以上,完畢。 答案:5,2000000
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看