線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2583
推到 Plurk!
推到 Facebook!

vhdl 在寫pwm出現一點點的小bug

答題得分者是:addn
sn903209
初階會員


發表:53
回覆:86
積分:32
註冊:2005-03-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-01 22:54:39 IP:61.229.xxx.xxx 未訂閱
最近小弟正在用vhdl做一個pwm產生器,不過不知道為什麼當位元數一變多的時後就會產生小小的bug 煩請大大幫小弟解惑。謝謝大大 以下紅色這是產生bug的地方     以下是vhdl的程式
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_ARITH.all;
use ieee.std_logic_unsigned.all;
entity  p10bit_t  is
port (clk,CLK_1: in std_logic;
      con: in std_logic_vector(9 downto 0 );
      q  : out std_logic);
end p10bit_t  ;
architecture a of  p10bit_t  is 
signal b:std_logic_vector(9 downto 0);
signal c,m,qq,d:std_logic;
begin
-------------pwm之下數計器-----------
process(clk)
       begin
                 if clk'event and clk='1'  then
                  b<= b-1;
        end if ;
end process;
--------------------當控制為1111111111時,必免計數器為0時的錯誤--------
c<='1' when con > b else '0' ;
m<='1' when con = "1111111111" else '0' ;
qq<= c or m;
---------------d型正反器,可濾掉小部分的雜訊------------------
process(clk_1)
       begin
if clk_1'event and clk_1='1' then
d<=qq;
end if ;
end process;
q<=  d;
end a;

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-02 16:34:38 IP:61.70.xxx.xxx 未訂閱
請問在未加D型正反器時,會有很多雜訊嗎? c<='1' when con > b else '0' ; m<='1' when con = "1111111111" else '0' ; qq<= c or m; 這一段直接改為這樣試試吧: c<='0' when b > con else '1' ; P.S:一般消除雜訊會用延遲電路去消除.
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
sn903209
初階會員


發表:53
回覆:86
積分:32
註冊:2005-03-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-02 19:18:44 IP:218.169.xxx.xxx 未訂閱
㊣大大,還是不行耶,我指的雜訊是他會莫名奇妙的跑出來high訊號,可是看計數器明明就是比控制端還要大,照理來說應該為low的訊號,會莫明奇妙,不解=  =   ,  至於那個d型確是可以解決一小部分的這個問題,不過當不正常的high大於一個clk時,確又產生這個bug現象 不過算過pwm 輸出總high 電位和控制端是一樣的 =  =  不過有這奇怪的現象還是不太行 我有改過大大的提議,結果確是有二個這個不正常的訊號會跑出來=.= 如下圖,又多了一個怪訊號出來=.=    
sn903209
初階會員


發表:53
回覆:86
積分:32
註冊:2005-03-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-02 19:26:43 IP:218.169.xxx.xxx 未訂閱
補統一點 =   = 最邪門的地方在於  當大於1000000000的時後,才會有這個bug 小於等於1000000000的時後確是一切正常=   =  下圖為正常的pwm輸出

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-02 19:56:18 IP:61.70.xxx.xxx 未訂閱
這樣吧,你不要加延遲電路,並把D型正反器部分直接拿掉. PWM直接由q或c輸出.如果仍然有雜訊,請把模擬的其他訊號接上 並po上來請大家幫你看看吧!(程式中的q,d,qq,c...等) PWM電路我寫過,但並無加過任何正反器或降低雜訊的電路.也都ok.
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
sn903209
初階會員


發表:53
回覆:86
積分:32
註冊:2005-03-27

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-02 20:58:57 IP:218.169.xxx.xxx 未訂閱
大大,我現在只是想要做一個pwm控制器而已  所以並沒有其他的訊號了。 我做了一個比較圖,在於有沒有d型正反器的比較,我也不知道為什麼會有雜訊跑出來 ,百思不解   因為看那雜訊的計數器,違反判斷的輸出 ,這個bug我想了很久還是不會,所以才希望大大能幫我想想看 以下是有無正反器的模擬結果。

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-05-02 22:20:03 IP:61.70.xxx.xxx 未訂閱
你將b改為unsigned(9 downto 0) 試試看吧!!
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
sn903209
初階會員


發表:53
回覆:86
積分:32
註冊:2005-03-27

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-05-02 23:23:23 IP:218.169.xxx.xxx 未訂閱
改了之後,他會顯示c<='1' when con>b else '0' ; 這行是錯的 = = 還是因為一個是標準邏輯,一個是unsigned,無法判斷? 可是小弟不太會用unsigned ,不知道那裡還需要修正, 謝謝大大指點
s831019
一般會員


發表:0
回覆:3
積分:0
註冊:2005-05-02

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-05-03 10:26:17 IP:61.222.xxx.xxx 未訂閱
我是剛註冊的新會員,跟大家拜個碼頭... 看你這圖形,應該是用MaxPlusII 我通常是用verilog,VHDL不是很熟, 如果是語法上引用錯誤造成,我也不懂, 所以假設你的語法沒問題, 想問一下你模擬的時候系統頻率clk用的是多少? 你用了 " > " 這個語法,合成時會變減法器, delay會比較大,建議你將clk變慢再試試看, 祝好運囉....
addn
高階會員


發表:64
回覆:221
積分:202
註冊:2005-03-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-05-03 10:47:04 IP:218.171.xxx.xxx 未訂閱
你的電路看起來有包含順序邏輯和組合邏輯兩部分 順序邏輯下數記數器會在clk正緣轉態,轉態瞬間 會出現不穩定的狀態數值 而組合邏輯比較器部分,若不穩定狀態值出現con > b 自然會出現雜波現像輸出 若你的應用是在控制馬達或LED等這些雜波可以不用管他 還是可以正常工作的 如果要消除這些雜波可以試試在clk負緣時將qq指定給d process(clk) begin if clk'event and clk='0' then d<=qq; end if ; end process; q<=d; 在組合邏輯或組合邏輯順序邏輯混和的電路上 要特別注意glitch現象
sn903209
初階會員


發表:53
回覆:86
積分:32
註冊:2005-03-27

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-05-03 19:51:51 IP:218.169.xxx.xxx 未訂閱
我將addn大大的做法改過一次了,不過有debug一點 ,現在變成在大於1110000000的時後會bug (本來是大於1000000000) 不知道是不是我有改錯 以下是我的code  
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_ARITH.all;
use ieee.std_logic_unsigned.all;
entity  p10bit_t  is
port (clk,CLK_1: in std_logic;
      con: in std_logic_vector(9 downto 0 );
      q  : out std_logic);
end p10bit_t  ;
architecture a of  p10bit_t  is 
signal b,bb:std_logic_vector(9 downto 0);
signal c,m,qq,d,dd,ddd:std_logic;
begin
process(clk)
       begin
                 if clk'event and clk='1'  then
                  b<= b-1;
        end if ;
end process;
----------新增加的負緣觸發-----------
process(clk)
begin
if clk'event and clk='0' then
bb<=b;
end if ;
end process;
c<='1' when con > bb else '0' ;
m<='1' when con = "1111111111" else '0' ;
qq<= c or m;
process(clk_1)
       begin
if clk_1'event and clk_1='1' then
d<=qq;
end if ;
end process;
q<=  d;
end a;    
這次這次的圖 給s831019 大大,我用的大概120Mhz 的clk,因為我需用到高頻,因為以後要用到音頻上面, 所以這個bug我覺得應該有點影響才是,我有試過把d形的速度放慢至cld的1/4倍時,到是可以成功的debug 可是這樣好像我一個step要4我的pwm才會有動作,好像就是覺得怪怪 的 感謝各位大大抽空幫我想問題,小弟感謝萬分
addn
高階會員


發表:64
回覆:221
積分:202
註冊:2005-03-21

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-05-03 20:15:32 IP:218.171.xxx.xxx 未訂閱
請問你的要求會用到2個clk嗎 以下是我修改程式如下,將clk1取消只用一個clk 我這邊測試ok你可以在試試 LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; entity test3 is port (clk: in std_logic; con: in std_logic_vector(9 downto 0 ); test:out std_logic_vector(9 downto 0 ); q : out std_logic); end test3; architecture a of test3 is signal b:std_logic_vector(9 downto 0); signal c,m,qq,d:std_logic; begin test<=b; process(clk) begin if clk'event and clk='1' then b<= b-1; end if ; end process; c<='1' when con > b else '0' ; m<='1' when con = "1111111111" else '0' ; qq<= c or m; process(clk) begin if clk'event and clk='0' then d<=qq; end if ; end process; q<=d; end a;
addn
高階會員


發表:64
回覆:221
積分:202
註冊:2005-03-21

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-05-03 21:17:01 IP:218.171.xxx.xxx 未訂閱
拍謝忘記加縮排    重貼程式碼    
ShowMessage("
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;    entity  test3  is
port (clk,CLK_1: in std_logic;
      con: in std_logic_vector(9 downto 0 );
      
      q  : out std_logic);
end test3;
architecture a of  test3  is     signal b:std_logic_vector(9 downto 0);
signal c,m,qq,d:std_logic;
begin    process(clk)
       begin
                 if clk'event and clk='1'  then
                  b<= b-1;
        end if ;
end process;    c<='1' when con > b else '0' ;
m<='1' when con = "1111111111" else '0' ;
qq<= c or m;    process(clk)
       begin
        if clk'event and clk='0' then
          d<=qq;
        end if ;
end process;    q<=d;        end a;    ");
sn903209
初階會員


發表:53
回覆:86
積分:32
註冊:2005-03-27

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-05-03 21:21:43 IP:218.169.xxx.xxx 未訂閱
我拿大大的測試,還是有點問題 一樣在 大於1110000000 的時後 會有問題 我的另外那個clk是一個d型正反器,用途在於濾波,之前有點效果,所以就用上去了,像大大這樣不用d型就可以和我寫得那一樣,不過還是會有問題 仍然不解中 不過還是謝謝大大
addn
高階會員


發表:64
回覆:221
積分:202
註冊:2005-03-21

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-05-03 21:46:16 IP:218.171.xxx.xxx 未訂閱
請再確認一下程式 process(clk) begin if clk'event and clk='0' then d<=qq; end if ; end process; q<=d; 部分是用clk負緣觸發 (clk'event and clk='0')
sn903209
初階會員


