VHDL代码合成错误
我写了一个VHDL代码,实现了PWM控制器的功能。我已经成功地模拟了它,结果如预期的那样。我还检查了合成的语法,但没有显示任何错误。当我使用XILINX ISE 12.4合成它时,它没有合成,错误状态为 错误:Xst:827-第67行:无法合成信号tmp_PC,同步描述错误。当前软件版本不支持用于描述同步元素(寄存器、内存等)的描述样式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:输出标准逻
——库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;