2007年12月10日 星期一

1210 調整SRAM記憶體配置方式

目的:因為FPGA版的容量不夠大,無法把4G的ROM與SRAM全部燒進去,必須將所使用的到容量縮到最小。
下圖為MIPS記憶體的配置方式,PCspim也是依照此放式來配置記憶體。


在撰寫MIPS R3000時,我們將程式碼區段放置在ROM內,且將PC從0x0000 0000開始執行。推疊跟靜態資料放置在SRAM內。



我們以移位的程式來做範例


經過lcc compiler與PCspim模擬後,可知道
R29 (sp) = 7fffeffc   $sp  7fffeffc
DATA 靜態資料0x10000000 到 0x10040000
[0x10000000]...[0x10010000] 0x00000000
[0x10010000] 0x0000007e 0x0000007b 0x0000007c 0x00000076
[0x10010010] 0x0000007c 0x00000075 0x00000077 0x00000074
[0x10010020] 0x00000078 0x0000007a 0x00000077 0x00000078
[0x10010030] 0x00000076 0x00000079 0x00000077 0x00000078
[0x10010040] 0x00000081 0x00000079 0x0000007e 0x00000077
. .

. .
[0x100100d0] 0x00000096 0x00000096 0x00000096 0x00000098
[0x100100e0] 0x0000009f 0x000000a0 0x0000009e 0x0000009b
[0x100100f0] 0x0000009b 0x0000009b 0x0000009b 0x0000009a
[0x10010100]...[0x10040000] 0x00000000
STACK
[0x7fffeffc] 0x00000000
為了縮減ROM與SRAM的容量,我們將$pc=0x0000 0000 根據組合語言我們可以知道靜態資料會用到的記憶體位址由0x1001 0000 到 0x1001 00ff,固靜態資料必須大於0x1001 00ff,在根據組合語言內對$sp所做的運算,我們將靜態資料設成0x1001 0110


[0x00400024] 0x27bdfef0 addiu $29, $29, -272 ; 79: addu $sp,$sp,-272


為了避免堆疊與靜態資料衝到,所以$sp=0x1001 0110 + 272 ==> 0x1001 0220
下圖為修改過後的記憶體配置方式:



因為0x1001 0220 ==> 268501536 要宣告的陣列過大,所以我們將SRAM的address全部往前位移,位移過後的記憶體配置方式如下圖:

2007年12月8日 星期六

1208 輸出腳位設定

目的:
C語言轉換成MIPS R3000組合語言轉換成機器碼後放置在MIPS R3000內,如何檢查C語言執行結果與MIPS R3000的輸出結果相符合便成一個重要的問題

流程圖:



C語言:
#include
main(){
int aa=111,i,j,f[8][8]=
{{126,123,124,118,124,117,119,116},
{120,122,119,120,118,121,119,120},
{129,121,126,119,124,118,123,117},
{121,127,120,123,122,122,118,121},
{130,130,125,126,127,131,127,124},
{140,139,140,146,144,139,140,140},
{151,147,147,150,150,150,150,152},
{159,160,158,155,155,155,155,154}};

for ( i=0;i<8;i++){
for( j=0;j<8;j++){
f[i][j]=f[i][j]-128;
aa=f[i][j]-128;
}}}

程式的目的主要是將f[8][8]的各個元素減128,宣告一個數aa目的是要將所有運算過後的元素放置在aa裡面,使得在PCSpim裡面可以較容易找出運算過後的各個元素放置在記憶體的哪個部份。
經過LCC compiler 與自動轉換程式修改部分組合語言後,使用PCspim找出aa所存放的記憶體位址,並且檢查答案是否正確。

aa=111
0x3416006f ori $22, $0, 111 ; 84: la $22,111
aa=f[i][j]-128;
0x8f180000 lw $24, 0($24) ; 114: lw $24,($24)
0x2716ff80 addiu $22, $24, -128 ; 115: subu $22,$24,128

利用C語言與組合語言對照,可發現aa所存放的位置在$22內,所以我們只要將$22傳給輸出腳位,就可以很容易的在synapitCAD模擬出來的波形圖內,觀察出答案是否與C語言執行出來的結果相符合。

IO0=regs[22];

assign IO0=regs[22];




下圖為C語言執行結果與synapitCAD執行結果對照: