Jump to content

    

kereokerekeke

Участник
  • Content Count

    6
  • Joined

  • Last visited

Community Reputation

0 Обычный
  1. Всем спасибо за советы и помощь. Схему реализовал на SystemVerilog с использованием FSM.
  2. Всем здравствуйте! Немного поменялась постановка задачи. Есть такой алгоритм: И такая схема: Нужно сделать реализацию алгоритма на verilog/VHDL. Главная цель - получить диаграммы из симулятора. На рельном железе запускаться не будет. Разрядность тоже можно понизить как минимум до 32 разрядов. Неясно много моментов. В силу своих знаний в сфере ПЛИС, элементы, вроде, сумматора или регистра сдвига реализовать я еще могу, а, например с контроллером возникают проблемы. Я так понимаю, что его нужно реализовывать как state machine. Так же не особо понятно, для чего в схеме используются триггеры u/v и wu и как реализовать тестовую логику в TL. Так же прикладываю статью, которой, собственно, пользуюсь. 1_New_Alg_Class_Inv.pdf Спасибо за любую помощь.
  3. Сделал так: module inversea (input wire [5:0]a, input wire clk, input wire [5:0]p, output reg [5:0]res); reg [5:0]u; reg [5:0]v; reg [5:0]r; reg [5:0]s; reg [5:0]x; reg [8:0]k; reg [3:0]i; initial begin r = 0; s = 1; k = 0; i = 0; end initial @(a or p) begin u <= p; v <= a; end always @(posedge clk) begin for(i=0; i<10; i=i+1)begin if(!(v>0)); if ((u >> 1) == 0) if ((r >> 1) == 0) begin u = u >> 1; r = r >> 1; k = k + 1; end else begin u = u >> 1; r = (r+p) >> 1; k = k + 1; end else if ((v >> 1) == 0) if ((s >> 1) == 0) begin k = k >> 1; s = s >> 1; k = k + 1; end else begin v = v >> 1; s = (s+p) >> 1; k = k + 1; end else begin x = u-v; end if (x > 0) begin u = x; r = r - s; if (r < 0) r = r + p; else begin v = -x; s = s - r; if (s < 0) s = s + r; end end if (r > p) r = r - p; if (r < 0) r = r + p; res = r; end end endmodule Если ставить маленькое количество повторений циклов - результат есть, но неверный.
  4. Как вариант. Единственное, что числа должны быть 64 бита. С ПЛИС я и работал на данный момент на уровне поморгать светодиодами, что сильно осложняет задачу...
  5. Спасибо за ответы. Есть плата terasic de2-115. Требования - чтобы работало. Время особой роли не играет.
  6. Добрый день! Мне дали задание реализовать на ПЛИС алгоритм нахождения обратного числа по модулю с использованием расширенного алгоритма Евклида. С ПЛИС я раньше особо не сталкивался. Прошу палками не бить, а подтолкнуть в нужную сторону. Кое-что на verilog писал, собственно прилагаю. Алгоритм: Код: module inversea (input wire [63:0]a, input wire clk, input wire [63:0]p, output reg [64:0]res); reg [63:0]u; reg [63:0]v; reg [63:0]r; reg [63:0]s; reg [63:0]x; reg [8:0]k; initial begin r = 0; s = 1; k = 0; end initial @(a or p) begin u = p; v =a; end always @(posedge clk) begin while (v > 0) begin if ((u >> 1) == 0) if ((r >> 1) == 0) begin u = u >> 1; r = r >> 1; k = k + 1; end else begin u = u >> 1; r = (r+p) >> 1; k = k + 1; end else if ((v >> 1) == 0) if ((s >> 1) == 0) begin k = k >> 1; s = s >> 1; k = k + 1; end else begin v = v >> 1; s = (s+p) >> 1; k = k + 1; end else begin x = u-v; end if (x > 0) begin u = x; r = r - s; if (r < 0) r <= r + p; else begin v = -x; s = s - r; if (s < 0) s = s + r; end end end if (r > p) r = r - p; if (r < 0) r = r + p; res = r; end endmodule Тестбенч: module test(); // constants // general purpose registers reg eachvec; // test vector input registers reg [63:0]a; reg [63:0]p; // wires reg clk; wire [64:0]res; always #50 clk = ~clk; // assign statements (if any) inversea inv1 ( // port map - connection between master ports and signals/registers .a(a), .clk(clk), .p(p), .res(res) ); initial begin // code that executes only once // insert code here --> begin // --> end clk = 0; $display("Testbench running"); end always // optional sensitivity list // @(event1 or event2 or .... eventn) begin // code executes for every evenst on sensitivity list // insert code here --> begin a = 'd4; p = 'd26; #10; // --> end end initial begin // code that executes only once // insert code here --> begin // --> end $display("a = %d",a); $display("p = %d",p); #51 $display("out = %d",res); end initial begin $dumpfile("out1.vcd"); $dumpvars(0,test); end initial begin #400 $finish; end endmodule Заранее благодарю. inversea.v inverseatest.v