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

Доброго времени суток! помогите пожалуйста перевести с Verilog на VHDL. это модуль был взят с

 

http://groups.google.com/group/comp.lang.v...5b1b43e9c222c0f

 

 

The divide.v file shown below does not seem to work, i.e. quotient

stays at '0' and remainder gives incorrect reading regardless of input

values !

 

 

-------------------------------------------------------------------------------------------------------------------------------------------------------

//
// File divide.v
//
// Unsigned/Signed division based on Patterson and Hennessy's
algorithm.
// Description: Calculates quotient.  The "sign" input determines
whether
// signs (two's complement) should be taken into consideration.
//

module divide(
      ready,
      quotient,
      remainder,
      dividend,
      divider,
      sign,
      clk
      );

   input                clk;
   input                sign;
   input [31:0]         dividend, divider;
   output [31:0]        quotient, remainder;
   output               ready;

   reg [31:0]           quotient, quotient_temp;
   reg [63:0]           dividend_copy, divider_copy, diff;
   reg                  negative_output;

   wire [31:0]          remainder = (!negative_output) ?
                             dividend_copy[31:0] :
                             ~dividend_copy[31:0] + 1'b1;

   reg [5:0]            bit;
   wire                 ready = !bit;

   initial bit = 0;
   initial negative_output = 0;

   always @( posedge clk )

     if( ready ) begin

        bit = 6'd32;
        quotient = 0;
        quotient_temp = 0;
        dividend_copy = (!sign || !dividend[31]) ?
                        {32'd0,dividend} :
                        {32'd0,~dividend + 1'b1};
        divider_copy = (!sign || !divider[31]) ?
                       {1'b0,divider,31'd0} :
                       {1'b0,~divider + 1'b1,31'd0};

        negative_output = sign &&
                          ((divider[31] && !dividend[31])
                        ||(!divider[31] && dividend[31]));

     end
     else if ( bit > 0 ) begin

        diff = dividend_copy - divider_copy;

        quotient_temp = quotient_temp << 1;

        if( !diff[63] ) begin

           dividend_copy = diff;
           quotient_temp[0] = 1'd1;

        end

        quotient = (!negative_output) ?
                   quotient_temp :
                   ~quotient_temp + 1'b1;

        divider_copy = divider_copy >> 1;
        bit = bit - 1'b1;

     end
endmodule

 

причина правки: используйте теги CODE для листингов программ

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

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


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

по вашей же ссылке:

>> You'll find one in the fixed point vhdl packages: http://www.eda.org/fphdl/

>> It works by making the number into an integer divider.

 

а там: "fixed_pkg_c.vhdl - Fixed point math package and body (Synthesizable VHDL-93 compatable version)"

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


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

Извините, но я там не нашел на vhdl "32-Bit Fixed Point Divide". :(

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

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


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

Доброго времени суток! Очень прошу помогите перевести пожалуйста выше приведенный код на vhdl "32-Bit Fixed Point Divide". Очень нужен :help: , пожалуйста, в verilog я ничего не понимаю :crying:

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

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


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

Доброго времени суток! Очень прошу помогите перевести пожалуйста выше приведенный код на vhdl "32-Bit Fixed Point Divide". Очень нужен :help: , пожалуйста, в verilog я ничего не понимаю :crying:

Зачем переводить! Возьмите из аттача библиотеку и пользуйтесь на здоровье. Синтезится я пробовал когда-то.

Fixed.rar

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


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

Зачем переводить! Возьмите из аттача библиотеку и пользуйтесь на здоровье. Синтезится я пробовал когда-то.

 

:help: Я ничего не понял в этой библиотеке. Очень прошу помогите, уже горит!!!!! :help::help::help:

 

поискал в интернете наткнулся на http://www.kip.uni-heidelberg.de/ti/TRD/al...ydiv/index.html

 

просинтезировал и промоделировал результат с калькулятором сходится :) Но хотелось бы иметь варианты и другие. :help:

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

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


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

:help: Я ничего не понял в этой библиотеке. Очень прошу помогите, уже горит!!!!! :help::help::help:

 

поискал в интернете наткнулся на http://www.kip.uni-heidelberg.de/ti/TRD/al...ydiv/index.html

 

просинтезировал и промоделировал результат с калькулятором сходится :) Но хотелось бы иметь варианты и другие. :help:

 

Первый и один из основных вариантов. Аппаратный делитель в Xilinx Core Generator: Math Functions\Dividers. Даташит понятный, есть в комплекте)

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


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

