2011-06-02 86 views
4
library IEEE; 
use IEEE.MATH_REAL.ALL; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.STD_LOGIC_ARITH.ALL; 
use IEEE.NUMERIC_STD.ALL; 

entity SineGen is 
    Port (clock    : in std_logic; 
      dac_ab_vpp  : in integer range 0 to 4095; 
      dac_cd_vpp  : in integer range 0 to 4095; 
      sine_dac_ab  : out std_logic_vector(11 downto 0); 
      sine_dac_cd  : out std_logic_vector(11 downto 0)); 
end SineGen; 

architecture Behavioral of SineGen is 

subtype slv is std_logic_vector(11 downto 0); 


begin 

     process(clock) 
      variable count  : integer range 0 to 255 := 0; 
      variable temp_dac_ab : integer range 0 to 4095 := 0; 
      variable temp_dac_cd : integer range 0 to 4095 := 0; 

     begin 
      if rising_edge(clock) then 

我試了一切,它歸結爲下兩行使輸出始終爲零,我不明白爲什麼。它應該是一個具有正弦函數的輸出。 (count是每個週期256個採樣,n是比特數。)以下格式是否有效?我的VHDL正弦函數gen有什麼問題?

   -- A*sin (2PI/2^n * count) 
       temp_dac_ab := dac_ab_vpp * integer(round(sin(real(count * integer(math_2_pi/real(256)))))); 
       temp_dac_cd := dac_cd_vpp * integer(round(sin(real(count * integer(math_2_pi/real(256)))))); 

       if count < 256 then 
        count := count + 1; 
       else 
        count := 0; 
       end if; 

       sine_dac_ab <= conv_std_logic_vector(temp_dac_ab, slv'length); 
       sine_dac_cd <= conv_std_logic_vector(temp_dac_cd, slv'length); 

      end if; 


     end process; 
end Behavioral; 
+0

與輸出爲0無關,計數器('count')中也有錯誤:指定爲0到255的整數將始終小於256.因此,計數器將當計數器爲255時,也嘗試增加,這會導致運行時錯誤。 – 2011-06-02 21:58:53

回答

0

我與我的VHDL realllyyy生疏,但我想你想的:

temp_dac_ab := integer(round(dac_ab_vpp * sin(real(count * integer(math_2_pi/real(256)))))); 
temp_dac_cd := integer(round(dac_cd_vpp * sin(real(count * integer(math_2_pi/real(256)))))); 

(你不想圓/施放從sin來的浮動,直到你以後與dac_ab_vpp/dac_cd_vpp

3

除了通過@brianreavis什麼已經指出相乘,你不想分數math_2_pi/real(256)轉換爲整數,因爲這將永遠是0,所以:

temp_dac_ab := integer(round(dac_ab_vpp * sin(real(count) * math_2_pi/real(256)))); 
temp_dac_cd := integer(round(dac_cd_vpp * sin(real(count) * math_2_pi/real(256))));