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

📄 alu.v

📁 用verilog HDL代码编写的快速除法器
💻 V
字号:
//快速除法器源代码 ,verilog 代码 的快速除法器
module divider(clk,reset,cal_reg,dividend,divisor,ratio,remainder,error);
input clk;
input reset;
input cal_reg;
input [7:0] dividend;
input [7:0] divisor;
output [7:0] ratio;
output [7:0] remainder;
output error;
reg calculating;
reg [7:0] shift_counter;
reg [7:0] ratio;
reg [7:0] div_counter;
reg [7:0] divisor_r;
reg [7:0] shifted_dividend;
reg [7:0] remainder;

wire withdraw =(divisor_r <(shifted_dividend <<1));
wire done = (divisor_r < dividend )&& ~error;
wire error =(dividend >divisor) || (dividend ==8'b0);
always @(posedge clk)
begin
if(reset||error)
shifted_dividend <=8'b0;
else if (cal_reg ||withdraw)
shifted_dividend <=dividend;
else if (calculating)
shifted_dividend <=shifted_dividend << 1;
end

always @(posedge clk)
begin
if(reset||error)
divisor_r <=8'b0;
else if (cal_reg )
divisor_r <=divisor;
else if (withdraw)
divisor_r <=divisor_r - shifted_dividend ;
end

always @(posedge clk)
begin
if(cal_reg || reset||error ||withdraw || ~calculating )
shift_counter <=8'b1;
else
shift_counter <=shift_counter<<1;
end

always @(posedge clk)
begin
if(cal_reg || reset||error )
div_counter <=8'b0;
else if (withdraw)
div_counter <=div_counter + shift_counter;
end
//---------------------------------------------------------------------------
//www.icwin.net
//---------------------------------------------------------------------------
always @(posedge clk)
begin
if(reset||error)
calculating <=1'b0;
else if (cal_reg )
calculating <=1'b1;
else if (done)
calculating <=1'b0;
end

always @(posedge clk)
begin
if(reset||error)
begin
remainder <=8'b0;
ratio <= 8'b0;
end
else if (done)
begin
remainder <=divisor_r;
ratio <= div_counter;
end
end
endmodule

module alu(alu_out,zero,dividend,divisor,alu_clk,opcode);
 output zero;
 output[7:0] alu_out;
 input[7:0]  dividend,divisor;
 input[2:0]  opcode;
 input alu_clk;
 reg[7:0] alu_out;

 parameter 	HLT= 3'b000,
		DIV= 3'b001,
		ADD= 3'b010,
		ANDD=3'b011,
		XORR=3'b100,
		LDA= 3'b101,
		STO= 3'b110,
		JMP= 3'b111;
 assign zero=!divisor;
 always@(posedge alu_clk)
	begin
		casex(opcode)
			HLT: alu_out<=divisor;
			DIV: begin
				divider div(.clk(alu_clk),.dividend(dividend),.divisor(divisor),.ratio(alu_out));
					end
			ADD: alu_out<=dividend+divisor;
			ANDD:alu_out<=dividend&divisor;
			XORR:alu_out<=dividend^divisor;
			LDA: alu_out<=dividend;
			STO: alu_out<=divisor;
			JMP: alu_out<=divisor;
			default:alu_out<=8'bxxxx_xxxx;
		endcase
	end
endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -