Robofun 機器人論壇

標題: FPGA或CPLD用的多通道PWM控制器IP(Verilog) [打印本頁]

作者: omegaCD    時間: 2007-10-11 20:42
標題: FPGA或CPLD用的多通道PWM控制器IP(Verilog)
最近寫的...放出來分享一下...ˊˇˋ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 編輯 ]

avalon_pwm_module_v2.51_completed.rar

1.34 KB, 閱讀權限: 10, 下載次數: 102


作者: neo    時間: 2007-10-11 21:01
版主大大您好喔,
      閱讀權限: 25,      不能下載喔,是否跟權限有關呢??
作者: irobot    時間: 2007-10-11 21:53
感謝大大啊! 雖然還不會用。
作者: pcedison    時間: 2007-10-11 22:01
感謝分享   雖然已經有段時間沒使用CPLD和FPGA了

不過這個東西應該相當不錯    再次感謝你的分享囉!
作者: neo    時間: 2007-10-11 22:51
版主大大您好喔,

       請問是用什麼編輯器來編譯的呢??是Quartus II  or MAX+PLUS II ???晶片是什麼型號呢??

只會這些而已 ,感謝您喔。

[ 本帖最後由 neo 於 2007-10-11 22:53 編輯 ]
作者: omegaCD    時間: 2007-10-12 00:32
我用Quartus II編譯,應該Web版就可以了.... 不過果要弄外加處理器的話必須注意匯流排寬度是否對....我的Verilog有參數可以更改...
位址定址的話可能要透過外加Latch或是寫一個轉譯模組讓MCU和這個模組的各位址寬度一致,或是調整參數把解析度降低亦可(4294967296段變成256段:32Bit變8Bit)...

晶片嘛....我比較推薦用FPGA做....CPLD的閘數普遍都不夠...很難實現這裡面的功能...=~="
我是用Cyclone系列和Startix系列做的...˙v˙+

[ 本帖最後由 omegaCD 於 2007-10-12 13:47 編輯 ]
作者: wallace_tsou    時間: 2007-10-12 09:12
您的PWM是用模組繼承的方式來複製為多組。可以用在不同的除頻率上。或許是您的應用上有許多不同頻率要用。我想一般是同一個頻率會有數個輸出,只需設定比較器,這樣也比較省一點Gate count。另外有一個很奇怪的東西,為何Write signal reset在定時去設定?
作者: omegaCD    時間: 2007-10-12 12:29
原帖由 wallace_tsou 於 2007-10-12 09:12 發表
您的PWM是用模組繼承的方式來複製為多組。可以用在不同的除頻率上。或許是您的應用上有許多不同頻率要用。我想一般是同一個頻率會有數個輸出,只需設定比較器,這樣也比較省一點Gate count。另外有一個很奇怪的 ...

是可以省Gatecount,不過如果驅動用的設備所需的PWM頻率不同就麻煩了....=v="
加上這個還是剛從Prototype進入正式版所以也不知哪裡有BUG所以來是保留一些東西...
那個PWM Status是輸出到一組LED上,為了要看是否有寫入信號我特地將其延遲一段時間再關閉...(如果寫入頻率高就恆亮)
正式應用時這個指示燈可以拿掉...因為不是很重要...:3

-----------------------
我在應用這個模組時主頻是跑100Mhz,輸出的頻率相位還蠻穩定的,變更頻率和工作週期時的反應也很快...適合做高速切換PWM頻率週期的應用...:)
-----------------------
剛才試著寫了定頻版...還是用掉將近900個LEs...
不過counter精簡了許多是真的...-w-*
-----------------------
可變頻率版的動態雜訊產生器(真的很亂xDDDD)
不過LED亮的感覺有點像神經信號那樣?(類比度很高...˙˙)



<<觸發時間調高後....好漂亮的脈衝雜訊...0v0

[ 本帖最後由 omegaCD 於 2007-10-12 15:02 編輯 ]




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2