Jump to content
    

тактовый умножитель 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

 

 

Share this post


Link to post
Share on other sites

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

Edited by artyombn

Share this post


Link to post
Share on other sites

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

 

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

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

 

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

 

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

 

 

Share this post


Link to post
Share on other sites

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

 

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

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

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

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

 

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

 

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

 

Share this post


Link to post
Share on other sites

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

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

 

Share this post


Link to post
Share on other sites

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

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

 

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

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

 

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

 

 

Share this post


Link to post
Share on other sites

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

Эхе-хе.

Вот вам кот.

 

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

 

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;

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Эхе-хе.

Вот вам кот.

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

 

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

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

 

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

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

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

 

 

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

- ответ UVM

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

- ответ SystemVerilog

 

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

 

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

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

Share this post


Link to post
Share on other sites

 

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

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

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

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

 

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

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

Share this post


Link to post
Share on other sites

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

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

 

 

 

 

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...