2007年10月30日 星期二

2007/10/30 輸入一個數n執行n!的動作

N!的基本原理:N!的動作為N*(N-1)*(N-2)...*1,以N=5為例,5!=1*5*4*3*2*1,首先先設定初始值,將mul=1、k=x=5,先判斷k是否大於0,成立則開始作mul=mul*k、k=k-1的動作,mul=mul*k主要是在乘法的動作,積會被當成下一次乘法動作的被乘數,k=k-1則是在控制乘數,每做一次乘法的動作會將乘數減一。持續回圈的動作直到K=0為止。動作如下圖:



參考先前所做過的行為層模式的乘法器,來做乘法的動作,另外再加上一個判斷指令及減法動作來做k=k-1的動作。(r3>=1 |pb)是在做判斷k是否大於0,COMPUTE_1是在做k=k-1的動作,(r5>=1)與COMPUTE_2則是我們先前的乘法器動作。下圖為根據N!的基本原理所推導出來的ASM圖。



修改過後的程式碼
r4 <= @(posedge sysclk) x;
r3 <= @(posedge sysclk) x;
ready = 1;
if (pb)
while(r3>=1)
r3 <= @(posedge sysclk) r3-1;
r5 <= @(posedge sysclk) r3;
r2 <= @(posedge sysclk) r4; //r4
r6 <= @(posedge sysclk) 0;
while (r5 >= 1)
r5 <= @(posedge sysclk) r5 -1;
r6 <= @(posedge sysclk) r2 + r6;
r4 <= @(posedge sysclk) r6;

經過執行後的結果

沒有留言: