реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> clk => altera, Может, я не понимаю чего?
YGin
сообщение Nov 1 2007, 14:43
Сообщение #16


Частый гость
**

Группа: Свой
Сообщений: 193
Регистрация: 28-02-06
Пользователь №: 14 796



Знаю немножко не в тему, но раз уж начал! Подскажите, как в этом чипе сделать деление двух 32 битных векторов, и влезет ли оно в чип?
Go to the top of the page
 
+Quote Post
Iouri
сообщение Nov 2 2007, 11:48
Сообщение #17


Местный
***

Группа: Свой
Сообщений: 364
Регистрация: 11-07-05
Пользователь №: 6 707



думаю что не получится
tools - Megawizard plug-in manager -> create new custom megafunction variation -> arithmetic -> LPM-divide


а дальше по шагам
Go to the top of the page
 
+Quote Post
YGin
сообщение Nov 2 2007, 15:17
Сообщение #18


Частый гость
**

Группа: Свой
Сообщений: 193
Регистрация: 28-02-06
Пользователь №: 14 796



Цитата(Iouri @ Nov 2 2007, 13:48) *
думаю что не получится
tools - Megawizard plug-in manager -> create new custom megafunction variation -> arithmetic -> LPM-divide
а дальше по шагам

Спасибо.
И честно последний вопрос. Почему этот процесс не работает, я хоть застрелите не понимаю!

port data_out : out std_logic_vector(31 downto 0);-- знаю что не правельно это так для наглядности!
clk1 = 125MHz
clk2 = 100MHz


signal base_counter : std_logic_vector(31 downto 0);
signal measuring_counter : std_logic_vector(31 downto 0);

process(clk1)
begin
if rising_edge(clk1) then
base_counter <= base_counter + 1;
if base_counter = "ffffffff" then
en = '1';
else
en = '0';
end if;
end if;
end process;


process(clk2,en)
begin
if rising_edge(clk2) then
if en = '1' then
measuring_counter <= x"00000000";
data_out <= measuring_counter;
else
measuring_counter <= measuring_counter + 1;
end if;
end if;
end if;
end process;
Go to the top of the page
 
+Quote Post
AlexanderX
сообщение Nov 2 2007, 15:47
Сообщение #19


Частый гость
**

Группа: Свой
Сообщений: 107
Регистрация: 21-07-05
Из: Киев
Пользователь №: 6 977



Цитата(YGin @ Nov 2 2007, 17:17) *
if base_counter = "ffffffff" then
en = '1';
else
en = '1';
end if;

Это примерно как свет то потухнет, то погаснет. smile.gif
В каком-то из условий должнобыть присваивание '0'. Стандартная ошибка копирования.
Go to the top of the page
 
+Quote Post
YGin
сообщение Nov 2 2007, 16:23
Сообщение #20


Частый гость
**

Группа: Свой
Сообщений: 193
Регистрация: 28-02-06
Пользователь №: 14 796



Цитата(AlexanderX @ Nov 2 2007, 17:47) *
Это примерно как свет то потухнет, то погаснет. smile.gif
В каком-то из условий должнобыть присваивание '0'. Стандартная ошибка копирования.

В точку с копированием! Да только это я сделал когда копировал кусок кода с проектa на форум в проекте всё честно там ‘0’
Go to the top of the page
 
+Quote Post
sazh
сообщение Nov 2 2007, 16:29
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(YGin @ Nov 2 2007, 19:23) *
В точку с копированием! Да только это я сделал когда копировал кусок кода с проектa на форум в проекте всё честно там ‘0’

process(clk2,en)
begin
if rising_edge(clk2) then
if en = '1' then
measuring_counter <= x"00000000";
data_out <= measuring_counter;


Может статься, что в интервал en уложатся два передних фронта clk2.
Нужно корректно перейти из одного клокового домена в другой (Сделать длительность en в период clk2).
Go to the top of the page
 
+Quote Post
YGin
сообщение Nov 2 2007, 16:37
Сообщение #22


Частый гость
**

Группа: Свой
Сообщений: 193
Регистрация: 28-02-06
Пользователь №: 14 796



Цитата(sazh @ Nov 2 2007, 18:29) *
process(clk2,en)
begin
if rising_edge(clk2) then
if en = '1' then
measuring_counter <= x"00000000";
data_out <= measuring_counter;
Может статься, что в интервал en уложатся два передних фронта clk2.
Нужно корректно перейти из одного клокового домена в другой (Сделать длительность en в период clk2).


Возможно! Но тогда на выходе должны были б быть нули ну или константа если изменить код.

process(clk2,en)
begin
if rising_edge(clk2) then
if en = '1' then
measuring_counter <= x"11111111";
data_out <= measuring_counter;

а у меня Аltera просто отказывается работать когда я включаю этот код и нормально работает когда я его коментарю.
Go to the top of the page
 
+Quote Post
sazh
сообщение Nov 2 2007, 16:42
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(YGin @ Nov 2 2007, 19:37) *
Возможно! Но тогда на выходе должны были б быть нули ну или константа если изменить код.

process(clk2,en)
begin
if rising_edge(clk2) then
if en = '1' then
measuring_counter <= x"11111111";
data_out <= measuring_counter;

а у меня Аltera просто отказывается работать когда я включаю этот код и нормально работает когда я его коментарю.


В VHDL я не силен. Выложите полный проект. За длинные выходные ктонибудь да посмотрит.
В RTL просмотрщике все сразу видно. Ясно дело, что Квартус тут непричем.
Go to the top of the page
 
+Quote Post
YGin
сообщение Nov 2 2007, 16:50
Сообщение #24


Частый гость
**

Группа: Свой
Сообщений: 193
Регистрация: 28-02-06
Пользователь №: 14 796



Да я особо на Квартус и не грешу! Если руки кривые машинка, то тут при чём (или программка)! Вопрос то в другом код, то простой как угол дома а работать не хочет!
И думается мне, что проблема тут в частоте может Макс не может скушать 125MHz?
Go to the top of the page
 
+Quote Post
sazh
сообщение Nov 2 2007, 17:50
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(YGin @ Nov 2 2007, 19:50) *
Да я особо на Квартус и не грешу! Если руки кривые машинка, то тут при чём (или программка)! Вопрос то в другом код, то простой как угол дома а работать не хочет!
И думается мне, что проблема тут в частоте может Макс не может скушать 125MHz?


MAX может скушать 125 mHz. Потому что это циклон без памяти с внутренним загрузочным ПЗУ.
Про код я тоже ничего не знаю. Не программист. Могу оперировать понятием схема.
Go to the top of the page
 
+Quote Post
YGin
сообщение Nov 2 2007, 19:52
Сообщение #26


Частый гость
**

Группа: Свой
Сообщений: 193
Регистрация: 28-02-06
Пользователь №: 14 796



Ну, тогда я совсем ничего не понимаю!
Резюме!
Буду искать в проекте в целом, наверно грабли там! Если у кого будут советы, всегда радо выслушаю.
Go to the top of the page
 
+Quote Post
Iouri
сообщение Nov 2 2007, 20:01
Сообщение #27


Местный
***

Группа: Свой
Сообщений: 364
Регистрация: 11-07-05
Пользователь №: 6 707



Код
process(clk1)
begin
if rising_edge(clk1) then
base_counter <= base_counter +1;
end if;
end process
en <= '1' when base_counter = x"FFFFFF" else '0'

process(clk2)
begin
if rising_edge(clk2) then
en_sr(3 downto 0) <= en_sr(2 downto 0) & en;
end if;
end process;

en1 <= en_sr{3};

process(clk2)
begin
if rising_edge(clk2) then
if en1 = '1' then
measuring_counter <= x"00000000";
else
measuring_counter <= measuring_counter + 1;
end if;
end if;
end process;

process(clk2,en)
begin
if rising_edge(clk2) then
if en1= '1' then
data_out <= measuring_counter;
else
data_out <= data_out;
end if;
end if;
end process;
Go to the top of the page
 
+Quote Post
sazh
сообщение Nov 3 2007, 16:19
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(sazh @ Nov 2 2007, 19:29) *
process(clk2,en)
begin
if rising_edge(clk2) then
if en = '1' then
measuring_counter <= x"00000000";
data_out <= measuring_counter;
Может статься, что в интервал en уложатся два передних фронта clk2.
Нужно корректно перейти из одного клокового домена в другой (Сделать длительность en в период clk2).


Вчера я вас ввел в заблуждение. Частота clk1 выше, чем clk2
Поэтому может статься, что сфомированный по clk1 интервал en может пропускаться триггером, работающим по фронту clk2.
Нужно корректно перейти из одного клокового домена в другой (Сделать длительность en в период clk2).
Примерно так.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity count is
Port (
clk125, clk100 : in std_logic;
data_out : out std_logic_vector(3 downto 0));
end count;

architecture Behavioral of count is
signal base_counter: std_logic_vector(4 downto 0);
signal measuring_counter: std_logic_vector(3 downto 0);
signal en_sr: std_logic_vector(2 downto 0);
signal en, dff_a, en_a: std_logic;
begin

process(clk125)
begin
if rising_edge(clk125) then
if base_counter = "10000" then
base_counter <= "00001";
else
base_counter <= base_counter + 1;
end if;
end if;
end process;

en <= base_counter(4);

process(clk100, en)
begin
if en = '1' then
dff_a <= '1';
elsif rising_edge(clk100) then
dff_a <= '0';
end if;
end process;

en_a <= NOT en_sr(2) AND en_sr(1);

process(clk100)
begin
if rising_edge(clk100) then
en_sr <= en_sr(1 downto 0) & dff_a;
if en_a = '1' then
data_out <= measuring_counter;
end if;
if en_a = '1' then
measuring_counter <= x"0";
else
measuring_counter <= measuring_counter + 1;
end if;
end if;
end process;

end Behavioral;
Go to the top of the page
 
+Quote Post
YGin
сообщение Nov 5 2007, 11:07
Сообщение #29


Частый гость
**

Группа: Свой
Сообщений: 193
Регистрация: 28-02-06
Пользователь №: 14 796



Всем большое спасибо beer.gif beer.gif beer.gif проблема решена проект работает!
И так в двух словах, что было и почему не работало! Бои шли с переменным успехом!
Оказалось что хомут не один а несколько!
Прав был sazh в том что интервал en может пропускался триггером, работающим по фронту clk2 просто я забыл уточнить что clk2 может меняться от 5 до 200 MHz! И в целом вся схема это обычный измеритель частоты! Вот, а другой баг был уже в другом месте проекта, но влиял на работу в целом!
А я грешным делом подумал на Altera(у), ещё раз подтвердился девиз(если руки кривые нечего грешить на магнитные бури на солнце)
Ещё раз всем спасибо за помощь!!!! a14.gif
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 12:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.01467 секунд с 7
ELECTRONIX ©2004-2016