Добрый день!
Мне дали задание реализовать на ПЛИС алгоритм нахождения обратного числа по модулю с использованием расширенного алгоритма Евклида. С ПЛИС я раньше особо не сталкивался. Прошу палками не бить, а подтолкнуть в нужную сторону. Кое-что на 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