To pass the subject had to do such a project: Rectangular waveform generator in the range from 0 to 10MHz. I have a all code, Behavioral simulation is good but post-fit is bed, becouse over time, an indefinite condition 'X' on a output. What is wrong with this code? Please help My code: ------------------------------------------------------------------------ ---------- -- Company: -- Engineer: -- -- Create Date: 17:25:15 06/14/2014 -- Design Name: -- Module Name: Generator - Behavioral -- Project Name: -- Target Devices: -- Tool versions: -- Description: -- -- Dependencies: -- -- Revision: -- Revision 0.01 - File Created -- Additional Comments: -- ------------------------------------------------------------------------ ---------- LIBRARY ieee; use ieee.std_logic_1164.all; --use IEEE.STD_LOGIC_ARITH.all; --use ieee.std_logic_signed.all; use ieee.std_logic_unsigned.all; use ieee.numeric_std.all; -- Uncomment the following library declaration if using -- arithmetic functions with Signed or Unsigned values --use IEEE.NUMERIC_STD.ALL; -- Uncomment the following library declaration if instantiating -- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; ENTITY Generator IS PORT ( clk : IN STD_LOGIC; --100Mhz (10ns) zadajnik1 : IN STD_LOGIC_VECTOR(3 downto 0); zadajnik2 : IN STD_LOGIC_VECTOR(3 downto 0); zadajnik3 : IN STD_LOGIC_VECTOR(3 downto 0); zadajnik4 : IN STD_LOGIC_VECTOR(3 downto 0); led1 : OUT STD_LOGIC; led2 : OUT STD_LOGIC; wyjscie : OUT STD_LOGIC ); END Generator; ARCHITECTURE Behavioral OF Generator IS subtype shortint is integer range 0 to 1000000000; subtype microint is integer range 0 to 9; signal nastaw1 : microint; signal nastaw2 : shortint; signal nastaw3 : microint; signal nastaw4 : shortint; BEGIN process (clk,zadajnik1,zadajnik2,zadajnik3,zadajnik4) variable count : std_logic_vector(29 downto 0) := (others => '0'); variable count2 : std_logic_vector(29 downto 0) := (others => '0'); variable count3 : std_logic_vector(3 downto 0) := (others => '0'); variable count4 : std_logic_vector(3 downto 0) := (others => '0'); begin if rising_edge(clk) then nastaw1 <= to_integer(unsigned(zadajnik1)); nastaw3 <= to_integer(unsigned(zadajnik3)); if (count = nastaw4) then count3 := count3 + 1; count := (others => '0'); if (count3 <= nastaw3) then wyjscie <= '1'; else wyjscie <= '0'; end if; end if; if (count2 = nastaw2) then count4 := count4 + 1; count2 := (others => '0'); if (count4 = nastaw1) then count3 := (others => '0'); count4 := (others => '0'); end if; end if; count := count + 1; count2 := count2 + 1; end if; ---------------------------------------------- if (nastaw2 > nastaw4) then led1 <= '0'; elsif (nastaw2 < nastaw4) then led1 <= '1'; elsif (nastaw2 = nastaw4) then if (nastaw1 > nastaw3) then led1 <= '0'; else led1 <= '1'; end if; end if; if ((nastaw1 = 0) or (nastaw3 = 0)) then led2 <= '1'; else led2 <= '0'; end if; end process; with zadajnik2 select nastaw2 <= 1 when "0000", 10 when "0001", --10 100 when "0010", --100 1000 when "0011", --1 000 10000 when "0100", --10 000 100000 when "0101", --100 000 1000000 when "0110", --1 000 000 10000000 when "0111", --10 000 000 100000000 when "1000", --100 000 000 1000000000 when "1001", --1 000 000 000 10 when others; with zadajnik4 select nastaw4 <= 1 when "0000", 10 when "0001", --10 100 when "0010", --100 1000 when "0011", --1 000 10000 when "0100", --10 000 100000 when "0101", --100 000 1000000 when "0110", --1 000 000 10000000 when "0111", --10 000 000 100000000 when "1000", --100 000 000 1000000000 when "1001", --1 000 000 000 10 when others; end Behavioral;
Marek wrote: > I have a all code, Behavioral > simulation is good Fine. So it shold work on your FPGA too. > but post-fit is bed, becouse over time, an indefinite > condition 'X' on a output. There is an effect, called 'X'-propagation. You can search the reason for the 'X'. Normaly a beahvioral simulation is enough. Post-fit timinig simulation is today only used in dodgy designs. The statical timing analysis with proper clock constraint will help even more than a timing simulation. > What is wrong with this code? I would change some parts: Marek wrote: > LIBRARY ieee; > use ieee.std_logic_1164.all; > --use IEEE.STD_LOGIC_ARITH.all; > --use ieee.std_logic_signed.all; > use ieee.std_logic_unsigned.all; > use ieee.numeric_std.all; 1. To make calculation use only numeric_std. Forget std_logic_unsigned, std_logic_signed and std_logic_arith. They are vendor specific and unstandardised (and wrong compiled to library ieee). > variable count : std_logic_vector(29 downto 0) := (others => '0'); > variable count2 : std_logic_vector(29 downto 0) := (others => '0'); > variable count3 : std_logic_vector(3 downto 0) := (others => '0'); > variable count4 : std_logic_vector(3 downto 0) := (others => '0'); 2. As beginner avoid variables. Learn the specific behaviour of signals (latency), after that you can use variables. 3. Use the type unsigned for counters. std_logic_vectors are just a pile of bits. To make calculations (like the addition of 1) use unsigned. unsigned can easy compared with integer and can easy converted to slv, if needed. regards, Hans
Marek wrote: > with zadajnik4 select nastaw4 <= osobliwie sformulowanie :-) Why do you transform the inpus to deicmal? You should use binary increasing Counters to directly compare to the Input Parameters. - dziwny zadanie ...
Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
Log in with Google account
No account? Register here.