2013-07-09 21 views
0

我试图用VHDL(Xilinx ISE + ISim)中的Spartan 3e板卡生成皮秒PWM信号。VHDL-PWM奇怪的行为和物理上限/下限

library ieee; 
use ieee.std_logic_1164.all; 

entity pwm is 
    port(clk  : in  std_logic; 
     pwm_out : buffer std_logic); 
end entity; 

architecture rtl of pwm is 
begin 
    process (clk) 
    variable count  : integer range 0 to 50000; 
    variable duty_cycle : integer range 0 to 50000; 
    variable flag  : integer range 0 to 1; 
    begin 
    if (rising_edge(clk)) then 
     count := count+1; 
     if (count = duty_cycle) then 
     pwm_out <= '1'; 
     end if; 
     if (count = 50000) then 
     pwm_out <= '0'; 
     count := 0; 
     if(flag = 0) then 
      duty_cycle := duty_cycle+50; 
     else 
      duty_cycle := duty_cycle-50; 
     end if; 
     if(duty_cycle = 50000) then 
      flag := 1; 
     elsif(duty_cycle = 0) then 
      flag := 0; 
     end if; 
     end if; 
    end if; 
    end process; 
end rtl; 

我使用全球时钟(C9)的嵌入式50Mhz,但仿真显示了一个奇怪的行为;从0ps到1000000ps,clk(时钟)和pwm_out(输出)似乎始终处于高电平状态,并且在ISim下的时域中的clk和pwm_out都没有1000000ps后。

我想要做的是调查和解决这种行为,然后增加输出频率(pwm_out)。另外,我想了解有多快(上升/下降时间和频率)可以产生脉冲(物理限制)。

我希望有经验的用户提供一些指导。

+0

我想我发现了这个问题,在仿真中没有从C9提供的时钟,因此clk的状态总是相同的。仍在寻找增加频率的方法。 – y33t

回答

0

pwm_out输出没有初始值,因此它必须在过程中分配,然后才能得到一个定义良好的值。但是过程变量(保持过程状态)都有一个初始值为零,并且由于计数在过程循环中第一件事增加,count在开始时不等于duty_cycle(为0)。因此,pwm_out不会被分配,直到它等于50000(500 MHz时钟)发生在50000/50 MHz = 1 ms时。然而,如果你综合并在FPGA中运行它,你可能会遇到一些意外的行为,这取决于你的时钟源和控制。例如,如果pwm模块从FPGA载入时不稳定的时钟运行,例如内部PLL时钟,则初始时钟行为可能不符合应用于设计的时序约束,并且任何值可能会以例如duty_cycle变量(寄存器)结束。但是,设计基于duty_cycle寄存器的值为(50 * n)的假设,否则由于与0和50000相等的比较(=),所以不会像预期的那样增加和减少。因此,如果由于最初的“无效”时钟导致初始时序违规,duty_cycle的值为1,因此标志变量(状态)将无法按预期运行,依此类推。一种修正这种情况的方法是添加一个复位输入并将其应用于变量状态,直至时钟稳定,或使用不等式运算符进行比较。