發表:53
回覆:86
積分:32
註冊:2005-03-27

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-05-03 21:55:56 IP:218.169.xxx.xxx 未訂閱
我拿我的程式改了一次 ,也直接買大大的程式貼上ㄑ測試 得到的結果還是 順便問一下,我用的是MAX+plus II 10.1 BASELINE 版的,不知道是不是這個關系? 感謝大大不耐煩的指導
s831019
一般會員


發表:0
回覆:3
積分:0
註冊:2005-05-02

發送簡訊給我
#17 引用回覆 回覆 發表時間:2005-05-04 10:34:52 IP:61.222.xxx.xxx 未訂閱
你的clk跑在120MHz算是很快了 MAX Plus II 的元件都是比較慢的(相對於QuartusII而言) 建議你先從系統上考量是否真的需要跑到120MHz 這麼快將來還會有別的問題產生 如果一定要跑這麼快 換個寫法吧 拿掉 " > " 這個語法    將 c<='1' when con > b else '0' ; 換成
process(clk)
begin
  if (clk'event and clk='1') then
         if (b='0000000') then
             c <= '0';
         elsif (b=con) then
             c <= '1';
         else
             c <= c;
         end if;
  end if;
end process;
(PS : VHDL我不熟,語法請自行檢查) clk先用慢速跑,確定沒問題,在跑快的吧!! good luck !! 發表人 - s831019 於 2005/05/04 10:43:50
sn903209
初階會員


發表:53
回覆:86
積分:32
註冊:2005-03-27

發送簡訊給我
#18 引用回覆 回覆 發表時間:2005-05-04 23:04:02 IP:61.229.xxx.xxx 未訂閱
感謝s831019大大,十分感謝 不過我不懂">" 這個語法有什麼樣的問題 可以順便請問大大QuartusII的晶片最快可以達到什麼樣的速度,那QuartusII的使用程式和max plusⅡ有什麼樣的不同嗎? 因為我去altera的網站,我找不到他的晶片比較(只有一些比較功能),不知道大大能不能順便指導小弟一下 還有addn所說的glitch現象,請問我該去那裡取得這類的書籍或是資料 最後感謝每位大大費心幫小弟解決,小弟感激萬分
x8051
一般會員


發表:12
回覆:18
積分:6
註冊:2004-04-15

發送簡訊給我
#19 引用回覆 回覆 發表時間:2005-05-05 00:35:06 IP:59.113.xxx.xxx 未訂閱
------------------------------------------------------- process(clk) begin if clk'event and clk='1' then b<= b-1; end if ; end process; --------------------------------------------------- c<='1' when con > b else '0' ; --???? 這段程式放在這裡 m<='1' when con = "1111111111" else '0' ; --???? 有點怪怪的? qq<= c or m; --???? --------------------------------------------------- process(clk) begin if clk'event and clk='0' then d<=qq; end if ; end process; ---------------------------------------------------------- process(clk) begin if (clk'event and clk='1') then if (b='0000000') then c <= '0'; elsif (b=con) c <= '1'; end if; end if; end process; c <= 'c' 有需要加入這行嗎? 發表人 - x8051 於 2005/05/05 00:39:51
s831019
一般會員


發表:0
回覆:3
積分:0
註冊:2005-05-02

發送簡訊給我
#20 引用回覆 回覆 發表時間:2005-05-05 08:59:04 IP:61.222.xxx.xxx 未訂閱
你用的是altera的FPGA, 以10K為例,FPGA上的編號10Kxxxxxxx-2, 最後的-2表示每個logic cell的delay time 是2ns, 而FPGA可以跑多快,取決於一個D-flipflop到下一個D-flipflop 之間要經過多少個logic cell,logic cell越多速度當然越慢, 這和tool沒什麼關係,是製程上就決定了, 只不過QuartusII支援的FPGA比較多比較新, 至於可以跑多快我也不是很了解,設計的方法影響也很大; 另外就是" > "這個語法並沒有問題, 只是" > "會合成10-bit的減法器, 減法器的logic cell比較多,跑不快, 所以才建議你換個寫法...
sn903209
初階會員


發表:53
回覆:86
積分:32
註冊:2005-03-27

發送簡訊給我
#21 引用回覆 回覆 發表時間:2005-05-05 15:19:56 IP:61.229.xxx.xxx 未訂閱
謝謝大大的指導,小弟受益良多
系統時間:2024-05-05 7:37:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!