Михей91 0 December 4, 2012 Posted December 4, 2012 (edited) · Report post Muscat, мануальчики мануальчики)))) - Вопрос по регистрам снимаю, убрал я FDP чтобы не усложнять себе жизнь, все строю на FDC. - По поводу ADSU4. Первый ADSU4 у меня реализует функцию DEC (CL-1), т.е. вычитание. Согласно таблице логики на входы А мы подаем наше текущее состояние Q, например 0000. Вход ADD мы должны поставить в состояние 0, чтобы происходил вычет, также CI, CO тоже должны быть равны 0 и тогда мы из А будем вычитать В. На этом мое понимание заканчивается о том что такое В и откуда мы его берем. Второй ADSU4 реализует функцию INC (CL+1), т.е. сложение. Далее все аналогично, только на ADD, CI и CO мы теперь подаем 1 и в итоге получим А+В. Или получается что мы на В постоянно 0001 подаем, чтобы ее плюсовать или вычитать? А вот что с OFL делать я не понял... Edited December 4, 2012 by Михей91 Quote Share this post Link to post Share on other sites More sharing options...
Михей91 0 December 4, 2012 Posted December 4, 2012 (edited) · Report post Собственно симулятор не заработал... ERROR:DesignEntry:239 - Incorrect bus tap at (640 160, 544 160); destination branch "DATA_O0" is not part of the source branch "DATA_O(3:0)". ERROR:DesignEntry:239 - Incorrect bus tap at (640 352, 544 352); destination branch "DATA_O1" is not part of the source branch "DATA_O(3:0)". ERROR:DesignEntry:239 - Incorrect bus tap at (640 544, 544 544); destination branch "DATA_O2" is not part of the source branch "DATA_O(3:0)". ERROR:DesignEntry:239 - Incorrect bus tap at (640 752, 544 752); destination branch "DATA_O3" is not part of the source branch "DATA_O(3:0)". ERROR:DesignEntry:239 - Incorrect bus tap at (1248 240, 1152 240); destination branch "SEQ0" is not part of the source branch "SEQ(3:0)". ERROR:DesignEntry:239 - Incorrect bus tap at (1248 656, 1152 656); destination branch "SEQ1" is not part of the source branch "SEQ(3:0)". ERROR:DesignEntry:239 - Incorrect bus tap at (1248 1056, 1152 1056); destination branch "SEQ2" is not part of the source branch "SEQ(3:0)". ERROR:DesignEntry:239 - Incorrect bus tap at (1248 1488, 1152 1488); destination branch "SEQ3" is not part of the source branch "SEQ(3:0)". ERROR:ProjectMgmt:387 - TOE: ITclInterp::ExecuteCmd gave Tcl result 'can't read "iFileType": no such variable'. Tcl_ErrnoId: unknown error Tcl_ErrnoMsg: No error _cmd: ::xilinx::Dpm::dpm_chTransformExecuteNoClean dpm_ecsConvertSchematics $piThisInterface errorInfo: can't read "iFileType": no such variable while executing "if { $iFileType eq "UNKNOWN" } { continue ; # unknown is just ignored, its probably .txt }" ("foreach" body line 3) invoked from within "foreach sItem $lOutputFileList { if { ![dpm_parseOutputFile $sItem $iDesign sFile iFileType fileOrigination] } { if { $iFile..." (procedure "dpm_chTransformOutput" line 15) invoked from within "dpm_chTransformOutput $piTranInst $lOutputFileList" (procedure "dpm_ecsConvertSchematics" line 128) invoked from within "$sCmd $iTransformInstance $sCmdArgs" (procedure "dpm_chTransformExecuteEngine" line 100) invoked from within "dpm_chTransformExecuteEngine $sFlowProc $iInterface $bRunTransformWithEmptyInputSet false " (procedure "::xilinx::Dpm::dpm_chTransformExecuteNoClean" line 3) invoked from within "::xilinx::Dpm::dpm_chTransformExecuteNoClean dpm_ecsConvertSchematics $piThisInterface" Код главного файла: `timescale 1ns / 1ps module revers( input wire b0, input wire b1, input wire b2, input wire b3, input wire ci_dec, input wire add_dec, input wire ci_inc, input wire add_inc, output wire co_dec, output wire ofl_dec, output wire co_inc, output wire ofl_inc, input wire clk, input wire rst, input wire load, input wire up, input wire oe, input wire [3:0] data_i, output wire [3:0] data_o, output wire [3:0] seq ); // Sch.* Module Connection: revers_sch SCH_EXAMPLE( .B0(b0), .B1(b1), .B2(b2), .B3(b3), .CI_DEC(ci_dec), .ADD_DEC(add_dec), .CI_INC(ci_inc), .ADD_INC(add_inc), .CO_DEC(co_dec), .OFL_DEC(ofl_dec), .CO_INC(co_inc), .OFL_INC(ofl_inc), .CLK(clk), .RST(rst), .LOAD(load), .UP(up), .OE(oe), .DATA_I(data_i), .DATA_O(data_o), .SEQ(seq) ); //------------------------------------------ endmodule Код файла тест бенч: `timescale 1ns / 1ps module revers_tb; // Inputs reg b0; reg b1; reg b2; reg b3; reg ci_dec; reg add_dec; reg ci_inc; reg add_inc; reg clk; reg rst; reg load; reg up; reg oe; reg [3:0] data_i; // Outputs wire co_dec; wire ofl_dec; wire co_inc; wire ofl_inc; wire [3:0] data_o; wire [3:0] seq; // Instantiate the Unit Under Test (UUT) revers uut ( .B0(b0), .B1(b1), .B2(b2), .B3(b3), .CI_DEC(ci_dec), .ADD_DEC(add_dec), .CI_INC(ci_inc), .ADD_INC(add_inc), .CO_DEC(co_dec), .OFL_DEC(ofl_dec), .CO_INC(co_inc), .OFL_INC(ofl_inc), .CLK(clk), .RST(rst), .LOAD(load), .UP(up), .OE(oe), .DATA_I(data_i), .DATA_O(data_o), .SEQ(seq) ); initial begin // Initialize Inputs b0 = 1; b1 = 0; b2 = 0; b3 = 0; ci_dec = 0; add_dec = 0; ci_inc = 1; add_inc = 1; clk = 0; rst = 0; load = 0; up = 0; oe = 0; data_i = 0; // Wait 100 ns for global reset to finish #20; end // Объявление CLK always #5 clk = ! clk; // Объявление RST initial begin #20 rst = 1; #10 rst = 0; end // Объявление OE initial begin @ (negedge clk); // ждем переход CLK из лог. 1 в лог. 0 @ (negedge rst); // ждем переход RST из лог. 1 в лог. 0 #10 oe = 1; @ (negedge clk); #490 oe = 0; end // Объявление UP initial begin @ (negedge clk); // ждем переход CLK из лог. 1 в лог. 0 @ (negedge rst); // ждем переход RST из лог. 1 в лог. 0 #190 up = 1; @ (negedge clk); #210 up = 0; end // Объявление LOAD initial begin data_i = 4'h5; @ (negedge clk); // ждем переход CLK из лог. 1 в лог. 0 @ (negedge rst); // ждем переход RST из лог. 1 в лог. 0 #450 load = 1; @ (negedge clk); #10 load = 0; end endmodule revers_sch.sch screenshots.rar Edited December 4, 2012 by Михей91 Quote Share this post Link to post Share on other sites More sharing options...
Muscat 0 December 4, 2012 Posted December 4, 2012 · Report post Итак, у тебя есть сигнал A. На выходе ты должен получить в первом случае сигнал (A-1), во втором (A+1). У тебя есть блок ADSU4. Выбирая его, нажми кнопку Symbol Info, там исчерпывающая информация When the ADD input is High, this element adds two 4-bit words (A3:A0 and B3:B0) and a carry-in (CI), producing a 4-bit sum output (S3:S0) and a carry-out (CO) or an overflow (OFL). When the ADD input is Low, this element subtracts B3:B0 from A3:A0, producing a 4-bit difference output (S3:S0) and a carry-out (CO) or an overflow (OFL). Чтобы получить element subtracts надо ADD input is Low. Для обратного - обратное значение ADD. Ок. Не знаю, проходили ли вы это или нет, но в тензорной алгебре это уравнение записывается вот так а) A - (X) =A - 1 б) A + (X) = A+ 1 У меня под рукой нет матлаба, так что решить пока не могу. Но думаю, ты и сам справишься. С переносом я точно не помню, посмотри во всяких учебниках по схемоте типа Титце и Шенка, что делать с битом переноса CO для кольцеового счетчика. Можешь спросить препода. Думаю, что его надо замкнуть на вход переноса CI. Или забить. >>А вот что с OFL делать я не понял... Unsigned Binary Versus Two's Complement -This design element can operate on either 4-bit unsigned binary numbers or 4-bit two's-complement numbers. If the inputs are interpreted as unsigned binary, the result can be interpreted as unsigned binary. If the inputs are interpreted as two's complement, the output can be interpreted as two's complement. The only functional difference between an unsigned binary operation and a two's-complement operation is the way they determine when ”overflow” occurs. Unsigned binary uses CO, while two's complement uses OFL to determine when ”overflow” occurs. Краткое содержание - ничего не делать, если ты используешь беззнаковый тип. (Подсказка - да, это так). Для тебя этот сигнал не нужен, используй выход переноса. Quote Share this post Link to post Share on other sites More sharing options...
Михей91 0 December 4, 2012 Posted December 4, 2012 · Report post Ошибки с шиной устранил, теперь вылезли новые... Ошибки устранил, симулятор заработал, но непонятно как... SEQ от DATA_O строится верно, но сама DATA_O перепрыгивает, а не четко идет +1 или -1, на UP неправильно реагирует... вообщем работает непонятно как... И можно ли в симуляторе скрыть ненужные мне линии, а оставить только те, которые меня реально интересуют? _ _ _ Код главного файла: `timescale 1ns / 1ps module revers( input wire b0, input wire b1, input wire b2, input wire b3, input wire ci_dec, input wire add_dec, input wire ci_inc, input wire add_inc, output wire co_dec, output wire ofl_dec, output wire co_inc, output wire ofl_inc, input wire clk, input wire rst, input wire load, input wire up, input wire oe, input wire [3:0] data_i, output wire [3:0] data_o, output wire [3:0] seq ); // Sch.* Module Connection: revers_sch SCH_EXAMPLE( .B0(b0), .B1(b1), .B2(b2), .B3(b3), .CI_DEC(ci_dec), .ADD_DEC(add_dec), .CI_INC(ci_inc), .ADD_INC(add_inc), .CO_DEC(co_dec), .OFL_DEC(ofl_dec), .CO_INC(co_inc), .OFL_INC(ofl_inc), .CLK(clk), .RST(rst), .LOAD(load), .UP(up), .OE(oe), .DATA_I(data_i), .DATA_O(data_o), .SEQ(seq) ); //------------------------------------------ endmodule Код файла тест бенч: `timescale 1ns / 1ps module revers_tb; // Inputs reg clk; reg rst; reg load; reg up; reg oe; reg [3:0] data_i; reg b0; reg b1; reg b2; reg b3; reg ci_dec; reg add_dec; reg ci_inc; reg add_inc; // Outputs wire co_dec; wire ofl_dec; wire co_inc; wire ofl_inc; wire [3:0] data_o; wire [3:0] seq; // Instantiate the Unit Under Test (UUT) revers uut ( .b0(b0), .b1(b1), .b2(b2), .b3(b3), .ci_dec(ci_dec), .add_dec(add_dec), .ci_inc(ci_inc), .add_inc(add_inc), .co_dec(co_dec), .ofl_dec(ofl_dec), .co_inc(co_inc), .ofl_inc(ofl_inc), .clk(clk), .rst(rst), .load(load), .up(up), .oe(oe), .data_i(data_i), .data_o(data_o), .seq(seq) ); initial begin // Initialize Inputs b0 = 1; b1 = 0; b2 = 0; b3 = 0; ci_dec = 0; add_dec = 0; ci_inc = 1; add_inc = 1; clk = 0; rst = 0; load = 0; up = 0; oe = 0; data_i = 0; // Wait 20 ns for global reset to finish #20; end // Объявление CLK always #5 clk = ! clk; // Объявление RST initial begin #20 rst = 1; #10 rst = 0; end // Объявление OE initial begin @ (negedge clk); // ждем переход CLK из лог. 1 в лог. 0 @ (negedge rst); // ждем переход RST из лог. 1 в лог. 0 #10 oe = 1; @ (negedge clk); #490 oe = 0; end // Объявление UP initial begin @ (negedge clk); // ждем переход CLK из лог. 1 в лог. 0 @ (negedge rst); // ждем переход RST из лог. 1 в лог. 0 #190 up = 1; @ (negedge clk); #210 up = 0; end // Объявление LOAD initial begin data_i = 4'h5; @ (negedge clk); // ждем переход CLK из лог. 1 в лог. 0 @ (negedge rst); // ждем переход RST из лог. 1 в лог. 0 #450 load = 1; @ (negedge clk); #10 load = 0; end endmodule revers_sch.sch screenshots.rar Quote Share this post Link to post Share on other sites More sharing options...
Muscat 0 December 4, 2012 Posted December 4, 2012 · Report post Выкладывай проект в ISE целиком. Входной бит переноса 0, на выходной забиваешь, тогда счет бует -E-F-0-1.. Quote Share this post Link to post Share on other sites More sharing options...
Михей91 0 December 4, 2012 Posted December 4, 2012 · Report post Выкладывай проект в ISE целиком. Входной бит переноса 0, на выходной забиваешь, тогда счет бует -E-F-0-1.. lab_3.rar соединить CI и СО убрав маркеры? Quote Share this post Link to post Share on other sites More sharing options...
Михей91 0 December 5, 2012 Posted December 5, 2012 · Report post соединил, счет пошел последовательно, но на UP циклится на 1111, а на LOAD вообще не реагирует... Quote Share this post Link to post Share on other sites More sharing options...
Михей91 0 December 6, 2012 Posted December 6, 2012 (edited) · Report post Собственно выявил некую закономерность: у меня UP работает как LOAD, а LOAD как UP... Изменил схему мультиплексоров, поменял местами входы UP и LOAD, теперь вроде бы работать стало верно, но не совсем... Когда подаем UP счет действительно начинает идти в другую сторону, но не последовательно, а через 1, т.е. 0011, 0101, 0111 и т.д., DATA_I делаю равным 0110, подгружаю LOAD и в DATA_O должна была загрузить 0110 соотвественно, но загружается 1111, а также временная диаграмма сама обрезается на 285 нс, хотя должна идти до 1000 нс. И еще симулятор выводит данное предупреждение: WARNING: File "D:/Xilinx/project/my/lab_3/revers.v" Line 31. For instance uut/SCH_EXAMPLE/, width 1 of formal port DATA_I is not equal to width 4 of actual signal data_i. Помогите разобраться, совсем немножко то остается... :( Предупреждение убрал, добавил DATA_I как шину в схему мультиплексоров, LOAD заработал как надо, а вот UP все равно продолжает прыгать через один, и диаграмма снова обрезается самовольно... И с UP справился... ci_inc = 0; - до этого была единица, теперь считает обратно последовательно. Остался последний вопрос, почему он режет диаграмму? Ну и с этим справился... Убрал замыкание между CI_DEC и CO_DEC на ADSU4, и изменил ci_dec = 1; (до этого был ноль). Остался последний вопрос, почему когда мы уже подали сигнал OE = 1 у нас все равно идут 0000, чего он ждет то? Edited December 6, 2012 by Михей91 Quote Share this post Link to post Share on other sites More sharing options...
Muscat 0 December 6, 2012 Posted December 6, 2012 · Report post Твиттер в соседней вкладке. >>For instance uut/SCH_EXAMPLE/, width 1 of formal port DATA_I is not equal to width 4 of actual signal data_i. Для модуля uut/SCH_EXAMPLE/ ширина порта DATA_I не соответствует ширине 4 сигнала signal data_i. Что ждет твой буфер я бы сказал, но мой телепатический канал сегодня не работает. Не знаю, чем помочь даже, так как заглянуть тебе за плечо и посмотреть твой код и проект не могу. Quote Share this post Link to post Share on other sites More sharing options...
Михей91 0 December 6, 2012 Posted December 6, 2012 · Report post Muscat, ну что поделать если я сам нахожу решение, которое как мне казалось не найду... На все вопросы я нашел ответы, остался только один: Остался последний вопрос, почему когда мы уже подали сигнал OE = 1 у нас все равно идут 0000, чего он ждет то? verilog module `timescale 1ns / 1ps module revers( input wire b0, input wire b1, input wire b2, input wire b3, input wire ci_dec, input wire add_dec, input wire ci_inc, input wire add_inc, output wire co_dec, output wire ofl_dec, output wire co_inc, output wire ofl_inc, input wire clk, input wire rst, input wire load, input wire up, input wire oe, input wire [3:0] data_i, output wire [3:0] data_o, output wire [3:0] seq ); // Sch.* Module Connection: revers_sch SCH_EXAMPLE( .B0(b0), .B1(b1), .B2(b2), .B3(b3), .CI_DEC(ci_dec), .ADD_DEC(add_dec), .CI_INC(ci_inc), .ADD_INC(add_inc), .CO_DEC(co_dec), .OFL_DEC(ofl_dec), .CO_INC(co_inc), .OFL_INC(ofl_inc), .CLK(clk), .RST(rst), .LOAD(load), .UP(up), .OE(oe), .DATA_I(data_i), .DATA_O(data_o), .SEQ(seq) ); //------------------------------------------ endmodule verilog test fixture `timescale 1ns / 1ps module revers_tb; // Inputs reg clk; reg rst; reg load; reg up; reg oe; reg [3:0] data_i; reg b0; reg b1; reg b2; reg b3; reg ci_dec; reg add_dec; reg ci_inc; reg add_inc; // Outputs wire co_dec; wire ofl_dec; wire co_inc; wire ofl_inc; wire [3:0] data_o; wire [3:0] seq; // Instantiate the Unit Under Test (UUT) revers uut ( .b0(b0), .b1(b1), .b2(b2), .b3(b3), .ci_dec(ci_dec), .add_dec(add_dec), .ci_inc(ci_inc), .add_inc(add_inc), .co_dec(co_dec), .ofl_dec(ofl_dec), .co_inc(co_inc), .ofl_inc(ofl_inc), .clk(clk), .rst(rst), .load(load), .up(up), .oe(oe), .data_i(data_i), .data_o(data_o), .seq(seq) ); initial begin // Initialize Inputs b0 = 1; b1 = 0; b2 = 0; b3 = 0; ci_dec = 1; add_dec = 0; ci_inc = 0; add_inc = 1; clk = 0; rst = 0; load = 0; up = 0; oe = 0; data_i = 0; // Wait 20 ns for global reset to finish #20; end // Объявление CLK always #5 clk = ! clk; // Объявление RST initial begin #20 rst = 1; #10 rst = 0; end // Объявление OE initial begin @ (negedge clk); // ждем переход CLK из лог. 1 в лог. 0 @ (negedge rst); // ждем переход RST из лог. 1 в лог. 0 #10 oe = 1; @ (negedge clk); #490 oe = 0; end // Объявление UP initial begin @ (negedge clk); // ждем переход CLK из лог. 1 в лог. 0 @ (negedge rst); // ждем переход RST из лог. 1 в лог. 0 #190 up = 1; @ (negedge clk); #210 up = 0; end // Объявление LOAD initial begin data_i = 4'h5; @ (negedge clk); // ждем переход CLK из лог. 1 в лог. 0 @ (negedge rst); // ждем переход RST из лог. 1 в лог. 0 #450 load = 1; @ (negedge clk); #10 load = 0; end endmodule Quote Share this post Link to post Share on other sites More sharing options...
Muscat 0 December 7, 2012 Posted December 7, 2012 · Report post 1) for instance uut/SCH_EXAMPLE/, width 1 of formal port DATA_I. is not equal to width 4 of actual signal data_i 2) Ты выложил вериложную обертку и тест бенч, не выложив схемы и задаешь вопрос почему у тебя не работает схема. Quote Share this post Link to post Share on other sites More sharing options...
Михей91 0 December 7, 2012 Posted December 7, 2012 (edited) · Report post Muscat, 1) я же уже написал, что данный вопрос решился добавлением шины у мультиплексоров.... 2) Вот проект: lab_3.rar Edited December 7, 2012 by Михей91 Quote Share this post Link to post Share on other sites More sharing options...
Muscat 0 December 7, 2012 Posted December 7, 2012 · Report post 1) Твиттер... в соседней ... вкладке.... Вылавливать из потока сознания публикуемого в реал-тайм, где у тебя вопрос, а где радость решения не самое интересное занятие... почему когда мы уже подали сигнал OE = 1 у нас все равно идут 0000, чего он ждет то? Потому что сигнал ОЕ у тебя идет только в одно место BUFGCE XLXI_245 (.CE(OE), .I(Q3), .O(DATA_O[3])); Больше никуда.. Его никто нигде больше не ждет. На выходе буфера 0, потому что на входе буфера тоже 0. Выключи сигнал ОЕ и счет (см сигнал SEQ) все равно начнется в тот же момент. Счет у тебя начинается в момент 100 нас. У тебя есть какое то событие, которое происходит в момент 100нс, какое я если честно не понял. Запусти симуляцию фалйа SCH_EXAMPLE, то есть голой схемы без событий и увидишь некое переключение из 0 в 0 в момент 100нс. Забавная штука. Quote Share this post Link to post Share on other sites More sharing options...
Михей91 0 December 8, 2012 Posted December 8, 2012 · Report post Muscat, заменил буферы на OBUFT, zzzz состояние появилось, а вот эта задержка по нулям, все равно есть... Quote Share this post Link to post Share on other sites More sharing options...
Maverick_ 17 December 9, 2012 Posted December 9, 2012 · Report post Посмотрите книгу стр 159 Там правда на vhdl, но транслировать на верилог думаю не вызовет трудностей. Удачи!!! Quote Share this post Link to post Share on other sites More sharing options...