Maverick_ 15 8 февраля, 2008 Опубликовано 8 февраля, 2008 (изменено) · Жалоба Доброго времени суток! помогите пожалуйста перевести с 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 для листингов программ Изменено 8 февраля, 2008 пользователем Doka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Doka 4 8 февраля, 2008 Опубликовано 8 февраля, 2008 · Жалоба по вашей же ссылке: >> 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)" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 10 февраля, 2008 Опубликовано 10 февраля, 2008 (изменено) · Жалоба Извините, но я там не нашел на vhdl "32-Bit Fixed Point Divide". :( Изменено 10 февраля, 2008 пользователем ZMaverickZ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 12 февраля, 2008 Опубликовано 12 февраля, 2008 (изменено) · Жалоба Доброго времени суток! Очень прошу помогите перевести пожалуйста выше приведенный код на vhdl "32-Bit Fixed Point Divide". Очень нужен , пожалуйста, в verilog я ничего не понимаю :crying: Изменено 12 февраля, 2008 пользователем ZMaverickZ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VitalyM4 0 12 февраля, 2008 Опубликовано 12 февраля, 2008 · Жалоба Доброго времени суток! Очень прошу помогите перевести пожалуйста выше приведенный код на vhdl "32-Bit Fixed Point Divide". Очень нужен , пожалуйста, в verilog я ничего не понимаю :crying: Зачем переводить! Возьмите из аттача библиотеку и пользуйтесь на здоровье. Синтезится я пробовал когда-то. Fixed.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 13 марта, 2008 Опубликовано 13 марта, 2008 (изменено) · Жалоба Зачем переводить! Возьмите из аттача библиотеку и пользуйтесь на здоровье. Синтезится я пробовал когда-то. Я ничего не понял в этой библиотеке. Очень прошу помогите, уже горит!!!!! поискал в интернете наткнулся на http://www.kip.uni-heidelberg.de/ti/TRD/al...ydiv/index.html просинтезировал и промоделировал результат с калькулятором сходится :) Но хотелось бы иметь варианты и другие. Изменено 13 марта, 2008 пользователем ZMaverickZ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ender 0 14 марта, 2008 Опубликовано 14 марта, 2008 · Жалоба Я ничего не понял в этой библиотеке. Очень прошу помогите, уже горит!!!!! поискал в интернете наткнулся на http://www.kip.uni-heidelberg.de/ti/TRD/al...ydiv/index.html просинтезировал и промоделировал результат с калькулятором сходится :) Но хотелось бы иметь варианты и другие. Первый и один из основных вариантов. Аппаратный делитель в Xilinx Core Generator: Math Functions\Dividers. Даташит понятный, есть в комплекте) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 17 марта, 2008 Опубликовано 17 марта, 2008 · Жалоба Первый и один из основных вариантов. Аппаратный делитель в Xilinx Core Generator: Math Functions\Dividers. Даташит понятный, есть в комплекте) Спасибо! Мне нужен открытый код, заказчик требует!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
amir 0 28 марта, 2008 Опубликовано 28 марта, 2008 · Жалоба 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 28 марта, 2008 Опубликовано 28 марта, 2008 · Жалоба 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; Спасибо! :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) --> Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ender 0 30 марта, 2008 Опубликовано 30 марта, 2008 · Жалоба 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_ 15 31 марта, 2008 Опубликовано 31 марта, 2008 · Жалоба Уважаемый Maverick! Возьмите корку Dividers из CoreGenerator-а, зарегистрируйте ее под лицензией source и посмотрите исходный код! Впервые слышу чтобы CoreGenerator давал исходный код!!! Извини за глупый вопрос, ты уверен? Ради этого создал проект модуля деления двух чисел с остатком. Открыл папку с проектом просмотрел все файлы, что создал CoreGenerator но исходного кода я не увидел!!! :( P. S. Пользуюсь Xilinx ISE 8.02.03 полностью лицензионным. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ender 0 31 марта, 2008 Опубликовано 31 марта, 2008 · Жалоба Впервые слышу чтобы CoreGenerator давал исходный код!!! Извини за глупый вопрос, ты уверен? Ради этого создал проект модуля деления двух чисел с остатком. Открыл папку с проектом просмотрел все файлы, что создал CoreGenerator но исходного кода я не увидел!!! :( P. S. Пользуюсь Xilinx ISE 8.02.03 полностью лицензионным. Во-первых, если есть лицензия типа source к корке, то можно получить доступ к ее исходникам. Они просто становятся декриптованы и все. Во-вторых, можно увидеть вообще код CoreGen Library, это фишка видимо такая) Если запустить компиляцию библиотек под внешний ModelSim, то в папке, куда складываются откомпилированные библиотеки, кладется очень большой (12 метров, вроде как) vhd-файл с полными исходниками CoreLib. Забавная такая особенность) Компиляцию можно запустить через программу compxlibgui.exe, лежащую в bin\nt. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 31 марта, 2008 Опубликовано 31 марта, 2008 · Жалоба Во-первых, если есть лицензия типа source к корке, то можно получить доступ к ее исходникам. Они просто становятся декриптованы и все. Во-вторых, можно увидеть вообще код CoreGen Library, это фишка видимо такая) Если запустить компиляцию библиотек под внешний ModelSim, то в папке, куда складываются откомпилированные библиотеки, кладется очень большой (12 метров, вроде как) vhd-файл с полными исходниками CoreLib. Забавная такая особенность) Компиляцию можно запустить через программу compxlibgui.exe, лежащую в bin\nt. Я этого не знал. Тогда просьба. Вы можете дать эти исходники. Мне нужен 32бит/32бит и вывод остатка 32бит(дробный). Буду очень признателен если еще и на VHDL Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 31 марта, 2008 Опубликовано 31 марта, 2008 · Жалоба Во-вторых, можно увидеть вообще код CoreGen Library, это фишка видимо такая) Если запустить компиляцию библиотек под внешний ModelSim, то в папке, куда складываются откомпилированные библиотеки, кладется очень большой (12 метров, вроде как) vhd-файл с полными исходниками CoreLib. Забавная такая особенность) Какая особенность? Сорцы CoreLib доступны: $XILINX/vhdl/src/XilinxCoreLib. Но эта библиотека симуляционная. Её можно посмотреть, но толку от этого мало. В ней в полный рост используется несинтезируемое подмножество VHDL. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться