2016-03-19 12 views
0

ich versuchte, diesen Code auszuführen nach Vorschlag auf einem anderen Posten @Brian Drummond AnswerFehler in VHDL-Code

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; 

Dieser Fehler bei RTL Schematic aufgetreten:

Signal cnt kann nicht synthetisiert, schlechte Synchron Beschreibung werden . Der Beschreibungsstil, mit dem Sie ein synchrones Element (Register, Speicher usw.) beschreiben, wird in der aktuellen Softwareversion nicht unterstützt.

Antwort

2

Ich denke, Ihr erster Prozess vielleicht sollte wie folgt aussehen:

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; 

Mit dem elsif Sie fuhren cnt auf beiden Rand der clk, die nicht synthetisierbaren ist.

Während es viele Möglichkeiten gibt, einen sequenziellen Prozess zu codieren, ist es sinnvoll, konsistent zu sein, indem man sich an ein Template hält. Hier ist eine solche Vorlage für sequentielle Logik mit einem asynchronen Reset, die alle Synthese-Tools verstehen sollte:

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;   

ich einige andere Dinge bemerken, die sollte festgelegt werden, auch:

i) Der zweite Prozess tut keinen asynchronen Reset haben. Hier ist die entsprechende Vorlage für einen sequentiellen Prozess ohne einen asynchronen Reset:

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;   

ich weiß nicht, die Konstruktionsabsicht, aber der zweite Prozess nicht diese Vorlage passt. Hier ist es, an der Vorlage entsprechen:

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

So flag sollte nicht in der Empfindlichkeit Liste sein.

Auch hier kann ich nur Ihre Entwurfsabsicht erraten, daher kann ich nicht sagen, dass dieser Code Ihren Anforderungen entspricht.

ii) Sie fahren niemals flag hoch.

iii) Sie benötigen keine Klammern in if Aussagen.

+0

Der zweite Prozess passt Ihre Codevorlage, oder nicht? Der Prozess macht im asynchronen Reset-Teil nichts. –

+0

@Martin Zabel nicht. Du hast recht - es gibt keinen asynchronen Reset im zweiten Prozess. Ich werde meine Antwort bearbeiten. –

+0

Es muss 'if (flag/= '0' then then) gelesen werden, damit es mit dem ursprünglichen Code übereinstimmt. Entschuldigung, habe es vorher nicht gesehen. –