2008年1月7日 星期一

0107 PDP8混何模式乘法機

所使用到的程式有:
ch4 的clock.v 與 archdev.v
ch8的 ch8pdpm.v 與 divpdp.v

在修改為乘法機程式時,必須先將除法機程式修改到可以正確的執行
步驟如下:
一. 將ch8pdpm.v內的`include "\4700\clock.v"、`include "archdev8.v"、`include "divpdp.v"刪掉,將archdev.v改成archdev8.v
二. 將divpdp.v的內容修改過後將部份程式放在top與mem內






三.修改pdp8_control 的內容值


四. 從mem內將r1與r2的放置在記憶體的內容值抓出來。
五. 修改divpdp8.v的內容值如下圖。


即可執行pdp8除法機程式,乘法機只要將作業六乘法機程式的機器碼放到mem內即可。

2007年12月25日 星期二

1225 PDP8 乘法器

先使用C語言寫乘法器程式碼如下:



執行結果:



將撰寫好的組合語言直接放置在記憶體內:

m[0] = 12'o7300;
m[1] = 12'o1037;
m[2] = 12'o2222;
m[3] = 12'o7200;
m[4] = 12'o1100;
m[5] = 12'o3100;
m[6] = 12'o2222;
m[7] = 12'o1101;
m[8] = 12'o3101;
m[9] = 12'o2222;
m[10] = 12'o1102;
m[11] = 12'o3102;
m[12] = 12'o1100;
m[13] = 12'o3036;
m[14] = 12'o3037;
m[15] = 12'o3040;
m[16] = 12'o7200;
m[17] = 12'o7100;
m[18] = 12'o1102;
m[19] = 12'o7040;
m[20] = 12'o7020;
m[21] = 12'o7001;
m[22] = 12'o1036;
m[23] = 12'o7430;
m[24] = 12'o7402;
m[25] = 12'o3036;
m[26] = 12'o1037;
m[27] = 12'o1101;
m[28] = 12'o3037;
m[29] = 12'o5020;
m[30] = 12'o0000;
m[31] = 12'o0000;
m[64] = 12'o0007;
m[65] = 12'o0003;
m[66] = 12'o0001;

執行結果:
Running...
0001/xxxx
TAD 0003/1037
0003/2222
CLA 0005/7200
DCA 0007/3100
0007/2222
TAD 0011/1101
0012/2222
0013/2222
DCA 0015/3102
DCA 0017/3036
DCA 0021/3040
CLL 0023/7100
CMA 0025/7040
IAC 0027/7001
SZL 0031/7430
DCA 0033/3036
TAD 0035/1101
JMP 0021/5020
CLL 0023/7100
CMA 0025/7040
IAC 0027/7001
SZL 0031/7430
DCA 0033/3036
TAD 0035/1101
JMP 0021/5020
CLL 0023/7100
CMA 0025/7040
IAC 0027/7001
SZL 0031/7430
DCA 0033/3036
TAD 0035/1101
JMP 0021/5020
CLL 0023/7100
CMA 0025/7040
IAC 0027/7001
SZL 0031/7430
DCA 0033/3036
TAD 0035/1101
JMP 0021/5020
CLL 0023/7100
CMA 0025/7040
IAC 0027/7001
SZL 0031/7430
DCA 0033/3036
TAD 0035/1101
JMP 0021/5020
CLL 0023/7100
CMA 0025/7040
IAC 0027/7001
SZL 0031/7430
DCA 0033/3036
TAD 0035/1101
JMP 0021/5020
CLL 0023/7100
CMA 0025/7040
IAC 0027/7001
SZL 0031/7430
DCA 0033/3036
TAD 0035/1101
JMP 0021/5020
CLL 0023/7100
CMA 0025/7040
IAC 0027/7001
SZL 0031/7430
OK x= 7 , y= 3 x*y= 21


執行結果波形圖:

2007年12月10日 星期一

1210 乘法器行為層



修改過後的程式碼
always
begin
@(posedge sysclk) enter_new_state(`IDLE);
r1 <= @(posedge sysclk) 0;
r2 <= @(posedge sysclk) x;
ready = 1;
if (pb)
begin
while (r2 >= 1 pb)
begin
@(posedge sysclk) enter_new_state(`COMPUTE);
r1 <= @(posedge sysclk) r1 + y;
r2 <= @(posedge sysclk) r2 - 1;
r3 <= @(posedge sysclk) r1;
end
end
end




2007年11月25日 星期日

1125 輸入一個數n計算出n! 使用結構化

架構與混何模式相同


根據混何模式的ASM圖與架構推導出真值表



根據真值表推導出各個訊號的方程式



執行結果與波形圖




1120 輸入一個數N 計算出N! 混何模式

根據N!所需要使用到的功能與暫存器推導出架構圖,如下圖



根據行為層的動作所推導出來的asm圖

由架構圖與ASM圖可以推導出CU在各個狀態輸出的控制線。

IDEL狀態下:
ready=1; //READY
clrr3=0; //r3çx
ldr3=1;
muxctr4=1; // r4çx
ldr4=1;
aluctrl=6'b001110; //PASS

COMPUTE_1狀態下:
muxctr5=1; //多工器輸出r3bus
ldr5=1; //r5çr3
clrr5=0;
ldr4=0;

COMPUTE_2狀態下:
ldr5=0;
contr3=1; //r3çr3-1
ldr3=0;

COMPUTE_3狀態下:
ldr2=1; //r2çr4
contr3=0;

COMPUTE_4 狀態下:
ldr2=0;
aluctrl=6'b001110; //ALU作輸出0的動作
ldr6=1; //r6ç0

COMPUTE_5狀態下:
ldr6=0; //r6暫存器停止讀入

COMPUTE_6狀態下:
contr5=1; //r5çr5-1
ldr5=0;
muxctr6=0; //多工器輸出r6bus
aluctrl=6'b100100; //ALU做加法動作
ldr6=1; //r6çr6+r2

COMPUTE_7狀態下:
contr5=0;
aluctrl=6'b101010;
muxctr4=0; //多工器輸出r6bus
ldr4=1; //r4çr6

根據架構所修改過後的程式碼:
mux2 #12 mux_r3(x,r3bus,muxctr3,muxctr3_bus);     
counter_register # 12 r3(muxctr3_bus,r3bus,,ldr3,contr3,clrr3,sysclk);
comparator #12 cmp_r3(r3lty,,,r3bus,12'b1);
not inv_r3(r3gey,r3lty);

mux2 #12 mux_r5(r5bus,r3bus,muxctr5,muxctr5_bus);
counter_register #12 r5(muxctr5_bus,r5bus,,ldr5,contr5,clrr5,sysclk);
comparator #12 cmp_r5(r5lty,,,r5bus,12'b1);
not inv_r5(r5gey,r5lty);

mux2 #12 mux_r6(r6bus,12'b0,muxctr6,muxctr6_bus);
alu181 #12 alu(muxctr6_bus,r2bus,aluctrl[5:2],aluctrl[1],aluctrl[0],,alubus,);
enabled_register #12 r6(alubus,r6bus,ldr6,sysclk);
mux2 #12 mux_r4(r6bus,x,muxctr4,muxctr4_bus);
enabled_register #12 r4(muxctr4_bus,r4bus,ldr4,sysclk);
enabled_register #12 r2(r4bus,r2bus,ldr2,sysclk);

簡化後的asm圖





執行結果與波形圖


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;

經過執行後的結果

2007/10/30 除法機改乘法機結構化

將之前的混合模式改成存結構化,由之前的ASM圖可推導出下面的真值表



經由卡諾圖求出各個輸出的方程式



以下為修改過後的程式碼


always @(present_state or r1gey or pb)
begin
next_state = ~present_state&pbpresent_state&(r1geypb);
ldr1 = 1;
clrr2 = 0;
incr2 = present_state;
ldr3 = present_state;
r2k = ~present_state;
aluctrl[5] = 1;
aluctrl[4] = 0;
aluctrl[3] =~present_state;
aluctrl[2] = present_state;
aluctrl[1] = ~present_state;
aluctrl[0] =0;
ready = ~present_state;
end

下圖為執行後的結果