Первый и один из основных вариантов. Аппаратный делитель в Xilinx Core Generator: Math Functions\Dividers. Даташит понятный, есть в комплекте)

 

Спасибо! Мне нужен открытый код, заказчик требует!!!

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


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

why don't you use xhdl?

 

ENTITY divide IS

PORT (

ready : OUT std_logic;

quotient : OUT std_logic_vector(31 DOWNTO 0);

remainder : OUT std_logic_vector(31 DOWNTO 0);

dividend : IN std_logic_vector(31 DOWNTO 0);

divider : IN std_logic_vector(31 DOWNTO 0);

sign : IN std_logic;

clk : IN std_logic);

END divide;

 

ARCHITECTURE arch OF divide IS

 

 

SIGNAL quotient_temp : std_logic_vector(31 DOWNTO 0);

SIGNAL dividend_copy : std_logic_vector(63 DOWNTO 0);

SIGNAL divider_copy : std_logic_vector(63 DOWNTO 0);

SIGNAL diff : std_logic_vector(63 DOWNTO 0);

SIGNAL negative_output : std_logic;

SIGNAL temp_xhdl4 : std_logic_vector(31 DOWNTO 0);

SIGNAL remainder_xhdl2 : std_logic_vector(31 DOWNTO 0);

SIGNAL bit : std_logic_vector(5 DOWNTO 0);

SIGNAL ready_xhdl3 : std_logic;

SIGNAL temp_xhdl5 : std_logic_vector(63 DOWNTO 0);

SIGNAL temp_xhdl6 : std_logic_vector(63 DOWNTO 0);

SIGNAL temp_xhdl7 : std_logic_vector(31 DOWNTO 0);

SIGNAL quotient_xhdl1 : std_logic_vector(31 DOWNTO 0);

 

BEGIN

quotient <= quotient_xhdl1;

remainder <= remainder_xhdl2;

ready <= ready_xhdl3;

temp_xhdl4 <= dividend_copy(31 DOWNTO 0) WHEN (NOT negative_output) = '1' ELSE NOT dividend_copy(31 DOWNTO 0) + "00000000000000000000000000000001";

remainder_xhdl2 <= temp_xhdl4 ;

ready_xhdl3 <= NOT bit ;

 

PROCESS

VARIABLE xhdl_initial : BOOLEAN := TRUE;

BEGIN

IF (xhdl_initial) THEN

bit <= "000000";

xhdl_initial := FALSE;

ELSE

WAIT;

END IF;

END PROCESS;

 

PROCESS

VARIABLE xhdl_initial : BOOLEAN := TRUE;

BEGIN

IF (xhdl_initial) THEN

negative_output <= '0';

xhdl_initial := FALSE;

ELSE

WAIT;

END IF;

END PROCESS;

temp_xhdl5 <= "00000000000000000000000000000000" & dividend WHEN (NOT sign OR NOT dividend(31)) = '1' ELSE "00000000000000000000000000000000" & NOT dividend + "00000000000000000000000000000001";

temp_xhdl6 <= '0' & divider & "0000000000000000000000000000000" WHEN (NOT sign OR NOT divider(31)) = '1' ELSE '0' & NOT divider + "00000000000000000000000000000001" & "0000000000000000000000000000000";

temp_xhdl7 <= quotient_temp WHEN (NOT negative_output) = '1' ELSE NOT quotient_temp + "00000000000000000000000000000001";

 

PROCESS

BEGIN

