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
  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值