原理参考文献:
神经网络激活函数及其导数的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