最近寫的...放出來分享一下...ˊˇˋa
不過這個版本是For NiosII 的Avalon Bus架構,如果要用CPLD支援外部處理器(8、16、32位元)的話可能需要修改一下主要介面模組...(不是pwmcore,core的部分已經完善-v-)
參數可能需要自己調整,並且增加一些位址、資料匯流排擴增的模組...
PWMcore的部分會獨立運轉(自成一個狀態控制器),免軟體介入,程式只需負責寫入除頻值和工作週期百分比(需要軟體小driver支援,就是把頻率和DutyCycle拆成兩個變數寫入啦...˙w˙)
我沒有加上註解,因為這程式不算大,各位有點C語言底子應該就看得懂8成了...要改的話最好有點HDL的基礎(我也是最近才學Verilog啦_A_")
這玩意我爆乾熬夜寫得很辛苦,希望各位拿去後自己用就好了....別拿去賣或做商品阿..ˊ3ˊ(出甚麼包我不負責喔xDD)
這個授權是Open給這個論壇的大大們,而且是有常發文的大大才看的到嘿(希望藉此刺激一下人氣...希望啦..-w-")...ˊ
寫入範例:
參數: 位址匯流排寬=16,資料匯流排寬=32,時脈可自訂(要寫到程式裡當除頻基準值),PWM個數=8、PWM狀態輸出寬度=16(Debug用)
IOWR(AVALON_SLAVE_PWM_CORES_INST_BASE,(0x4000),1); ///位址0x4000=Reset計數器暫存器,資料隨意(位址=狀態機切換,格式=8'b01xxxxxx) IOWR(AVALON_SLAVE_PWM_CORES_INST_BASE,(0x8000),0xff); ///位址=0x8000=資料區段=開啟或遮罩PWM通道的輸出(資料寬度最高32bit,超過要自行加上),位址區段0x8000~0xffff=選擇第0x0000~0x7fff的通道(0x8000為辨識用位址,讓狀態機切換狀態用)
IOWR(AVALON_SLAVE_PWM_CORES_INST_BASE,(0x0000),j); ///對第0個通道的第0暫存器(低態端)寫入工作週期(32bit=0x00000000~0xffffffff) IOWR(AVALON_SLAVE_PWM_CORES_INST_BASE,(0x2000),0x1000-j); ///對第0個通道的第1暫存器(高態端)寫入工作週期(32bit=0x00000000~0xffffffff)
(0x0000和0x2000可自行增加offset選擇0~131071(0x001fff))
公式:
設主頻率=10Mhz,要跑出100hz,Hi Dutycycle=10%的Pulse
高態端=(10Mhz/100hz)*(double)10/100;
低態端=(10Mhz/100hz)-算出來高態端的數值(不可為負數或大於主頻率的除頻值);
那麼...各位加油吧ˊ3ˊ/(拖
------------修改紀錄------------
權限改成10...有註冊的應該就能看了...(搞錯數值阿哈哈")
[ 本帖最後由 omegaCD 於 2007-10-11 21:14 編輯 ] |