📄 alu.tdf
字号:
FUNCTION lpm_add_sub (cin, dataa[LPM_WIDTH-1..0], datab[LPM_WIDTH-1..0], add_sub, clock, aclr)
WITH (LPM_WIDTH=width, LPM_REPRESENTATION, LPM_DIRECTION, LPM_PIPELINE, ONE_INPUT_IS_CONSTANT)
RETURNS (result[LPM_WIDTH-1..0], cout, overflow);
FUNCTION lpm_and (data[LPM_SIZE-1..0][LPM_WIDTH-1..0])
WITH (LPM_WIDTH=width, LPM_SIZE=2)
RETURNS (result[LPM_WIDTH-1..0]);
FUNCTION lpm_or (data[LPM_SIZE-1..0][LPM_WIDTH-1..0])
WITH (LPM_WIDTH=width, LPM_SIZE=2)
RETURNS (result[LPM_WIDTH-1..0]);
FUNCTION lpm_xor (data[LPM_SIZE-1..0][LPM_WIDTH-1..0])
WITH (LPM_WIDTH=width, LPM_SIZE=2)
RETURNS (result[LPM_WIDTH-1..0]);
FUNCTION lpm_inv (data[LPM_WIDTH-1..0])
WITH (LPM_WIDTH=width)
RETURNS (result[LPM_WIDTH-1..0]);
FUNCTION lpm_mult (dataa[(LPM_WIDTHA-1)..0], datab[(LPM_WIDTHB-1)..0], sum[(LPM_WIDTHS-1)..0], aclr, clock)
WITH (LPM_WIDTHA=width, LPM_WIDTHB=width, LPM_WIDTHP=2*width, LPM_WIDTHS=1,LPM_REPRESENTATION, LPM_PIPELINE, LATENCY, INPUT_A_IS_CONSTANT, INPUT_B_IS_CONSTANT)
RETURNS (result[LPM_WIDTHP-1..0]);
FUNCTION lpm_clshift (data[LPM_WIDTH-1..0], distance[LPM_WIDTHDIST-1..0], direction)
WITH (LPM_WIDTH=width, LPM_WIDTHDIST=ceil(log2(width)), LPM_SHIFTTYPE)
RETURNS (result[LPM_WIDTH-1..0], underflow, overflow);
parameters
(
width
);
subdesign alu
(
dataa[width..1] : input;
datab[width..1] : input;
result[width..1] : output;
oper[3..0] : input;
cin : input;
cout : output;
)
variable
fn_add : lpm_add_sub;
fn_and : lpm_and;
fn_or : lpm_or;
fn_xor : lpm_xor;
fn_not : lpm_inv;
-- fn_mult : lpm_mult;
fn_barrel : lpm_clshift;
-- mult_node[width*2-1..0] : node;
begin
-- fn_mult.dataa[]=dataa[];
-- fn_mult.datab[]=datab[];
-- mult_node[]=fn_mult.result[];
case oper[] is
-- add and subtract
when 0,1 =>
fn_add.add_sub=(oper[]==0);
fn_add.cin=cin;
fn_add.dataa[]=dataa[];
fn_add.datab[]=datab[];
cout=fn_add.cout;
result[]=fn_add.result[];
-- and
when 2 =>
fn_and.data[1][]=dataa[];
fn_and.data[0][]=datab[];
result[]=fn_and.result[];
cout=cin;
-- or
when 3 =>
fn_or.data[1][]=dataa[];
fn_or.data[0][]=datab[];
result[]=fn_or.result[];
cout=cin;
-- xor
when 4=>
fn_xor.data[1][]=dataa[];
fn_xor.data[0][]=datab[];
result[]=fn_xor.result[];
cout=cin;
-- not dataa[]
when 5 =>
fn_not.data[]=dataa[];
result[]=fn_not.result[];
cout=cin;
-- multiply LSB (when implemented)
when 6 =>
-- result[]=mult_node[width-1..0];
cout=cin;
-- multiply MSB (when implemented)
when 7 =>
-- result[]=mult_node[width*2-1..width];
cout=cin;
-- rotate right
when 8 =>
result[]=(cin,dataa[width..2]);
cout=dataa[1];
-- rotate left
when 9 =>
result[]=(dataa[width-1..1],cin);
cout=dataa[width];
-- barrel shift dataa[], datab[] bits left
when 10 =>
fn_barrel.data[]=dataa[];
fn_barrel.distance[]=datab[ceil(log2(width))..1];
result[]=fn_barrel.result[];
-- return the bit position of the first logical '1' in dataa[]
when 11 =>
for i in width to 1 generate
if dataa[i] then
result[]=i;
end if;
end generate;
end case;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -