sigmoid函数的实现

来源:互联网 发布:手机淘宝下载安装2017免费下载 编辑:程序博客网 时间:2024/06/14 16:51

原理参考文献:
神经网络激活函数及其导数的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位,最高位为符号位,小数占15end        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    endendendmodule