2014-04-30 77 views
1

我不太瞭解VHDL,我真的不明白爲什麼我的代碼不工作。我需要一個NCO,找到一個工作程序並重新編譯以適應我的需求,但是隻注意到一個 - 但每個完整週期都有一個空白週期(http://i.imgur.com/gmYXHig.jpg)。程序採用參數(在下一個採樣之間跳轉)和時鐘作爲觸發。VHDL - 循環失敗/'空'循環問題

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.NUMERIC_STD.ALL; --try to use this library as much as possible. 

entity sinwave_new_01 is 
port (clk :in std_logic; 
    step :in integer range 0 to 1000; 
dataout : out integer range 0 to 1024 
); 
end sinwave_new_01; 

architecture Behavioral of sinwave_new_01 is 
signal i : integer range 0 to 1999:=0; 
type memory_type is array (0 to 999) of integer range 0 to 1024; 
--ROM for storing the sine values generated by MATLAB. 
signal sine : memory_type :=(long and boring array of 1000 samples here); 

begin 

process(clk) 
begin 
    --to check the rising edge of the clock signal 
if(rising_edge(clk)) then  
dataout <= sine(i); 
i <= i+ step; 
if(i > 999) then 
    i <= i-1000; 
end if; 
end if; 
end process; 

end Behavioral; 

我該如何擺脫那個零?它出現在每個完整週期 - 每個(1000 /步)脈衝。它不應該在那裏,它弄亂了我的PWM ... 從我所瞭解的整個塊(數據輸出變化,我增加,如果我> 999然後我< = 1000)執行時,有積極時鐘的邊緣應用在入口處......但看起來它需要一個額外的邊緣,idk,重新加載我?代碼是否按順序執行,或者在時鐘到達時是否全部測試條件? 我是不是在桌子外面,這就是爲什麼我在那個特定的脈搏中得到零?根據我的理解,如果聲明或VHDL是VHDL並且再次執行它的奇怪的sh.t,程序/應該/做到這一點。

我該如何解決這個錯誤?猜測我可以增加一個額外的時鐘滴答,每1k /步脈衝,但這是一個解決辦法,而不是真正的解決方案...感謝提前尋求幫助。

回答

0

看起來你的問題是你的變量'i'在你重置之前超過了999。請記住,你正在一個順序過程中。 'i'沒有得到分配的值,直到你分配它後的下一個時鐘週期。

我認爲,如果你這個代碼

i <= i + step; 
if (i > 999) then 
    i <= i-1000; 

改變

if ((i + step) > 999) then 
    i <= (i + step) - 1000; 
else 
    i <= i + step; 

你應該得到你要找的行爲。

+0

謝謝,只是測試它,現在它的工作正常:3 一直與C和UC一起工作了很長時間,我很難注意到像這樣的東西......成爲VHDL的noob也沒有幫助。 但現在它工作正常,我終於可以睡覺了:D 再次感謝 – Benji

+0

具有諷刺意味的是,如果'i'是一個變量,這將按預期工作。 「問題」出現是因爲「我」不是一個變量... –

+0

而它的...不是一個變量?畢竟,在FPGA上實現這兩種(變量和信號)都是某種物理信號,對吧?我認爲他們的工作原理是一樣的...有時VHDL只是在我頭上 – Benji

0

一件事... 是否正弦(樣品陣列)的聲明實際上是創建組合子電路(壞),或在ROM存儲器(「好」)分配這些樣本?