Перейти к содержанию
    

тактовый умножитель VHDL

изначально он не может понять что такое 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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

хочется сэкономить все, до последнего такта. поэтому я начал прописывать действия при 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;

14044010.png

 

но не пойму почему мне не выдает результат bp. когда load = 1 и по такту мы вроде bp записали, потом его используем. оно же никуда не девается. а на вейформе оно неопределенно.

хотя я понял почему. мы как записываем, так и сдвигаем одновременно bp в одном такте.сейчас попробую исправить

 

p.s. а это вообще возможно?? что-то у меня не получается.

Изменено пользователем artyombn

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хотите экономить каждый так. Меняйте мышление.

 

Вы сейчас думаете моментом сразу после фронта клока. Выставляете данные для этого момента, и как результат получаете все свои ответы на следующем такте.

А думать надо моментом сразу после фронта, и выставлять данные для следующего.

 

То есть на самом деле вам нужно создавать комбинаторную часть схемы, а в регистры просто щелкать результат.

 

сейчас вы сохраняете операнды по сигналу загрузки и начинаете считать. При этом операнды и сигнал загрузки появляются появились сразу после фронта. И вы можете на следующем же фронте уже сохранить первый такт счета.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хотите экономить каждый так. Меняйте мышление.

 

Вы сейчас думаете моментом сразу после фронта клока. Выставляете данные для этого момента, и как результат получаете все свои ответы на следующем такте.

А думать надо моментом сразу после фронта, и выставлять данные для следующего.

то есть мне надо работать по спаду такта? можете показать самый элементарный пример, где работа идет моментом после фронта?

То есть на самом деле вам нужно создавать комбинаторную часть схемы, а в регистры просто щелкать результат.

 

сейчас вы сохраняете операнды по сигналу загрузки и начинаете считать. При этом операнды и сигнал загрузки появляются появились сразу после фронта. И вы можете на следующем же фронте уже сохранить первый такт счета.

 

я не понимаю как должна выглядеть эта комбинаторная схема. если бы я понимал поболее, я бы, наверное, понял о чем вы ведете речь. все элементарные описания по vhdl мне мало помогают, хотя я штудирую их понемногу.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я не понимаю как... мне мало помогают, хотя я штудирую их понемногу.

Смотрите личную почту...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

то есть мне надо работать по спаду такта? можете показать самый элементарный пример, где работа идет моментом после фронта?

не работать, а думать:) это трудно объяснить, наверное легче становится с опытом

 

В вашем случае по Load вы сохраняете операнды и готовитесь считать. Но в реальности операнды которые вы сохраняете где-то снаружи наверняка уже в регистрах и вы просто добавляете лишний такт.

В вашем случае по Load уже можно делать первый акт счета, то есть во временный результат сохранить один операнд, если младший бит другого 1. А операнды сохранить сохранить сразу сдвинутым на 1 бит, один влево, другой в право. А дальше продолжать двигать операнды и прибавлять к временному результату первый операнд, если младший бит второго 1.

 

При этом временный результат надо и выдавать наружу, снабдив его сигналом out_enable, чтобы внешние устройства могли понять когда он наконец сохранил верное значение. Так вы не потеряете еще такт на сохранение результата.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не получается.

Эхе-хе.

Вот вам кот.

 

Можно гораздо короче и изящнее написать с использованием переменных, но для начинающего это вредно.

 

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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть ли какой особый смысл в строчке

wait until clk'event and clk = '1';

Или просто Вам так удобнее ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эхе-хе.

Вот вам кот.

а я даже и не подумал об этом:

 bp <= "0000000" & b & "0";

простое и легкое выражение убивало двух зайцев, а я даже и не сообразил так сделать.

спасибо вам огромное за помощь. видимо мне нужно ещё больше практики и чтения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть ли какой особый смысл в строчке

это каноническое выражение, rising_edge(clk) - это на самом деле макрос за которым стоит это выражение.

 

видимо мне нужно ещё больше практики и чтения.

Коль вы в начале пути, может стоит сразу свернуть на верную дорожку verilog:)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Коль вы в начале пути, может стоит сразу свернуть на верную дорожку verilog:)?

я слышал об этом языке и не 1 раз) а что на VHDL никто уже не работает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это каноническое выражение, rising_edge(clk) - это на самом деле макрос
На самом деле это функция. В VHDL нет макросов.

 

Коль вы в начале пути, может стоит сразу свернуть на верную дорожку verilog:)?
А может не надо всякий раз в теме про VHDL говорить про переход на Verilog? Там своих тараканов полно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А может не надо всякий раз в теме про VHDL говорить про переход на Verilog? Там своих тараканов полно.

А может надо, если это мировая тенденция, а новички не знают? Пусть на VHDL остаются только те кто осознано по какой-то причине сделал выбор. А человеку с десятком постов просто преступно не сказать что мир изменился.

 

я слышал об этом языке и не 1 раз) а что на VHDL никто уже не работает?

Работает... в Америке вон есть мужик который организовал фирму по поддержке программ на мертвом языке, там все сотрудники 76+, потому что другие просто не знают этого языка:)

Но вы уверены что хотите выйти на рынок и конкурировать в таком разрезе?

 

 

Просто отвечаем на вопрос. Какая самая популярная и развитая методология верификации RTL?

- ответ UVM

На каком языке она основана?

- ответ SystemVerilog

 

Лезем на гитхаб и смотрим свежее и новое, какой-нибудь risc V, на каком языке? VHDL? - да фиг там. SystemVerilog! По мне выбор очевиден, независимо от тараканов.

 

На самом деле это функция. В VHDL нет макросов.

незначительные детали....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

какая разница на каком языке писать ...

Главное понимать (читать) оба языка...

Язык это всего лишь средство, главное понимание алгоритмов обработки и хорошее знание цифровой схемотехники, знания современных интерфейсов/шин.

Также надо иметь другое мышление по сравнению с С/С++

 

Если нормальная команда, то для RTL дизайна подходят оба языка, если достигается результат при этом.

Для симуляции SystemVerilog уже уступает некоторым средствам, но такое нужно когда требуется покрытие практически 100% (чаще при проектировании ASIC)...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Язык это всего лишь средство, главное понимание алгоритмов обработки и хорошее знание цифровой схемотехники.

Тоже проповедую данную истину, но уже несколько раз прошелся по граблям signal1 & signal2 от VHDL, кто придумал что это конкатенация%))))...

 

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...