Jump to content

    
Sign in to follow this  

Recommended Posts

Доброго времени суток! помогите пожалуйста перевести с 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 для листингов программ

Edited by Doka

Share this post


Link to post
Share on other sites

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

>> 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)"

Share this post


Link to post
Share on other sites

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

Edited by ZMaverickZ

Share this post


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

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

Fixed.rar

Share this post


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

 

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

 

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

 

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

Edited by ZMaverickZ

Share this post


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

 

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

 

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

 

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

Share this post


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

 

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

Share this post


Link to post
Share on other sites

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;

Share this post


Link to post
Share on other sites
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)

-->

Share this post


Link to post
Share on other sites

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 и посмотрите исходный код!

Share this post


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

 

 

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

 

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

Share this post


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

 

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

 

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

 

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

 

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

Share this post


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

 

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

 

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

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

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

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

Share this post


Link to post
Share on other sites
Во-вторых, можно увидеть вообще код CoreGen Library, это фишка видимо такая) Если запустить компиляцию библиотек под внешний ModelSim, то в папке, куда складываются откомпилированные библиотеки, кладется очень большой (12 метров, вроде как) vhd-файл с полными исходниками CoreLib. Забавная такая особенность)
Какая особенность? Сорцы CoreLib доступны: $XILINX/vhdl/src/XilinxCoreLib. Но эта библиотека симуляционная. Её можно посмотреть, но толку от этого мало. В ней в полный рост используется несинтезируемое подмножество 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.

Sign in to follow this