我尝试根据其他帖子@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无法合成,同步描述不良。当前软件版本不支持您用于描述同步元素(寄存器,内存等)的描述样式。
答案 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);
}
});
语句中不需要括号。