VHDL-PWM怪异行为和物理上限/下限

VHDL-PWM怪异行为和物理上限/下限,vhdl,fpga,xilinx,pwm,Vhdl,Fpga,Xilinx,Pwm,我试图用VHDL(Xilinx ISE+ISim)中的Spartan 3e板生成皮秒PWM信号 ieee库; 使用ieee.std_logic_1164.all; 实体pwm是 端口(时钟:在标准逻辑中; pwm输出:缓冲器标准输出逻辑); 终端实体; 介绍了pwm的rtl结构 开始 过程(clk) 变量计数:0到50000的整数范围; 可变占空比:整数范围0至50000; 变量标志:0到1的整数范围; 开始 如果(上升沿(clk)),则 计数:=计数+1; 如果(计数=占空比),则 pwm_o

我试图用VHDL(Xilinx ISE+ISim)中的Spartan 3e板生成皮秒PWM信号

ieee库;
使用ieee.std_logic_1164.all;
实体pwm是
端口(时钟:在标准逻辑中;
pwm输出:缓冲器标准输出逻辑);
终端实体;
介绍了pwm的rtl结构
开始
过程(clk)
变量计数:0到50000的整数范围;
可变占空比:整数范围0至50000;
变量标志:0到1的整数范围;
开始
如果(上升沿(clk)),则
计数:=计数+1;
如果(计数=占空比),则

pwm_outpwm_out输出没有初始值,因此必须在过程中对其进行分配,然后才能获得定义良好的值。但是过程变量(保持过程状态)的初始值都为零,并且由于count在过程循环中首先递增,因此count在开始时将不等于占空比(为0)。因此,直到它等于50000时才分配pwm_out,这(使用50 MHz时钟)发生在50000/50 MHz=1 ms


但是,如果您将其合成并在FPGA中运行,您可能会遇到一些意外的行为,具体取决于您的时钟源和控制。例如,如果pwm模块从加载FPGA时不稳定的时钟(例如内部PLL时钟)运行,则初始时钟行为可能不符合应用于设计的时序约束,并且任何值可能最终出现在例如占空比变量(寄存器)中。但是,该设计基于占空比寄存器的值为(50*n)的假设,否则,由于与0和50000的比较相等(=),它不会像预期的那样递增和递减。因此,如果占空比得到值1,由于初始“无效”时钟导致的初始定时违规,标志变量(状态)将无法按预期运行,以此类推。修正这一点的一种方法是添加重置输入并将其应用于变量状态,直到时钟稳定,或者使用不等式运算符进行比较。

我认为我发现了问题,在模拟中,C9没有提供时钟,因此clk的状态始终相同。仍在寻找倍增频率的方法。
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;