Dr.Alex 0 21 мая, 2017 Опубликовано 21 мая, 2017 · Жалоба изначально он не может понять что такое bp пока не стартанет клок. задать заранее bp мы не можем Оно и не нужно. В этом смысле всё нормально. и почему pv в первый такт не стал равен bp? вроде как это условие выполняется Сразу по двум причинам 1) В первом такте вы находитесь в состоянии лоад, а только в следующем проверяется то условие 2) Даже будь это всё в одном состоянии, было бы так же :-))) потому что назначения bp <= "00000000" & b; и pv <= pv + bp; выполнялись бы одновременно :-))) ведь назначение сигналов неблокирующее. Если хочется всё до последнего такта сэкономить, то начинать что-то делать нужно уже в такте лоад, а следующие такты делать начиная с i=1, ну как-то так: if load = '1' then bp <= "0000000" & b & '0'; if a(0) = '1' then pv <= "00000000" & b; else pv <= (others => '0'); end if; i <= 1; else Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artyombn 0 22 мая, 2017 Опубликовано 22 мая, 2017 (изменено) · Жалоба хочется сэкономить все, до последнего такта. поэтому я начал прописывать действия при i=0 в load. но не пойму почему мне не выдает результат bp. когда load = 1 и по такту мы вроде bp записали, потом его используем. оно же никуда не девается. а на вейформе оно неопределенно. library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_unsigned.all; use IEEE.NUMERIC_STD.all; entity test is port( clk, r: in std_logic; a : in std_logic_vector(7 downto 0); b : in std_logic_vector(7 downto 0); p : out std_logic_vector(15 downto 0); load: in std_logic ); end test; architecture test of test is signal pv: std_logic_vector(15 downto 0):=(others => '0'); signal bp: std_logic_vector(15 downto 0); signal i : integer range 0 to 8; begin process begin wait until clk'event and clk = '1'; if load = '1' then bp<= "00000000" & b; i <= 0; if a(i) = '1' then pv<= "00000000" & b; else pv <= (others => '0'); end if; bp<=bp(14 downto 0) & '0'; i<=1; else if i<8 then if a(i) = '1' then pv<= pv+bp; end if; bp<=bp(14 downto 0) & '0'; i<=i+1; end if; p<=pv; end if; end process; end test; но не пойму почему мне не выдает результат bp. когда load = 1 и по такту мы вроде bp записали, потом его используем. оно же никуда не девается. а на вейформе оно неопределенно. хотя я понял почему. мы как записываем, так и сдвигаем одновременно bp в одном такте.сейчас попробую исправить p.s. а это вообще возможно?? что-то у меня не получается. Изменено 22 мая, 2017 пользователем artyombn Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 22 мая, 2017 Опубликовано 22 мая, 2017 · Жалоба Хотите экономить каждый так. Меняйте мышление. Вы сейчас думаете моментом сразу после фронта клока. Выставляете данные для этого момента, и как результат получаете все свои ответы на следующем такте. А думать надо моментом сразу после фронта, и выставлять данные для следующего. То есть на самом деле вам нужно создавать комбинаторную часть схемы, а в регистры просто щелкать результат. сейчас вы сохраняете операнды по сигналу загрузки и начинаете считать. При этом операнды и сигнал загрузки появляются появились сразу после фронта. И вы можете на следующем же фронте уже сохранить первый такт счета. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artyombn 0 22 мая, 2017 Опубликовано 22 мая, 2017 · Жалоба Хотите экономить каждый так. Меняйте мышление. Вы сейчас думаете моментом сразу после фронта клока. Выставляете данные для этого момента, и как результат получаете все свои ответы на следующем такте. А думать надо моментом сразу после фронта, и выставлять данные для следующего. то есть мне надо работать по спаду такта? можете показать самый элементарный пример, где работа идет моментом после фронта? То есть на самом деле вам нужно создавать комбинаторную часть схемы, а в регистры просто щелкать результат. сейчас вы сохраняете операнды по сигналу загрузки и начинаете считать. При этом операнды и сигнал загрузки появляются появились сразу после фронта. И вы можете на следующем же фронте уже сохранить первый такт счета. я не понимаю как должна выглядеть эта комбинаторная схема. если бы я понимал поболее, я бы, наверное, понял о чем вы ведете речь. все элементарные описания по vhdl мне мало помогают, хотя я штудирую их понемногу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 22 мая, 2017 Опубликовано 22 мая, 2017 · Жалоба я не понимаю как... мне мало помогают, хотя я штудирую их понемногу. Смотрите личную почту... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 22 мая, 2017 Опубликовано 22 мая, 2017 · Жалоба то есть мне надо работать по спаду такта? можете показать самый элементарный пример, где работа идет моментом после фронта? не работать, а думать:) это трудно объяснить, наверное легче становится с опытом В вашем случае по Load вы сохраняете операнды и готовитесь считать. Но в реальности операнды которые вы сохраняете где-то снаружи наверняка уже в регистрах и вы просто добавляете лишний такт. В вашем случае по Load уже можно делать первый акт счета, то есть во временный результат сохранить один операнд, если младший бит другого 1. А операнды сохранить сохранить сразу сдвинутым на 1 бит, один влево, другой в право. А дальше продолжать двигать операнды и прибавлять к временному результату первый операнд, если младший бит второго 1. При этом временный результат надо и выдавать наружу, снабдив его сигналом out_enable, чтобы внешние устройства могли понять когда он наконец сохранил верное значение. Так вы не потеряете еще такт на сохранение результата. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dr.Alex 0 22 мая, 2017 Опубликовано 22 мая, 2017 · Жалоба не получается. Эхе-хе. Вот вам кот. Можно гораздо короче и изящнее написать с использованием переменных, но для начинающего это вредно. library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity mult is port ( clk : in std_logic; load : in std_logic; a : in unsigned ( 7 downto 0); b : in unsigned ( 7 downto 0); p : out unsigned (15 downto 0) ); end entity; architecture mult_arch of mult is signal aa : unsigned ( 7 downto 0); signal pv : unsigned (15 downto 0); signal bp : unsigned (15 downto 0); signal i : integer range 0 to 8; begin p <= pv; process begin wait until clk'event and clk = '1'; if load = '1' then bp <= "0000000" & b & "0"; i <= 1; if a(0) = '1' then pv <= "00000000" & b; else pv <= (others => '0'); end if; aa <= a; else if i < 8 then if aa(i) = '1' then pv <= pv + bp; end if; bp <= bp (14 downto 0) & '0'; i <= i + 1; end if; end if; end process; end architecture; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 22 мая, 2017 Опубликовано 22 мая, 2017 · Жалоба Есть ли какой особый смысл в строчке wait until clk'event and clk = '1'; Или просто Вам так удобнее ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artyombn 0 22 мая, 2017 Опубликовано 22 мая, 2017 · Жалоба Эхе-хе. Вот вам кот. а я даже и не подумал об этом: bp <= "0000000" & b & "0"; простое и легкое выражение убивало двух зайцев, а я даже и не сообразил так сделать. спасибо вам огромное за помощь. видимо мне нужно ещё больше практики и чтения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 23 мая, 2017 Опубликовано 23 мая, 2017 · Жалоба Есть ли какой особый смысл в строчке это каноническое выражение, rising_edge(clk) - это на самом деле макрос за которым стоит это выражение. видимо мне нужно ещё больше практики и чтения. Коль вы в начале пути, может стоит сразу свернуть на верную дорожку verilog:)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artyombn 0 23 мая, 2017 Опубликовано 23 мая, 2017 · Жалоба Коль вы в начале пути, может стоит сразу свернуть на верную дорожку verilog:)? я слышал об этом языке и не 1 раз) а что на VHDL никто уже не работает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 23 мая, 2017 Опубликовано 23 мая, 2017 · Жалоба это каноническое выражение, rising_edge(clk) - это на самом деле макросНа самом деле это функция. В VHDL нет макросов. Коль вы в начале пути, может стоит сразу свернуть на верную дорожку verilog:)?А может не надо всякий раз в теме про VHDL говорить про переход на Verilog? Там своих тараканов полно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 23 мая, 2017 Опубликовано 23 мая, 2017 · Жалоба А может не надо всякий раз в теме про VHDL говорить про переход на Verilog? Там своих тараканов полно. А может надо, если это мировая тенденция, а новички не знают? Пусть на VHDL остаются только те кто осознано по какой-то причине сделал выбор. А человеку с десятком постов просто преступно не сказать что мир изменился. я слышал об этом языке и не 1 раз) а что на VHDL никто уже не работает? Работает... в Америке вон есть мужик который организовал фирму по поддержке программ на мертвом языке, там все сотрудники 76+, потому что другие просто не знают этого языка:) Но вы уверены что хотите выйти на рынок и конкурировать в таком разрезе? Просто отвечаем на вопрос. Какая самая популярная и развитая методология верификации RTL? - ответ UVM На каком языке она основана? - ответ SystemVerilog Лезем на гитхаб и смотрим свежее и новое, какой-нибудь risc V, на каком языке? VHDL? - да фиг там. SystemVerilog! По мне выбор очевиден, независимо от тараканов. На самом деле это функция. В VHDL нет макросов. незначительные детали.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 23 мая, 2017 Опубликовано 23 мая, 2017 · Жалоба какая разница на каком языке писать ... Главное понимать (читать) оба языка... Язык это всего лишь средство, главное понимание алгоритмов обработки и хорошее знание цифровой схемотехники, знания современных интерфейсов/шин. Также надо иметь другое мышление по сравнению с С/С++ Если нормальная команда, то для RTL дизайна подходят оба языка, если достигается результат при этом. Для симуляции SystemVerilog уже уступает некоторым средствам, но такое нужно когда требуется покрытие практически 100% (чаще при проектировании ASIC)... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 23 мая, 2017 Опубликовано 23 мая, 2017 · Жалоба Язык это всего лишь средство, главное понимание алгоритмов обработки и хорошее знание цифровой схемотехники. Тоже проповедую данную истину, но уже несколько раз прошелся по граблям signal1 & signal2 от VHDL, кто придумал что это конкатенация%))))... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться