sigmoid函数的实现

https://blog.csdn.net/yanxiaopan/article/details/76853082

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值