sigmoid函数的实现

原理参考文献:
神经网络激活函数及其导数的FPGA实现_张智明

代码如下:

module sigmoid(clk,rst,a,b
    );
	 
input clk;
input rst;
input [15:0] a;

output[15:0] b;
reg[15:0] b;
reg[15:0] a_reg;

always@(posedge clk)
begin
	if(rst)
	b=0;
	else
	begin
		if(a[15]==0)
		begin
			b[15:12]=4'b0000;
			case(a[14:12])
			3'b000:b[11:0]=12'b100000000000+(a[11:0]>>2);//加号的优先级大于移位运算的优先级,记得加括号
			3'b001:b[11:0]=12'b110000000000+(a[11:0]>>3);
			3'b010:b[11:0]=12'b111000000000+(a[11:0]>>4);
			3'b011:b[11:0]=12'b111100000000+(a[11:0]>>5);
			3'b100:b[11:0]=12'b111110000000+(a[11:0]>>6);
			3'b101:b[11:0]=12'b111111000000+(a[11:0]>>7);
			3'b110:b[11:0]=12'b111111100000+(a[11:0]>>8);
			3'b111:b[11:0]=12'b111111110000+(a[11:0]>>9);
			endcase
			b=b<<3;//输入16位,最高位为符号位,整数占3位,小数占12位;输出16位,最高位为符号位,小数占15位
		end
		else
		begin
			a_reg=~a+1;//取a的绝对值
			b[15:12]=4'b0000;
			case(a_reg[14:12])
			3'b000:b[11:0]=12'b100000000000+(a_reg[11:0]>>2);
			3'b001:b[11:0]=12'b110000000000+(a_reg[11:0]>>3);
			3'b010:b[11:0]=12'b111000000000+(a_reg[11:0]>>4);
			3'b011:b[11:0]=12'b111100000000+(a_reg[11:0]>>5);
			3'b100:b[11:0]=12'b111110000000+(a_reg[11:0]>>6);
			3'b101:b[11:0]=12'b111111000000+(a_reg[11:0]>>7);
			3'b110:b[11:0]=12'b111111100000+(a_reg[11:0]>>8);
			3'b111:b[11:0]=12'b111111110000+(a_reg[11:0]>>9);
			endcase
			b=b<<3;//输入16位,最高位为符号位,整数占3位,小数占12位;输出16位,最高位为符号位,小数占15位
			b[14:0]=~b[14:0]+1;//f(x)=1-f(-x)		
		end
	end
	
end
endmodule

你可能感兴趣的:(FPGA)