Раз пошла такая пьянка, то ИМХО по моим иследованиям в коде не совсем правильно следующее
Код
temp1:STD_LOGIC_VECTOR(31 downto 0):=B"00000001100000000110010000110011";
temp2:STD_LOGIC_VECTOR(31 downto 24):=X"02";
temp3:STD_LOGIC_VECTOR(31 downto 0):=B"00000011000000010000001010111100";
temp4:STD_LOGIC_VECTOR(31 downto 0):=B"11100100000000000000000000001000"
Если это секция generic , то задайте лучше integer, будет понятно и давайте настроечным параметрам нормальные названия и отделяйте их от остального текста регистром букв.
Код
signal count_temp:integer range 0 to 1020;
signal count_end:bit;
лучше сделать
Код
signal count_temp : std_logic_vector(9 downto 0); -- 0 to 2*10-1
signal count_end : std_logic;
т.к. все равно интеджер будет приведен к стд лоджику а на ваше ограничение 1020 синтезатор "забьет".
Код
p0: process (clk, enable)
variable count:integer range 0 to 1020;
variable count_stop:integer range 0 to 1020;
begin
if enable='0' then
count:=0;
elsif rising_edge(clk) then --CLK rising edge
count:=count+1;
if count_end='0' then
count_stop:=150;
else
count_stop:=200;
end if;
if count=count_stop then
count:=0;
end if;
end if;
count_temp<=count;
end process p0;
В чем минус с точки зрения синтеза, вы как я понял делаете стейт машину на счетчке, хотя я не однократно уже вам говорил, что бы вы воспользовались перечисляемыми типами.
я взял на себя смелость немного подправить ваш код и убрать лишнее
Код
signal count_stop : std_logic;
begin
count_stop <= '1' when (count = conv_std_logic_vector(150, count_stop'length))and(count_end = '0') else
'1' when (count = conv_std_logic_vector(200, count_stop'length))and(count_end = '1') else '0';
p0:
process (clk, enable)
begin
if (enable = '0') then
count <= (others => '0');
elsif rising_edge(clk) then
if (count_stop = '1') then count <= (others => '0');
else count <= count + '1';
end if;
end if;
end process p0;
Что мы тут имеем вы описываете счетчк с двуми видами ресета, асинхронным и синхронным, ИМХО именно это и не позволяет сделать счетчик как счетчик, а не как суматор с тригерами на вашей архитектуре. Это я говорю по памяти, т.к. щас софта для альтер у меня нет и проверить не на чем., может быть я ошибаюсь.
Код
p1: process (enable,clk)
variable t1:integer:=750;
variable temp:integer range 0 to 16777215 :=0;
variable num:integer range 0 to 32;
variable data_strob_temp:STD_LOGIC:='1';
variable synh_out_temp:STD_LOGIC:='1';
variable data_out_temp:STD_LOGIC_VECTOR(31 downto 0):=(others=>'0');
begin
if enable='0' then
t1:=750;
data_out<=(others=>'0');
data_strob<='1';
synh_out<='1';
count_end<='0';
data_strob_temp:='1';
synh_out_temp:='1';
data_out_temp:=(others=>'0');
temp:=0;
num:=0;
elsif falling_edge(clk) then --CLK rising edge
case count_temp is
when 1 =>
data_strob_temp:='0';
when 2 =>
synh_out_temp:='0';
data_out_temp:=temp1;
when 3 =>
synh_out_temp:='1';
when 4 =>
synh_out_temp:='0';
------------------------
temp:=temp+t1;
data_out_temp:=temp2 & CONV_STD_LOGIC_VECTOR(temp,24);
num:=num+1;
if t1 = 750 and num = 20 then
t1:=1000;
num:=0;
count_end<='0';
elsif t1=1000 and num=20 then
t1:=750;
num:=0;
count_end<='1';
end if;
------------------------
when 5 =>
synh_out_temp:='1';
when 6 =>
synh_out_temp:='0';
data_out_temp:=temp3;
when 7 =>
synh_out_temp:='1';
when 8 =>
synh_out_temp:='0';
data_out_temp:=temp4;
when 9 =>
synh_out_temp:='1';
when 11 =>
data_strob_temp:='1';
when others =>
data_strob<=data_strob_temp;
synh_out<=synh_out_temp;
data_out<=data_out_temp;
end case;
data_strob<=data_strob_temp;
synh_out<=synh_out_temp;
data_out<=data_out_temp;
end if;
end process p1;
Я тоже немного подправил, что усложняло восприятие кода
Код
p1: process (enable,clk)
variable t1:integer:=750;
variable temp:integer range 0 to 16777215 :=0;
variable num:integer range 0 to 32;
begin
if enable='0' then
t1 := 750;
data_out <= (others=>'0');
data_strob <='1';
synh_out <='1';
count_end <= '0';
temp := 0;
num :=0;
elsif rising_edge(clk) then
data_strob <= '0';
synh_out <= '0';
--data_out <= '0'; -- нужно если дата аут не должен "подвисать"
case count is
when 1 => null;
when 2 => data_out <= temp1;
when 3 => synh_out <= '1';
when 4 =>
------------------------
temp := temp + t1;
data_out <= temp2 & CONV_STD_LOGIC_VECTOR(temp,24);
num:=num+1;
if t1 = 750 and num = 20 then
t1:=1000;
num:=0;
count_end <= '0';
elsif t1=1000 and num=20 then
t1:=750;
num:=0;
count_end <= '1';
end if;
------------------------
when 5 => synh_out <='1';
when 6 => data_out <= temp3;
when 7 => synh_out <='1';
when 8 => data_out <= temp4;
when 9 => synh_out <='1';
when 11 => data_strob <='1';
when others => null;
end case;
end if;
end process p1;
это как я понял стейт машина.
ИМХО косяк здесь в том, как раз в состоянии 4, т.к. переменная, в отличие от сигнала изменяться сразу же, а не по eventу, что ИМХО усложняет логику формирования сигнала возбуждения тригеров data_out
data_out <= temp2 & CONV_STD_LOGIC_VECTOR(temp,24);
, тоже самое касаеться переменной num
ИМХО на вашем месте я бы еще раз пересмотрел функционирование вашего девайса уже с точки зрения не симуляции, а синтеза и читаемости. Тут есть над чем работать
ПС, может где ошибся не пинайте, я толкьо пришел на работу