Hello everybody. I have written the following VHDL code in ISE. In the
synthesis report I am having this error saying:
"line 100: Signal wea_sig cannot be synthesized, bad synchronous
description. The description style you are using to describe a
synchronous element (register, memory, etc.) is not supported in the
current software release."
I can't find the problem. I would be really thankful if someone could
help me here.
here is my code:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity main_code is
Port ( clk : in STD_LOGIC;
edone: out std_logic := '0'
);
end main_code;
architecture Behavioral of main_code is
signal dout_rom: STD_LOGIC_VECTOR(7 DOWNTO 0):=(others => '0');
signal address_rom: std_logic_vector(3 downto 0) :=(others => '0');
------------- component rom
COMPONENT rom_core
PORT (
clka : IN STD_LOGIC ;
addra : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
douta : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END COMPONENT;
-------------
signal wea_sig: STD_LOGIC_VECTOR(0 DOWNTO 0) :="0" ;
signal address_ram: std_logic_vector(3 downto 0) :=(others => '0');
signal din_ram: STD_LOGIC_VECTOR(7 DOWNTO 0):=(others => '0');
signal dout_ram: STD_LOGIC_VECTOR(7 DOWNTO 0):=(others => '0');
------------- component ram
COMPONENT ram
PORT (
clka : IN STD_LOGIC;
wea : IN STD_LOGIC_VECTOR(0 DOWNTO 0);
addra : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
dina : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
douta : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END COMPONENT;
-------------
signal counter: integer := 0;
signal counter_prime: integer := 0;
signal ero: std_logic_vector(7 Downto 0):=(others => '1');
begin
------port map rom
pm1 : rom_core
PORT MAP (
clka => clk,
addra => address_rom,
douta => dout_rom
);
---
------port map ram
pm2 : ram
PORT MAP (
clka => clk,
wea => wea_sig,
addra => address_ram,
dina => din_ram,
douta => dout_ram
);
---
(line 100) process(clk)
begin
if (counter_prime <9) then
if(clk'event and clk='1') then
counter <= counter + 1;
wea_sig <= "0";
din_ram <= ero;
end if;
if(clk'event and clk='0') then
if(dout_rom < ero and counter/= 5) then
ero <= dout_rom;
end if;
if(counter=1 or counter=3) then
address_rom <= address_rom + 1;
end if;
if(counter=2) then
address_rom <= address_rom + 3;
end if;
if(counter=4) then
for i in 1 to 2 loop
if (counter_prime = i*3) then
address_ram <= address_ram + 2;
else
if(counter_prime /= 0 and i=1) then
address_ram <= address_ram + 1;
end if;
end if;
end loop;
for i in 1 to 2 loop
if (counter_prime = (3*i)-1) then
address_rom <= address_rom - 3;
else
if (i=1) then
address_rom <= address_rom - 4;
end if;
end if;
end loop;
end if;
if(counter=5) then
wea_sig <= "1";
counter_prime <= counter_prime + 1; --end of each round
--getting ready for the next round
counter <= 0;
ero <= (others => '1');
end if;
end if;
end if;
if(counter_prime=9) then
edone <= '1'; --erosion is done
end if;
end process;
end Behavioral;
Farzam wrote: > if (counter_prime <9) then if(clk'event and > clk='1') then Where did you find this very special way to describe a counter? What does the manual of your synthesizer say to that? A synchronous design usually starts with if rising_edge(clk) then... The design looks lousy due to the use of both clock edges. If I were your teacher I would give it back for rework until only one and the same clock edge is used throughout the whole design.
Thank you for the help. Actually I am new to synthesis and this code was
only supposed to simulate the algorithm at the first place which did
fine. It seems that I have to do more studies on synthesis.
If it is not a problem I would ask another question. Now I am trying to
write the datas from the ram to a text file. I have added the process
bellow to my code:
process(clk)
file outfile: chartype;
variable c: std_logic_vector(7 DOWNTO 0);
begin
if(clk'event and clk='1' and counter_prime = 10) then
counter <= counter + 1;
end if;
if(clk'event and clk='0' and counter_prime = 10 and counter < 16)
then
file_open(outfile,"C:\write.txt",write_mode);
c:= dout_ram;
write(outfile, tochar(c));
end if;
end process;
in which 'tochar' is a function that converts std_logic_vector(7 downto
0) s (outputs of the ram) to character. tochar is defined as bellow:
------- tochar function
function tochar (vec: std_logic_vector (7 DOWNTO 0)) return character is
variable ch: character;
begin
case vec is
when "00000000" => ch:= '0';
when others => ch:= '1';
end case;
return ch;
end tochar;
-------
The check syntax of the code is ok, but no .txt file is produced. I
would be pleased if you could help.
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.