📄 altera_mf.v
字号:
var_family_cycloneii = 0;
FEATURE_FAMILY_CYCLONEII = var_family_cycloneii;
end
endfunction //FEATURE_FAMILY_CYCLONEII
function FEATURE_FAMILY_HAS_STRATIXII_STYLE_RAM;
input device;
reg[8*20:1] device;
reg var_family_has_stratixii_style_ram;
begin
if (FEATURE_FAMILY_STRATIXII(device) || FEATURE_FAMILY_CYCLONEII(device) )
var_family_has_stratixii_style_ram = 1;
else
var_family_has_stratixii_style_ram = 0;
FEATURE_FAMILY_HAS_STRATIXII_STYLE_RAM = var_family_has_stratixii_style_ram;
end
endfunction //FEATURE_FAMILY_HAS_STRATIXII_STYLE_RAM
function IS_VALID_FAMILY;
input device;
reg[8*20:1] device;
reg is_valid;
begin
if (((device == "ACEX1K") || (device == "acex1k") || (device == "ACEX 1K") || (device == "acex 1k"))
|| ((device == "APEX20K") || (device == "apex20k") || (device == "APEX 20K") || (device == "apex 20k") || (device == "RAPHAEL") || (device == "raphael"))
|| ((device == "APEX20KC") || (device == "apex20kc") || (device == "APEX 20KC") || (device == "apex 20kc"))
|| ((device == "APEX20KE") || (device == "apex20ke") || (device == "APEX 20KE") || (device == "apex 20ke"))
|| ((device == "APEX II") || (device == "apex ii") || (device == "APEXII") || (device == "apexii") || (device == "APEX 20KF") || (device == "apex 20kf") || (device == "APEX20KF") || (device == "apex20kf"))
|| ((device == "EXCALIBUR_ARM") || (device == "excalibur_arm") || (device == "Excalibur ARM") || (device == "EXCALIBUR ARM") || (device == "excalibur arm") || (device == "ARM-BASED EXCALIBUR") || (device == "arm-based excalibur") || (device == "ARM_BASED_EXCALIBUR") || (device == "arm_based_excalibur"))
|| ((device == "FLEX10KE") || (device == "flex10ke") || (device == "FLEX 10KE") || (device == "flex 10ke"))
|| ((device == "FLEX10K") || (device == "flex10k") || (device == "FLEX 10K") || (device == "flex 10k"))
|| ((device == "FLEX10KA") || (device == "flex10ka") || (device == "FLEX 10KA") || (device == "flex 10ka"))
|| ((device == "FLEX6000") || (device == "flex6000") || (device == "FLEX 6000") || (device == "flex 6000") || (device == "FLEX6K") || (device == "flex6k"))
|| ((device == "MAX7000B") || (device == "max7000b") || (device == "MAX 7000B") || (device == "max 7000b"))
|| ((device == "MAX7000AE") || (device == "max7000ae") || (device == "MAX 7000AE") || (device == "max 7000ae"))
|| ((device == "MAX3000A") || (device == "max3000a") || (device == "MAX 3000A") || (device == "max 3000a"))
|| ((device == "MAX7000S") || (device == "max7000s") || (device == "MAX 7000S") || (device == "max 7000s"))
|| ((device == "MAX7000A") || (device == "max7000a") || (device == "MAX 7000A") || (device == "max 7000a"))
|| ((device == "Mercury") || (device == "MERCURY") || (device == "mercury") || (device == "DALI") || (device == "dali"))
|| ((device == "Stratix") || (device == "STRATIX") || (device == "stratix") || (device == "Yeager") || (device == "YEAGER") || (device == "yeager"))
|| ((device == "Stratix GX") || (device == "STRATIX GX") || (device == "stratix gx") || (device == "Stratix-GX") || (device == "STRATIX-GX") || (device == "stratix-gx") || (device == "StratixGX") || (device == "STRATIXGX") || (device == "stratixgx") || (device == "Aurora") || (device == "AURORA") || (device == "aurora"))
|| ((device == "Cyclone") || (device == "CYCLONE") || (device == "cyclone") || (device == "ACEX2K") || (device == "acex2k") || (device == "ACEX 2K") || (device == "acex 2k") || (device == "Tornado") || (device == "TORNADO") || (device == "tornado"))
|| ((device == "MAX II") || (device == "max ii") || (device == "MAXII") || (device == "maxii") || (device == "Tsunami") || (device == "TSUNAMI") || (device == "tsunami"))
|| ((device == "HardCopy Stratix") || (device == "HARDCOPY STRATIX") || (device == "hardcopy stratix") || (device == "Stratix HC") || (device == "STRATIX HC") || (device == "stratix hc") || (device == "StratixHC") || (device == "STRATIXHC") || (device == "stratixhc") || (device == "HardcopyStratix") || (device == "HARDCOPYSTRATIX") || (device == "hardcopystratix"))
|| ((device == "Stratix II") || (device == "STRATIX II") || (device == "stratix ii") || (device == "StratixII") || (device == "STRATIXII") || (device == "stratixii") || (device == "Armstrong") || (device == "ARMSTRONG") || (device == "armstrong"))
|| ((device == "Cyclone II") || (device == "CYCLONE II") || (device == "cyclone ii") || (device == "Cycloneii") || (device == "CYCLONEII") || (device == "cycloneii") || (device == "Magellan") || (device == "MAGELLAN") || (device == "magellan")))
is_valid = 1;
else
is_valid = 0;
IS_VALID_FAMILY = is_valid;
end
endfunction // IS_VALID_FAMILY
endmodule // ALTERA_DEVICE_FAMILIES
//START_MODULE_NAME------------------------------------------------------------
//
// Module Name : altaccumulate
//
// Description : Parameterized accumulator megafunction. The accumulator
// performs an add function or a subtract function based on the add_sub
// parameter. The input data can be signed or unsigned.
//
// Limitation : n/a
//
// Results expected: result - The results of add or subtract operation. Output
// port [width_out-1 .. 0] wide.
// cout - The cout port has a physical interpretation as
// the carry-out (borrow-in) of the MSB. The cout
// port is most meaningful for detecting overflow
// in unsigned operations. The cout port operates
// in the same manner for signed and unsigned
// operations.
// overflow - Indicates the accumulator is overflow.
//
//END_MODULE_NAME--------------------------------------------------------------
// BEGINNING OF MODULE
`timescale 1 ps / 1 ps
module altaccumulate (cin, data, add_sub, clock, sload, clken, sign_data, aclr,
result, cout, overflow);
parameter width_in = 4; // Required
parameter width_out = 8; // Required
parameter lpm_representation = "UNSIGNED";
parameter extra_latency = 0;
parameter use_wys = "ON";
parameter lpm_hint = "UNUSED";
parameter lpm_type = "altaccumulate";
// INPUT PORT DECLARATION
input cin;
input [width_in-1:0] data; // Required port
input add_sub; // Default = 1
input clock; // Required port
input sload; // Default = 0
input clken; // Default = 1
input sign_data; // Default = 0
input aclr; // Default = 0
// OUTPUT PORT DECLARATION
output [width_out-1:0] result; //Required port
output cout;
output overflow;
// INTERNAL REGISTERS DECLARATION
reg [width_out:0] temp_sum;
reg overflow;
reg overflow_int;
reg cout_int;
reg cout_delayed;
reg [width_out-1:0] result;
reg [width_out+1:0] result_int;
reg [(width_out - width_in) : 0] zeropad;
reg borrow;
reg cin_int;
reg [width_out-1:0] fb_int;
reg [width_out -1:0] data_int;
reg [width_out+1:0] result_pipe [extra_latency:0];
reg [width_out+1:0] result_full;
reg [width_out+1:0] result_full2;
reg a;
// INTERNAL WIRE DECLARATION
wire [width_out:0] temp_sum_wire;
wire cout;
wire cout_int_wire;
wire cout_delayed_wire;
wire overflow_int_wire;
wire [width_out+1:0] result_int_wire;
// INTERNAL TRI DECLARATION
tri0 aclr_int;
tri0 sign_data_int;
tri0 sload_int;
tri1 clken_int;
tri1 add_sub_int;
// LOCAL INTEGER DECLARATION
integer head;
integer i;
// INITIAL CONSTRUCT BLOCK
initial
begin
// Checking for invalid parameters
if( width_in <= 0 )
begin
$display("Error! Value of width_in parameter must be greater than 0.");
$stop;
end
if( width_out <= 0 )
begin
$display("Error! Value of width_out parameter must be greater than 0.");
$stop;
end
if( extra_latency > width_out )
begin
$display("Info: Value of extra_latency parameter should be lower than width_out parameter for better performance/utilization.");
end
if( width_in > width_out )
begin
$display("Error! Value of width_in parameter should be lower than or equal to width_out.");
$stop;
end
result = 0;
cout_delayed = 0;
overflow = 0;
head = 0;
result_int = 0;
for (i = 0; i <= extra_latency; i = i +1)
begin
result_pipe [i] = 0;
end
end
// ALWAYS CONSTRUCT BLOCK
always @(posedge clock or posedge aclr_int)
begin
if (aclr_int == 1)
begin
result_int = 0;
result = 0;
overflow = 0;
cout_delayed = 0;
for (i = 0; i <= extra_latency; i = i +1)
begin
result_pipe [i] = 0;
end
end
else
begin
if (clken_int == 1)
begin
//get result from output register
if (extra_latency > 0)
begin
result_pipe [head] = {
result_int [width_out+1],
{cout_int_wire, result_int [width_out-1:0]}
};
head = (head + 1) % (extra_latency);
result_full = result_pipe [head];
cout_delayed = result_full [width_out];
result = result_full [width_out-1:0];
overflow = result_full [width_out+1];
end
else
begin
result = temp_sum_wire;
overflow = overflow_int_wire;
end
result_int = {overflow_int_wire, {cout_int_wire, temp_sum_wire [width_out-1:0]}};
end
end
end
always @ (data or cin or add_sub_int or sign_data_int or
result_int_wire [width_out -1:0] or sload_int or aclr_int)
begin
// If asynchronous clear, reset and skip.
if (aclr_int == 1) // asynchronous clear
begin
cout_int = 0;
overflow_int = 0;
end
else
begin
if ((lpm_representation == "SIGNED") || (sign_data_int == 1))
begin
zeropad = (data [width_in-1] ==0) ? 0 : -1;
end
else
begin
zeropad = 0;
end
fb_int = (sload_int == 1'b1) ? 0 : result_int_wire [width_out-1:0];
data_int = {zeropad, data};
if ((add_sub_int == 1) || (sload_int == 1))
begin
cin_int = ((sload_int == 1'b1) ? 0 : ((cin === 1'bz) ? 0 : cin));
temp_sum = fb_int + data_int + cin_int;
cout_int = temp_sum [width_out];
end
else
begin
cin_int = (cin === 1'bz) ? 1 : cin;
borrow = ~cin_int;
temp_sum = fb_int - data_int - borrow;
result_full2 = data_int + borrow;
cout_int = (fb_int >= result_full2) ? 1 : 0;
end
if ((lpm_representation == "SIGNED") || (sign_data_int == 1))
begin
a = (data [width_in-1] ~^ fb_int [width_out-1]) ^ (~add_sub_int);
overflow_int = a & (fb_int [width_out-1] ^ temp_sum[width_out-1]);
end
else
begin
overflow_int = (add_sub_int == 1) ? cout_int : ~cout_int;
end
if (sload_int == 1)
begin
cout_int = !add_sub_int;
overflow_int = 0;
end
end
end
// CONTINOUS ASSIGNMENT
// Get the input data and control signals.
assign sign_data_int = sign_data;
assign sload_int = sload;
assign add_sub_int = add_sub;
assign clken_int = clken;
assign aclr_int = aclr;
assign result_int_wire = result_int;
assign temp_sum_wire = temp_sum;
assign cout_int_wire = cout_int;
assign overflow_int_wire = overflow_int;
assign cout = (extra_latency == 0) ? cout_int_wire : cout_delayed_wire;
assign cout_delayed_wire = cout_delayed;
endmodule // End of altaccumulate
// END OF MODULE
//--------------------------------------------------------------------------
// Module Name : altmult_accum
//
// Description : a*b + x (MAC)
//
// Limitation : Stratix DSP block
//
// Results expected : signed & unsigned, maximum of 3 pipelines(latency) each.
//
//--------------------------------------------------------------------------
`timescale 1 ps / 1 ps
module altmult_accum (dataa,
datab,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -