VHDL代码中的错误

时间:2016-03-19 11:02:40

标签: vhdl fpga

我尝试根据其他帖子@Brian Drummond Answer

上的建议运行此代码
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
--use ieee.numeric_std.all;
--use ieee.float_pkg.all;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity pwm_sne is
    Generic(
        sys_clk:integer:=50000000;
        pwm_freq:integer:=100000;
        bits_resolution:integer:=8);
    Port ( clk : in  STD_LOGIC;
           rst : in  STD_LOGIC;
           k : in  STD_LOGIC_VECTOR (7 downto 0);
           y : out  std_logic);
    end pwm_sne;

architecture Behavioral of pwm_sne is
  signal cnt:std_logic_vector(7 downto 0);
  signal flag:std_logic;
  signal reg:std_logic_vector(7 downto 0);
  --variable duty:std_logic:=0;
  --constant period:integer:-(reg/256)*100;

begin
  process(clk,rst)
  begin
    if rst='1' then
      cnt<="00000000";
    elsif(clk'event and clk='1')then
      cnt<=cnt+"00000001";
    elsif cnt="11111111" then
      flag<='0';
      cnt<="00000000";
    end if;
  end process;

  --
  process(clk,flag)
  begin
    if(flag='0') then
    elsif(clk'event and clk='1') then
      reg<=k;
    end if;
  end process;

  process(cnt,reg,flag)
  begin
    if(flag='0')then
    elsif cnt>=reg then
        y<='1';
        --  y<=duty;
    --elsif cnt=reg then
    --  y<='1';
    elsif cnt<reg then
      y<='0';
      --    y<=duty;
    end if;
  end process;

end Behavioral;

在RTL原理图中发生此错误:

  

信号cnt无法合成,同步描述不良。当前软件版本不支持您用于描述同步元素(寄存器,内存等)的描述样式。

1 个答案:

答案 0 :(得分:2)

我认为你的第一个过程应该是这样的:

process(clk,rst)
begin
  if rst='1' then
    cnt<="00000000";
  elsif(clk'event and clk='1')then
    cnt<=cnt+"00000001";
    if cnt="11111111" then  -- this was "elsif"
      flag<='0';
      cnt<="00000000";      -- is this line necessary? (cnt should wrap round naturally)
      end if;               -- extra "end if;" now required
    end if;
  end process;

elsif cnt您在clk的任一边缘驾驶process(clock, async_reset) -- nothing else should go in the sensitivity list begin -- never put anything here if async_reset ='1' then -- or '0' for an active low reset -- set/reset the flip-flops here -- ie drive the signals to their initial values elsif rising_edge(clock) then -- or falling_edge(clock) or clk'event and clk='1' or clk'event and clk='0' -- put the synchronous stuff here -- ie the stuff that happens on the rising or falling edge of the clock end if; -- never put anything here end process; ,这是不可合成的。

虽然有许多方法可以对顺序过程进行编码,但通过坚持模板来保持一致是明智的。下面是一个这样的顺序逻辑模板,带有异步复位,所有综合工具都应该理解:

process(clock)  -- nothing else should go in the sensitivity list
begin
    -- never put anything here
    if rising_edge(clock) then  -- or falling_edge(clock) or clk'event and clk='1' or clk'event and clk='0
        -- put the synchronous stuff here
        -- ie the stuff that happens on the rising or falling edge of the clock
    end if;
     -- never put anything here
end process;        

我还注意到其他一些应该修复的事情:

i)第二个进程没有异步复位。以下是没有异步重置的顺序进程的相应模板:

process(clk)
begin
  if(clk'event and clk='1') then
    if(flag='0') then
      reg<=k;
    end if;
  end if;
end process;

我不知道设计意图,但第二个过程不适合此模板。在这里,符合模板:

flag

因此,flag不应该在敏感列表中。

同样,我只能猜测你的设计意图,所以我不能说这段代码符合你的要求。

ii)你永远不会把if推高。

iii)mButton3.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { Intent i=new Intent(MainActivity.this,Internet.class); startActivity(i); } }); 语句中不需要括号。