WAIT UNTIL (clk'EVENT AND clk = '1');

IF (ready_xhdl3 = '1') THEN

bit <= "100000";

quotient_xhdl1 <= "00000000000000000000000000000000";

quotient_temp <= "00000000000000000000000000000000";

dividend_copy <= temp_xhdl5;

divider_copy <= temp_xhdl6;

negative_output <= sign AND ((divider(31) AND NOT dividend(31)) OR (NOT divider(31) AND dividend(31)));

ELSE

IF (bit > "000000") THEN

diff <= dividend_copy - divider_copy;

quotient_temp <= ShiftLeft(quotient_temp, 1);

IF (NOT diff(63) = '1') THEN

dividend_copy <= diff;

quotient_temp(0) <= '1';

END IF;

quotient_xhdl1 <= temp_xhdl7;

divider_copy <= ShiftRight(divider_copy, 1);

bit <= bit - "000001";

END IF;

END IF;

END PROCESS;

 

END arch;

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


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

Library ieee ;

use ieee.std_logic_1164.all ;

use ieee.std_logic_arith.all ;

use ieee.numeric_std.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

 

 

ENTITY divide IS

PORT (

ready : OUT std_logic;

quotient : OUT std_logic_vector(31 DOWNTO 0);

remainder : OUT std_logic_vector(31 DOWNTO 0);

dividend : IN std_logic_vector(31 DOWNTO 0);

divider : IN std_logic_vector(31 DOWNTO 0);

sign : IN std_logic;

clk : IN std_logic);

END divide;

 

ARCHITECTURE arch OF divide IS

 

 

SIGNAL quotient_temp : std_logic_vector(31 DOWNTO 0);

SIGNAL dividend_copy : std_logic_vector(63 DOWNTO 0);

SIGNAL divider_copy : std_logic_vector(63 DOWNTO 0);

SIGNAL diff : std_logic_vector(63 DOWNTO 0);

SIGNAL negative_output : std_logic;

SIGNAL temp_xhdl4 : std_logic_vector(31 DOWNTO 0);

SIGNAL remainder_xhdl2 : std_logic_vector(31 DOWNTO 0);

SIGNAL bit : std_logic_vector(5 DOWNTO 0);

SIGNAL ready_xhdl3 : std_logic;

SIGNAL temp_xhdl5 : std_logic_vector(63 DOWNTO 0);

SIGNAL temp_xhdl6 : std_logic_vector(63 DOWNTO 0);

SIGNAL temp_xhdl7 : std_logic_vector(31 DOWNTO 0);

SIGNAL quotient_xhdl1 : std_logic_vector(31 DOWNTO 0);

 

BEGIN

quotient <= quotient_xhdl1;

remainder <= remainder_xhdl2;

ready <= ready_xhdl3;

temp_xhdl4 <= dividend_copy(31 DOWNTO 0) WHEN (NOT negative_output) = '1' ELSE NOT dividend_copy(31 DOWNTO 0) + "00000000000000000000000000000001";

remainder_xhdl2 <= temp_xhdl4 ;

ready_xhdl3 <= NOT bit ;

 

PROCESS

VARIABLE xhdl_initial : BOOLEAN := TRUE;

BEGIN

IF (xhdl_initial) THEN

bit <= "000000";

xhdl_initial := FALSE;

ELSE

WAIT;

END IF;

END PROCESS;

 

PROCESS

VARIABLE xhdl_initial : BOOLEAN := TRUE;

BEGIN

IF (xhdl_initial) THEN

negative_output <= '0';

xhdl_initial := FALSE;

ELSE

WAIT;

END IF;

END PROCESS;

temp_xhdl5 <= "00000000000000000000000000000000" & dividend WHEN (NOT sign OR NOT dividend(31)) = '1' ELSE "00000000000000000000000000000000" & NOT dividend + "00000000000000000000000000000001";

temp_xhdl6 <= '0' & divider & "0000000000000000000000000000000" WHEN (NOT sign OR NOT divider(31)) = '1' ELSE '0' & NOT divider + "00000000000000000000000000000001" & "0000000000000000000000000000000";

temp_xhdl7 <= quotient_temp WHEN (NOT negative_output) = '1' ELSE NOT quotient_temp + "00000000000000000000000000000001";

 

PROCESS

BEGIN

WAIT UNTIL (clk'EVENT AND clk = '1');

IF (ready_xhdl3 = '1') THEN

bit <= "100000";

quotient_xhdl1 <= "00000000000000000000000000000000";

quotient_temp <= "00000000000000000000000000000000";

dividend_copy <= temp_xhdl5;

divider_copy <= temp_xhdl6;

negative_output <= sign AND ((divider(31) AND NOT dividend(31)) OR (NOT divider(31) AND dividend(31)));

ELSE

IF (bit > "000000") THEN

diff <= dividend_copy - divider_copy;

quotient_temp <= ShiftLeft(quotient_temp, 1);

IF (NOT diff(63) = '1') THEN

dividend_copy <= diff;

quotient_temp(0) <= '1';

END IF;

quotient_xhdl1 <= temp_xhdl7;

divider_copy <= ShiftRight(divider_copy, 1);

bit <= bit - "000001";

END IF;

END IF;

END PROCESS;

 

END arch;

 

 

Спасибо! :help: :crying: Но у меня Xilinx ISE 8.2.03 пишет следующие ошибки при попытке синтеза

 

=========================================================================

* HDL Compilation *

=========================================================================

Compiling vhdl file "C:/PROJECTS_XILINXS/qqq/test.vhd" in Library work.

Entity <divide> compiled.

ERROR:HDLParsers:800 - "C:/PROJECTS_XILINXS/qqq/test.vhd" Line 42. Type of ready_xhdl3 is incompatible with type of NOT.

ERROR:HDLParsers:3312 - "C:/PROJECTS_XILINXS/qqq/test.vhd" Line 82. Undefined symbol 'ShiftLeft'.

ERROR:HDLParsers:1209 - "C:/PROJECTS_XILINXS/qqq/test.vhd" Line 82. ShiftLeft: Undefined symbol (last report in this block)

ERROR:HDLParsers:3312 - "C:/PROJECTS_XILINXS/qqq/test.vhd" Line 88. Undefined symbol 'ShiftRight'.

ERROR:HDLParsers:1209 - "C:/PROJECTS_XILINXS/qqq/test.vhd" Line 88. ShiftRight: Undefined symbol (last report in this block)

-->

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


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

With due respect, amir! What do you want to do with this string:

ready_xhdl3 <= NOT bit ;

 

where we can see that the type of bit - std_logic_vector and type of ready_xhdl3 - std_logic? ;)

 

Это я так, тоже решил по английски ответить)

 

