Dr.Alex 0 May 21, 2017 Posted May 21, 2017 · Report post изначально он не может понять что такое 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 Quote Share this post Link to post Share on other sites More sharing options...
artyombn 0 May 22, 2017 Posted May 22, 2017 (edited) · Report post хочется сэкономить все, до последнего такта. поэтому я начал прописывать действия при 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. а это вообще возможно?? что-то у меня не получается. Edited May 22, 2017 by artyombn Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 May 22, 2017 Posted May 22, 2017 · Report post Хотите экономить каждый так. Меняйте мышление. Вы сейчас думаете моментом сразу после фронта клока. Выставляете данные для этого момента, и как результат получаете все свои ответы на следующем такте. А думать надо моментом сразу после фронта, и выставлять данные для следующего. То есть на самом деле вам нужно создавать комбинаторную часть схемы, а в регистры просто щелкать результат. сейчас вы сохраняете операнды по сигналу загрузки и начинаете считать. При этом операнды и сигнал загрузки появляются появились сразу после фронта. И вы можете на следующем же фронте уже сохранить первый такт счета. Quote Share this post Link to post Share on other sites More sharing options...
artyombn 0 May 22, 2017 Posted May 22, 2017 · Report post Хотите экономить каждый так. Меняйте мышление. Вы сейчас думаете моментом сразу после фронта клока. Выставляете данные для этого момента, и как результат получаете все свои ответы на следующем такте. А думать надо моментом сразу после фронта, и выставлять данные для следующего. то есть мне надо работать по спаду такта? можете показать самый элементарный пример, где работа идет моментом после фронта? То есть на самом деле вам нужно создавать комбинаторную часть схемы, а в регистры просто щелкать результат. сейчас вы сохраняете операнды по сигналу загрузки и начинаете считать. При этом операнды и сигнал загрузки появляются появились сразу после фронта. И вы можете на следующем же фронте уже сохранить первый такт счета. я не понимаю как должна выглядеть эта комбинаторная схема. если бы я понимал поболее, я бы, наверное, понял о чем вы ведете речь. все элементарные описания по vhdl мне мало помогают, хотя я штудирую их понемногу. Quote Share this post Link to post Share on other sites More sharing options...
iosifk 3 May 22, 2017 Posted May 22, 2017 · Report post я не понимаю как... мне мало помогают, хотя я штудирую их понемногу. Смотрите личную почту... Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 May 22, 2017 Posted May 22, 2017 · Report post то есть мне надо работать по спаду такта? можете показать самый элементарный пример, где работа идет моментом после фронта? не работать, а думать:) это трудно объяснить, наверное легче становится с опытом В вашем случае по Load вы сохраняете операнды и готовитесь считать. Но в реальности операнды которые вы сохраняете где-то снаружи наверняка уже в регистрах и вы просто добавляете лишний такт. В вашем случае по Load уже можно делать первый акт счета, то есть во временный результат сохранить один операнд, если младший бит другого 1. А операнды сохранить сохранить сразу сдвинутым на 1 бит, один влево, другой в право. А дальше продолжать двигать операнды и прибавлять к временному результату первый операнд, если младший бит второго 1. При этом временный результат надо и выдавать наружу, снабдив его сигналом out_enable, чтобы внешние устройства могли понять когда он наконец сохранил верное значение. Так вы не потеряете еще такт на сохранение результата. Quote Share this post Link to post Share on other sites More sharing options...
Dr.Alex 0 May 22, 2017 Posted May 22, 2017 · Report post не получается. Эхе-хе. Вот вам кот. Можно гораздо короче и изящнее написать с использованием переменных, но для начинающего это вредно. 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; Quote Share this post Link to post Share on other sites More sharing options...
Flip-fl0p 4 May 22, 2017 Posted May 22, 2017 · Report post Есть ли какой особый смысл в строчке wait until clk'event and clk = '1'; Или просто Вам так удобнее ? Quote Share this post Link to post Share on other sites More sharing options...
artyombn 0 May 22, 2017 Posted May 22, 2017 · Report post Эхе-хе. Вот вам кот. а я даже и не подумал об этом: bp <= "0000000" & b & "0"; простое и легкое выражение убивало двух зайцев, а я даже и не сообразил так сделать. спасибо вам огромное за помощь. видимо мне нужно ещё больше практики и чтения. Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 May 23, 2017 Posted May 23, 2017 · Report post Есть ли какой особый смысл в строчке это каноническое выражение, rising_edge(clk) - это на самом деле макрос за которым стоит это выражение. видимо мне нужно ещё больше практики и чтения. Коль вы в начале пути, может стоит сразу свернуть на верную дорожку verilog:)? Quote Share this post Link to post Share on other sites More sharing options...
artyombn 0 May 23, 2017 Posted May 23, 2017 · Report post Коль вы в начале пути, может стоит сразу свернуть на верную дорожку verilog:)? я слышал об этом языке и не 1 раз) а что на VHDL никто уже не работает? Quote Share this post Link to post Share on other sites More sharing options...
andrew_b 23 May 23, 2017 Posted May 23, 2017 · Report post это каноническое выражение, rising_edge(clk) - это на самом деле макросНа самом деле это функция. В VHDL нет макросов. Коль вы в начале пути, может стоит сразу свернуть на верную дорожку verilog:)?А может не надо всякий раз в теме про VHDL говорить про переход на Verilog? Там своих тараканов полно. Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 May 23, 2017 Posted May 23, 2017 · Report post А может не надо всякий раз в теме про VHDL говорить про переход на Verilog? Там своих тараканов полно. А может надо, если это мировая тенденция, а новички не знают? Пусть на VHDL остаются только те кто осознано по какой-то причине сделал выбор. А человеку с десятком постов просто преступно не сказать что мир изменился. я слышал об этом языке и не 1 раз) а что на VHDL никто уже не работает? Работает... в Америке вон есть мужик который организовал фирму по поддержке программ на мертвом языке, там все сотрудники 76+, потому что другие просто не знают этого языка:) Но вы уверены что хотите выйти на рынок и конкурировать в таком разрезе? Просто отвечаем на вопрос. Какая самая популярная и развитая методология верификации RTL? - ответ UVM На каком языке она основана? - ответ SystemVerilog Лезем на гитхаб и смотрим свежее и новое, какой-нибудь risc V, на каком языке? VHDL? - да фиг там. SystemVerilog! По мне выбор очевиден, независимо от тараканов. На самом деле это функция. В VHDL нет макросов. незначительные детали.... Quote Share this post Link to post Share on other sites More sharing options...
Maverick_ 17 May 23, 2017 Posted May 23, 2017 · Report post какая разница на каком языке писать ... Главное понимать (читать) оба языка... Язык это всего лишь средство, главное понимание алгоритмов обработки и хорошее знание цифровой схемотехники, знания современных интерфейсов/шин. Также надо иметь другое мышление по сравнению с С/С++ Если нормальная команда, то для RTL дизайна подходят оба языка, если достигается результат при этом. Для симуляции SystemVerilog уже уступает некоторым средствам, но такое нужно когда требуется покрытие практически 100% (чаще при проектировании ASIC)... Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 May 23, 2017 Posted May 23, 2017 · Report post Язык это всего лишь средство, главное понимание алгоритмов обработки и хорошее знание цифровой схемотехники. Тоже проповедую данную истину, но уже несколько раз прошелся по граблям signal1 & signal2 от VHDL, кто придумал что это конкатенация%))))... Quote Share this post Link to post Share on other sites More sharing options...