⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 alu.tdf

📁 verilog编写的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 + -