2020-10-31 13:45:53 +01:00

112 lines
2.1 KiB
Verilog
Executable File

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 11:40:13 05/24/2011
// Design Name:
// Module Name: modmul
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module modmul(
input wire clk,
input wire reset,
input wire[11:0] polynom,
input wire[10:0] datain_a,
input wire[10:0] datain_b,
input wire enable,
output wire[10:0]dataout,
output wire valid
);
reg[3:0] counter;
reg[21:0] dataoutReg;
reg[10:0] datain_aReg;
reg[21:0] datain_bReg;
reg[21:0] polynomReg;
reg validReg;
assign dataout = dataoutReg[10:0];
assign valid = validReg;
initial begin
counter <= 0;
dataoutReg <= 0;
validReg <= 0;
end
//reset
always@(posedge reset)
begin
counter <= 0;
dataoutReg <= 0;
validReg <= 0;
end
//clk
always@(posedge clk)
begin
if(enable == 1 && counter == 0)
begin
datain_aReg = datain_a;
datain_bReg = datain_b;
polynomReg = polynom;
end
//enable und counter < 12 (datain_a bzw datain_b -> 11bit)
if(enable == 1 && counter < 4'b1100)
begin
//multiplikation aufgeteilt in additionen
if(datain_aReg[0] == 1)
begin
dataoutReg <= dataoutReg ^ datain_bReg;
end
//nächster schritt
datain_aReg <= datain_aReg >> 1;
datain_bReg <= datain_bReg << 1;
counter <= counter + 1;
end
//modulo rechnung
if(counter == 4'b1100) //counter == 12
begin
if(dataoutReg > polynomReg)
begin
polynomReg <= polynomReg << 1;
end else
begin
if( polynomReg >= dataoutReg) polynomReg = polynomReg >> 1;
counter = counter + 1;
end
end
if(counter == 4'b1101) //counter = 13
begin
dataoutReg = dataoutReg ^ polynomReg;
validReg <= 1;
end
end
endmodule