Уважаемый Maverick! Возьмите корку Dividers из CoreGenerator-а, зарегистрируйте ее под лицензией source и посмотрите исходный код!

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


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

Уважаемый Maverick! Возьмите корку Dividers из CoreGenerator-а, зарегистрируйте ее под лицензией source и посмотрите исходный код!

 

 

Впервые слышу чтобы CoreGenerator давал исходный код!!! Извини за глупый вопрос, ты уверен? Ради этого создал проект модуля деления двух чисел с остатком. Открыл папку с проектом просмотрел все файлы, что создал CoreGenerator но исходного кода я не увидел!!! :(

 

P. S. Пользуюсь Xilinx ISE 8.02.03 полностью лицензионным.

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


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

Впервые слышу чтобы CoreGenerator давал исходный код!!! Извини за глупый вопрос, ты уверен? Ради этого создал проект модуля деления двух чисел с остатком. Открыл папку с проектом просмотрел все файлы, что создал CoreGenerator но исходного кода я не увидел!!! :(

 

P. S. Пользуюсь Xilinx ISE 8.02.03 полностью лицензионным.

 

Во-первых, если есть лицензия типа source к корке, то можно получить доступ к ее исходникам. Они просто становятся декриптованы и все.

 

Во-вторых, можно увидеть вообще код CoreGen Library, это фишка видимо такая) Если запустить компиляцию библиотек под внешний ModelSim, то в папке, куда складываются откомпилированные библиотеки, кладется очень большой (12 метров, вроде как) vhd-файл с полными исходниками CoreLib. Забавная такая особенность)

 

Компиляцию можно запустить через программу compxlibgui.exe, лежащую в bin\nt.

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


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

Во-первых, если есть лицензия типа source к корке, то можно получить доступ к ее исходникам. Они просто становятся декриптованы и все.

 

Во-вторых, можно увидеть вообще код CoreGen Library, это фишка видимо такая) Если запустить компиляцию библиотек под внешний ModelSim, то в папке, куда складываются откомпилированные библиотеки, кладется очень большой (12 метров, вроде как) vhd-файл с полными исходниками CoreLib. Забавная такая особенность)

 

Компиляцию можно запустить через программу compxlibgui.exe, лежащую в bin\nt.

Я этого не знал.

Тогда просьба. Вы можете дать эти исходники. Мне нужен 32бит/32бит и вывод остатка 32бит(дробный).

Буду очень признателен если еще и на VHDL

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


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

Во-вторых, можно увидеть вообще код CoreGen Library, это фишка видимо такая) Если запустить компиляцию библиотек под внешний ModelSim, то в папке, куда складываются откомпилированные библиотеки, кладется очень большой (12 метров, вроде как) vhd-файл с полными исходниками CoreLib. Забавная такая особенность)
Какая особенность? Сорцы CoreLib доступны: $XILINX/vhdl/src/XilinxCoreLib. Но эта библиотека симуляционная. Её можно посмотреть, но толку от этого мало. В ней в полный рост используется несинтезируемое подмножество VHDL.

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


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

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

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

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

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

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

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

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

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

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