VHDL代码合成错误

VHDL代码合成错误,vhdl,hdl,synthesis,Vhdl,Hdl,Synthesis,我写了一个VHDL代码,实现了PWM控制器的功能。我已经成功地模拟了它,结果如预期的那样。我还检查了合成的语法,但没有显示任何错误。当我使用XILINX ISE 12.4合成它时,它没有合成,错误状态为 错误:Xst:827-第67行:无法合成信号tmp_PC,同步描述错误。当前软件版本不支持用于描述同步元素(寄存器、内存等)的描述样式 ——库UNISIM; --使用UNISIM.VComponents.all; 实体控制器是 港口( CLK:标准逻辑中; VOUT:标准逻辑; M1:输出标准逻

我写了一个VHDL代码,实现了PWM控制器的功能。我已经成功地模拟了它,结果如预期的那样。我还检查了合成的语法,但没有显示任何错误。当我使用XILINX ISE 12.4合成它时,它没有合成,错误状态为

错误:Xst:827-第67行:无法合成信号tmp_PC,同步描述错误。当前软件版本不支持用于描述同步元素(寄存器、内存等)的描述样式

——库UNISIM;
--使用UNISIM.VComponents.all;
实体控制器是
港口(
CLK:标准逻辑中;
VOUT:标准逻辑;
M1:输出标准逻辑:='0';
M2:输出标准逻辑:='0'
);
终端控制器;
行为控制器的体系结构是
信号VREF:STD_逻辑_向量(7到0):=“01000000”;
信号V_ERR:STD_逻辑向量(7到0):=“00000000”;
信号PWM:STD_逻辑_矢量(7到0):=“00000000”;
信号PWM_新:标准逻辑_矢量(7到0):=“00000000”;
信号计数:标准逻辑向量(7到0):=“00000000”;
信号计数2:STD_逻辑_向量(7到0):=“00000000”;
信号TEMP1:STD_逻辑_向量(7到0):=“00000000”;
信号TEMP2:STD_逻辑_向量(7到0):=“00000000”;
信号TEMP3:STD_逻辑_向量(7到0):=“00000000”;
信号反馈:标准逻辑向量(7到0):=“00000000”;
信号寄存器:标准逻辑向量(7到0):=“00000000”;
信号PWM_计数:标准逻辑_矢量(7到0):=“10000000”;
开始
过程(CLK)
开始

IF(上升沿(CLK)和COUNT2要被合成工具识别,您的流程必须有一个单个
IF上升沿(CLK)


调整代码应该很容易,除了带有
reg的块看起来可以完成同步编码之外

process(clk)
begin
    -- put your asyncron code here if needed
    if(rising_edge(clk)) then
      if(reset = '1') then
      -- if you like to implement a synchron reset
      else
      -- all your synchron code e.g.

         if (COUNT2 >= "10000000") then
            COUNT <= COUNT+'1';
         end if;

         if (COUNT > ("00000100"+PWM_NEW)) AND (COUNT < "10000000") then
            M1 <= '0';
            M2 <= '1';
         end if;
         .
         .
         .

      end if;
   end if;
   -- put your asyncron code here if needed
end process;
有标准化的

为了让它更清楚一点,你可以用十六进制写

if (COUNT2 >= x"80") then -- 80 hex = 124 dec
   COUNT <= COUNT+'1';
end if;
如果(COUNT2>=x“80”),则--80十六进制=124十进制
计数“0”);--与“000000000”相同,但看起来更好
如果(COUNT2>=128),则
计数(“00000100”+PWM_新))和(计数<“10000000”),然后
M1
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.NUMERIC_STD.all;
if (COUNT2 >= x"80") then -- 80 hex = 124 dec
   COUNT <= COUNT+'1';
end if;
SIGNAL COUNT:       unsigned (7 DOWNTO 0) := (others => '0'); -- same as "000000000" but looks better

if (COUNT2 >= 128) then
   COUNT <= COUNT + '1';
end if;
if (COUNT > ("00000100"+PWM_NEW)) AND (COUNT < "10000000") then
   M1 <= '0';
   M2 <= '1';
end if;
 if (COUNT > (unsigned(PWM_NEW) + 4)) AND (COUNT < 128) then
    M1 <= '0';
    M2 <= '1';
 end if;