├── ANN ├── tanh.v ├── data.v ├── relu.v ├── layer.v ├── nn_top.v ├── out_layer.v ├── mac.v └── nn.v ├── k-NN ├── top_knn.v ├── regression_result_con.v ├── ds.v ├── KNN.v ├── class_result_con.v └── sort.v ├── DT ├── node.v ├── tb_dt.v └── data.v ├── README.md └── SVM ├── mux.v ├── top_svm.v ├── data_bias.v ├── data.v └── SVM.v /ANN/tanh.v: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verimake-team/MLonFPGA/HEAD/ANN/tanh.v -------------------------------------------------------------------------------- /k-NN/top_knn.v: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verimake-team/MLonFPGA/HEAD/k-NN/top_knn.v -------------------------------------------------------------------------------- /ANN/data.v: -------------------------------------------------------------------------------- 1 | module rom(data, addr); 2 | output reg[3:0] data; 3 | input [4:0] addr; 4 | always @(addr) begin 5 | case (addr) 6 | 0 : data = 'h4; 7 | 1 : data = 'h9; 8 | 2 : data = 'h1; 9 | 15 : data = 'h8; 10 | 16 : data = 'h1; 11 | 17 : data = 'h0; 12 | default : data = 'h0; 13 | endcase 14 | end 15 | endmodule -------------------------------------------------------------------------------- /DT/node.v: -------------------------------------------------------------------------------- 1 | module node 2 | #( 3 | parameter FEATURE_WIDE =7 //input feature Intege bit width 4 | 5 | )( 6 | input clk , 7 | input rst_n , 8 | input [FEATURE_WIDE-1'b1:0] feature ,//4位整数8位小数 9 | input [FEATURE_WIDE-1'b1:0] train ,//4位整数8位小数 10 | 11 | output reg [1:0] en_end 12 | ); 13 | 14 | 15 | 16 | always@(posedge clk or negedge rst_n)begin 17 | if(!rst_n)begin 18 | en_end<=2'd0; 19 | end 20 | else if (feature<=train)begin 21 | en_end<=2'd1; 22 | end 23 | else begin 24 | en_end<=2'd2; 25 | end 26 | end 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | endmodule -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # A series of mainstream machine learning algorithms implement on FPGA. 2 | 3 |
 4 | __     __        _                 _        
 5 | \ \   / /__ _ __(_)_ __ ___   __ _| | _____ 
 6 |  \ \ / / _ \ '__| | '_ ` _ \ / _` | |/ / _ \
 7 |   \ V /  __/ |  | | | | | | | (_| |   <  __/
 8 |    \_/ \___|_|  |_|_| |_| |_|\__,_|_|\_\___|
 9 |  
10 | 11 | ### Configurable parameters 12 | |ANN|DT|k-NN|SVM| 13 | |----------|----------|----------|----------| 14 | |Data width(max=13);
Number of in-puts(max=16);
Number of hidden lay-ers(max=4);
Number of neurons in each hidden lay-er(max=8);
Number of tar-gets(max=16);
Activation functions |Data width(max=13);
Number of depth(max=5);
Number of leaf nodes(max=64);
Number of targets(max=16) |Data width(max=13);
Number of in-puts(max=16);
Number of neigh-bors(max=16);
Number of tar-gets(max=16)|Data width(max=13);
Number of in-puts(max=16);
Number of tar-gets(max=16)| -------------------------------------------------------------------------------- /SVM/mux.v: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | module mux 5 | #( 6 | parameter FEATURE_WIDE =7 , //input feature Intege bit width 7 | parameter FEATURE_NUM =16 8 | 9 | )( 10 | input clk , 11 | input rst_n , 12 | input signed [FEATURE_WIDE+3'd5:0] feature , 13 | input signed [12:0] weight , 14 | input en , 15 | 16 | 17 | output signed [FEATURE_NUM+2*FEATURE_WIDE+3'd5:0] sigma 18 | 19 | 20 | 21 | ); 22 | 23 | 24 | reg signed [FEATURE_NUM+FEATURE_WIDE+5'd21:0] result; 25 | 26 | assign sigma=result>>6; 27 | 28 | always@(posedge clk or negedge rst_n)begin 29 | if(!rst_n)begin 30 | result<={(FEATURE_NUM+FEATURE_WIDE+4'd8){1'b0}}; 31 | end 32 | else if (en==1'b1)begin 33 | result<=result+feature*weight; 34 | end 35 | else begin 36 | result<={(FEATURE_NUM+FEATURE_WIDE+4'd8){1'b0}}; 37 | end 38 | end 39 | 40 | 41 | 42 | endmodule -------------------------------------------------------------------------------- /ANN/relu.v: -------------------------------------------------------------------------------- 1 | module relu 2 | #( 3 | parameter FEATURE_WIDE =4 4 | )( 5 | 6 | input clk , 7 | input rst_n , 8 | input en , 9 | input signed [ FEATURE_WIDE+5'd15 :0] in_data , 10 | input mac_en , 11 | 12 | 13 | output reg signed [FEATURE_WIDE+4'd15:0] out_data , 14 | output end_en 15 | 16 | ); 17 | 18 | 19 | reg end_en_r; 20 | 21 | assign end_en=(end_en_r==1'b1 && mac_en==1'b0)?1'b1:1'b0; 22 | 23 | 24 | always@(posedge clk )begin 25 | end_en_r<=en; 26 | 27 | end 28 | 29 | always @(posedge clk or negedge rst_n)begin 30 | if(!rst_n)begin 31 | out_data<={(FEATURE_WIDE+5'd16){1'b0}}; 32 | end 33 | else if (in_data[FEATURE_WIDE+4'd15]==1'b0)begin 34 | out_data<=in_data; 35 | end 36 | else begin 37 | out_data<={(FEATURE_WIDE+5'd16){1'b0}}; 38 | end 39 | 40 | end 41 | 42 | 43 | 44 | 45 | endmodule 46 | -------------------------------------------------------------------------------- /DT/tb_dt.v: -------------------------------------------------------------------------------- 1 | 2 | `timescale 1 ps / 1 ps 3 | module tb_dt(); 4 | 5 | 6 | reg clk ; 7 | reg rst_n ; 8 | reg en ; 9 | reg [12:0] feature ; 10 | 11 | wire [4:0] out_class ; 12 | wire en_end ; 13 | 14 | 15 | initial begin 16 | clk =0; 17 | rst_n =0; 18 | en =0; 19 | feature =0; 20 | #100 21 | 22 | rst_n =1; 23 | en =1; 24 | feature =13'd3590; 25 | #20 26 | feature =13'd3270; 27 | #20 28 | feature =13'd37; 29 | #20 30 | feature =13'd370; 31 | #20 32 | feature =13'd207; 33 | #20 34 | feature =13'd70; 35 | #20 36 | feature =13'd60; 37 | #20 38 | feature =13'd700; 39 | #20 40 | feature =13'd700; 41 | #20 42 | feature =13'd27; 43 | #20 44 | feature =13'd67; 45 | #20 46 | feature =13'd67; 47 | #20 48 | feature =13'd67; 49 | #20 50 | feature =13'd67; 51 | #20 52 | feature =13'd67; 53 | #20 54 | feature =13'd7; 55 | 56 | #1000 57 | $stop; 58 | 59 | end 60 | 61 | always#10 clk =!clk ; 62 | 63 | 64 | 65 | 66 | DT 67 | #( 68 | .LAYER_NUM (6 ), //Number of hidden layers,up to 4 69 | .FEATURE_WIDE (13 ), //input feature Intege bit width 70 | .FEATURE_NUM (16 ), //Number of input feature,up to 16 71 | .LAYER_CON0 (4'd0 ), 72 | .LAYER_CON1 ({4'd1,4'd0} ), 73 | .LAYER_CON2 ({4'd3,4'd2,4'd1,4'd0} ), 74 | .LAYER_CON3 ({4'd7,4'd6,4'd5,4'd4,4'd3,4'd2,4'd1,4'd0} ), 75 | .LAYER_CON4 ({4'd15,4'd14,4'd13,4'd12,4'd11,4'd10,4'd9,4'd8, 76 | 4'd7,4'd6,4'd5,4'd4,4'd3,4'd2,4'd1,4'd0 }), 77 | .LAYER_CON5 ({4'd15,4'd14,4'd13,4'd12,4'd11,4'd10,4'd9,4'd8, 78 | 4'd7,4'd6,4'd5,4'd4,4'd3,4'd2,4'd1,4'd0,4'd15, 79 | 4'd14,4'd13,4'd12,4'd11,4'd10,4'd9,4'd8,4'd7 , 80 | 4'd6,4'd5,4'd4,4'd3,4'd2,4'd1,4'd0}), 81 | .CLASS_WIDTH (7 ) 82 | ) 83 | DT 84 | ( 85 | .clk (clk ), 86 | .rst_n (rst_n ), 87 | .en (en ), 88 | .feature (feature ), 89 | 90 | .out_class (out_class ), 91 | .en_end (en_end ) 92 | ); 93 | 94 | 95 | 96 | 97 | 98 | 99 | endmodule -------------------------------------------------------------------------------- /ANN/layer.v: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | module layer 5 | #( 6 | parameter FEATURE_WIDE =4 , 7 | parameter NEU_NUM =12 8 | )( 9 | 10 | input clk , 11 | input rst_n , 12 | input en , 13 | input signed [NEU_NUM*(FEATURE_WIDE+5'd16)-1'b1:0] feature , 14 | 15 | 16 | 17 | 18 | 19 | output reg signed[ FEATURE_WIDE+4'd15:0] result , 20 | 21 | output reg en_end 22 | ); 23 | 24 | 25 | reg en_r ; 26 | 27 | wire [NEU_NUM*(FEATURE_WIDE+5'd16)-1'b1:0] result_r ; 28 | 29 | reg [3:0] cnt_x ; 30 | 31 | reg en_rr ; 32 | 33 | assign result_r=(en_end==1'b0)?feature:result_r; 34 | 35 | 36 | always@(posedge clk )begin 37 | en_r<=en; 38 | en_end<=en_rr; 39 | end 40 | 41 | always@(*)begin 42 | if (!rst_n)begin 43 | en_rr =1'b0; 44 | end 45 | else if (en==1'b1 && en_r==1'b0) begin 46 | en_rr =1'b1; 47 | end 48 | else begin 49 | en_rr =en_rr; 50 | end 51 | end 52 | 53 | always@(posedge clk or negedge rst_n )begin 54 | if(!rst_n)begin 55 | cnt_x<=4'd0; 56 | end 57 | else if(cnt_x==NEU_NUM)begin 58 | cnt_x<=4'd0; 59 | end 60 | else if(en_rr==1'b1) begin 61 | cnt_x<=cnt_x+1'b1; 62 | end 63 | end 64 | 65 | 66 | always@(posedge clk or negedge rst_n)begin 67 | if (!rst_n)begin 68 | result<={(FEATURE_WIDE+5'd16){1'b0}}; 69 | end 70 | else if (en_rr==1'b1 )begin 71 | case (cnt_x) 72 | 4'd0:result<=(NEU_NUM>=1)?result_r[FEATURE_WIDE+4'd15:0]:{(FEATURE_WIDE+5'd16){1'b0}}; 73 | 4'd1:result<=(NEU_NUM>=2)?result_r[2*(FEATURE_WIDE+5'd16)-1'b1: (FEATURE_WIDE+5'd16)]:{(FEATURE_WIDE+5'd16){1'b0}}; 74 | 4'd2:result<=(NEU_NUM>=3)?result_r[3*(FEATURE_WIDE+5'd16)-1'b1:2*(FEATURE_WIDE+5'd16)]:{(FEATURE_WIDE+5'd16){1'b0}}; 75 | 4'd3:result<=(NEU_NUM>=4)?result_r[4*(FEATURE_WIDE+5'd16)-1'b1:3*(FEATURE_WIDE+5'd16)]:{(FEATURE_WIDE+5'd16){1'b0}}; 76 | 4'd4:result<=(NEU_NUM>=5)?result_r[5*(FEATURE_WIDE+5'd16)-1'b1:4*(FEATURE_WIDE+5'd16)]:{(FEATURE_WIDE+5'd16){1'b0}}; 77 | 4'd5:result<=(NEU_NUM>=6)?result_r[6*(FEATURE_WIDE+5'd16)-1'b1:5*(FEATURE_WIDE+5'd16)]:{(FEATURE_WIDE+5'd16){1'b0}}; 78 | 4'd6:result<=(NEU_NUM>=7)?result_r[7*(FEATURE_WIDE+5'd16)-1'b1:6*(FEATURE_WIDE+5'd16)]:{(FEATURE_WIDE+5'd16){1'b0}}; 79 | 4'd7:result<=(NEU_NUM>=8)?result_r[8*(FEATURE_WIDE+5'd16)-1'b1:7*(FEATURE_WIDE+5'd16)]:{(FEATURE_WIDE+5'd16){1'b0}}; 80 | default:result<={(FEATURE_WIDE+5'd16){1'b0}}; 81 | endcase 82 | end 83 | else begin 84 | result<={(FEATURE_WIDE+5'd16){1'b0}}; 85 | end 86 | 87 | end 88 | 89 | 90 | 91 | 92 | endmodule -------------------------------------------------------------------------------- /ANN/nn_top.v: -------------------------------------------------------------------------------- 1 | 2 | // decimal digits 6 3 | 4 | module nn_top 5 | #( 6 | parameter CLASS_NUM =1 , //Number of neurons in output layer,up to 16 7 | parameter FEATURE_WIDE =7 , //input feature Intege bit width 8 | parameter FEATURE_NUM =7 , //Number of input feature,up to 16 9 | parameter LAYER_NUM =2 , //Number of hidden layers,up to 4 10 | parameter FUNCTION ={2'd3,2'd3,2'd3,2'd3,2'd1}, //Activation functions for the hidden layer and output layer,1 is RELU,2 is tanh ,3 is sigmiod, 11 | parameter NEU_NUM ={4'd8,4'd8,4'd8,4'd8} //Number of hidden layer neurons({layer 4,layer 3,layer 2,layer 1}) 12 | )( 13 | 14 | input clk , 15 | input rst_n , 16 | input signed [FEATURE_WIDE+3'd5:0] feature , 17 | input en , 18 | 19 | output signed[FEATURE_WIDE+4'd15:0] lab 20 | ); 21 | 22 | reg [4:0] cnt ; 23 | 24 | reg [FEATURE_NUM*(FEATURE_WIDE+3'd6) -1'b1:0] feature_sum ; 25 | 26 | wire signed [FEATURE_WIDE+3'd5:0] feature_sum0 ; 27 | 28 | wire in_en ; 29 | 30 | 31 | 32 | always@(posedge clk or negedge rst_n )begin 33 | if(!rst_n)begin 34 | cnt<=5'd0; 35 | end 36 | else if(cnt==FEATURE_NUM)begin 37 | cnt<=FEATURE_NUM; 38 | end 39 | else if(en==1'b1)begin 40 | cnt<=cnt+1'b1; 41 | end 42 | end 43 | 44 | 45 | 46 | always@(posedge clk or negedge rst_n )begin 47 | if(!rst_n)begin 48 | feature_sum<={FEATURE_NUM*(FEATURE_WIDE+3'd6){1'b0}}; 49 | end 50 | else if(cnt<=FEATURE_NUM-1'b1 && en ==1'b1)begin 51 | feature_sum<=(FEATURE_NUM>=2)?{feature,feature_sum[FEATURE_NUM*(FEATURE_WIDE+3'd6)-1'b1:FEATURE_WIDE+3'd6]}:feature; 52 | end 53 | else begin 54 | feature_sum<=(FEATURE_NUM>=2)?{feature_sum[FEATURE_WIDE+3'd5:0],feature_sum[FEATURE_NUM*(FEATURE_WIDE+3'd6)-1'b1:FEATURE_WIDE+3'd6]}:feature; 55 | end 56 | end 57 | 58 | assign feature_sum0=(cnt==FEATURE_NUM)?feature_sum[FEATURE_WIDE+3'd5:0]:{(FEATURE_WIDE+3'd6){1'b0}}; 59 | assign in_en=(cnt==FEATURE_NUM)?1'b1:1'b0; 60 | 61 | 62 | 63 | 64 | 65 | nn 66 | #( 67 | 68 | .CLASS_NUM (CLASS_NUM ), 69 | .FEATURE_WIDE (FEATURE_WIDE ), 70 | .FEATURE_NUM (FEATURE_NUM ), 71 | .LAYER_NUM (LAYER_NUM ), 72 | .FUNCTION (FUNCTION ), 73 | .NEU_NUM (NEU_NUM ) 74 | ) 75 | u_nn( 76 | 77 | .clk (clk ), 78 | .rst_n (rst_n ), 79 | .feature (feature_sum0 ), 80 | .en (in_en ), 81 | 82 | .lab (lab ) 83 | ); 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | endmodule -------------------------------------------------------------------------------- /ANN/out_layer.v: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | module out_layer 5 | #( 6 | parameter FEATURE_WIDE =4 , 7 | parameter NEU_NUM =12 8 | )( 9 | 10 | input clk , 11 | input rst_n , 12 | input en , 13 | input signed [8*(FEATURE_WIDE+5'd16)-1'b1:0] feature , 14 | input flag_begin , 15 | 16 | 17 | 18 | 19 | output reg signed[ FEATURE_WIDE+4'd15:0] result , 20 | 21 | output reg en_end 22 | ); 23 | 24 | 25 | reg en_r ; 26 | 27 | wire [8*(FEATURE_WIDE+5'd16)-1'b1:0] result_r ; 28 | 29 | reg [3:0] cnt_x ; 30 | 31 | reg en_rr ; 32 | 33 | 34 | 35 | assign result_r=(cnt_x==4'd0 || flag_begin==1'b1)?feature:result_r; 36 | 37 | 38 | always@(posedge clk )begin 39 | en_r<=en; 40 | en_end<=en_rr; 41 | end 42 | 43 | 44 | always@(*)begin 45 | if (!rst_n)begin 46 | en_rr =1'b0; 47 | end 48 | else if (en==1'b1 && en_r==1'b0) begin 49 | en_rr =1'b1; 50 | end 51 | else begin 52 | en_rr =en_rr; 53 | end 54 | end 55 | 56 | 57 | 58 | always@(posedge clk or negedge rst_n )begin 59 | if(!rst_n)begin 60 | cnt_x<=4'd0; 61 | end 62 | else if(cnt_x==4'd8)begin 63 | cnt_x<=4'd0; 64 | end 65 | else if(en_rr==1'b1) begin 66 | cnt_x<=cnt_x+1'b1; 67 | end 68 | end 69 | 70 | 71 | always@(posedge clk or negedge rst_n)begin 72 | if (!rst_n)begin 73 | result<={(FEATURE_WIDE+5'd16){1'b0}}; 74 | end 75 | else if (en_rr==1'b1 )begin 76 | case (cnt_x) 77 | 4'd0 :result<=(NEU_NUM>=1 )?result_r[FEATURE_WIDE+4'd15:0]:{(FEATURE_WIDE+5'd16){1'b0}}; 78 | 4'd1 :result<=(NEU_NUM>=2 )?result_r[2 *(FEATURE_WIDE+5'd16)-1'b1: (FEATURE_WIDE+5'd16)]:{(FEATURE_WIDE+5'd16){1'b0}}; 79 | 4'd2 :result<=(NEU_NUM>=3 )?result_r[3 *(FEATURE_WIDE+5'd16)-1'b1:2 *(FEATURE_WIDE+5'd16)]:{(FEATURE_WIDE+5'd16){1'b0}}; 80 | 4'd3 :result<=(NEU_NUM>=4 )?result_r[4 *(FEATURE_WIDE+5'd16)-1'b1:3 *(FEATURE_WIDE+5'd16)]:{(FEATURE_WIDE+5'd16){1'b0}}; 81 | 4'd4 :result<=(NEU_NUM>=5 )?result_r[5 *(FEATURE_WIDE+5'd16)-1'b1:4 *(FEATURE_WIDE+5'd16)]:{(FEATURE_WIDE+5'd16){1'b0}}; 82 | 4'd5 :result<=(NEU_NUM>=6 )?result_r[6 *(FEATURE_WIDE+5'd16)-1'b1:5 *(FEATURE_WIDE+5'd16)]:{(FEATURE_WIDE+5'd16){1'b0}}; 83 | 4'd6 :result<=(NEU_NUM>=7 )?result_r[7 *(FEATURE_WIDE+5'd16)-1'b1:6 *(FEATURE_WIDE+5'd16)]:{(FEATURE_WIDE+5'd16){1'b0}}; 84 | 4'd7 :result<=(NEU_NUM>=8 )?result_r[8 *(FEATURE_WIDE+5'd16)-1'b1:7 *(FEATURE_WIDE+5'd16)]:{(FEATURE_WIDE+5'd16){1'b0}}; 85 | default:result<={(FEATURE_WIDE+5'd16){1'b0}}; 86 | endcase 87 | end 88 | else begin 89 | result<={(FEATURE_WIDE+5'd16){1'b0}}; 90 | end 91 | 92 | end 93 | 94 | 95 | 96 | 97 | endmodule -------------------------------------------------------------------------------- /k-NN/regression_result_con.v: -------------------------------------------------------------------------------- 1 | module regression_result_con 2 | #( 3 | parameter NUM =3, 4 | parameter CLASS_NUM =6, 5 | parameter FEATURE_WIDE =4, 6 | parameter K =7, 7 | parameter LEN =12 8 | )( 9 | input clk , 10 | input rst_n , 11 | input flag , 12 | input [K*(2*LEN+2)-1:0] ocandidate , 13 | input [K*(2*LEN+2)-1:0] ecandidate , 14 | input [K*NUM-1:0] lab_e , 15 | input [K*NUM-1:0] lab_o , 16 | 17 | 18 | output [K*NUM-1:0] result 19 | 20 | 21 | ); 22 | 23 | reg [NUM-1'b1:0] lab ; 24 | 25 | reg [4:0] cnt ; 26 | 27 | reg [NUM+2'd3:0] sigma ; 28 | 29 | wire [NUM-1'b1:0] lab0 ; 30 | 31 | wire [NUM-1'b1:0] lab1 ; 32 | 33 | wire [NUM-1'b1:0] lab2 ; 34 | 35 | wire [NUM-1'b1:0] lab3 ; 36 | 37 | wire [NUM-1'b1:0] lab4 ; 38 | 39 | wire [NUM-1'b1:0] lab5 ; 40 | 41 | wire [NUM-1'b1:0] lab6 ; 42 | 43 | wire [NUM-1'b1:0] lab7 ; 44 | 45 | wire [NUM-1'b1:0] lab8 ; 46 | 47 | wire [NUM-1'b1:0] lab9 ; 48 | 49 | wire [NUM-1'b1:0] lab10 ; 50 | 51 | wire [NUM-1'b1:0] lab11 ; 52 | 53 | wire [NUM-1'b1:0] lab12 ; 54 | 55 | wire [NUM-1'b1:0] lab13 ; 56 | 57 | wire [NUM-1'b1:0] lab14 ; 58 | 59 | wire [NUM-1'b1:0] lab15 ; 60 | 61 | wire en ; 62 | 63 | 64 | always@(posedge clk or negedge rst_n)begin 65 | if(!rst_n)begin 66 | cnt<=5'd0; 67 | end 68 | else if (cnt==K)begin 69 | cnt<=K; 70 | 71 | end 72 | else if (en==1'b1)begin 73 | cnt<=cnt+1'b1; 74 | end 75 | end 76 | 77 | 78 | 79 | always@(*)begin 80 | case(cnt) 81 | 5'd0 : lab<=lab0 ; 82 | 5'd1 : lab<=lab1 ; 83 | 5'd2 : lab<=lab2 ; 84 | 5'd3 : lab<=lab3 ; 85 | 5'd4 : lab<=lab4 ; 86 | 5'd5 : lab<=lab5 ; 87 | 5'd6 : lab<=lab6 ; 88 | 5'd7 : lab<=lab7 ; 89 | 5'd8 : lab<=lab8 ; 90 | 5'd9 : lab<=lab9 ; 91 | 5'd10: lab<=lab10; 92 | 5'd11: lab<=lab11; 93 | 5'd12: lab<=lab12; 94 | 5'd13: lab<=lab13; 95 | 5'd14: lab<=lab14; 96 | 5'd15: lab<=lab15; 97 | default:lab<={NUM{1'b0}}; 98 | endcase 99 | end 100 | 101 | always@(posedge clk or negedge rst_n)begin 102 | if(!rst_n)begin 103 | sigma<={(NUM+3'd4){1'b0}}; 104 | end 105 | else if(cnt=1 ) ? (train_data[ LEN-1'b1: 0] - feature[ LEN-1'b1: 0]) * (train_data[ LEN-1'b1: 0] - feature[ LEN-1'b1: 0]):{(2*LEN){1'b0}}; 60 | ds_result1 <=(FEATURE_NUM>=2 ) ? (train_data[2 * LEN-1'b1: LEN] - feature[2 * LEN-1'b1: LEN]) * (train_data[2 * LEN-1'b1: LEN] - feature[2 * LEN-1'b1: LEN]):{(2*LEN){1'b0}}; 61 | ds_result2 <=(FEATURE_NUM>=3 ) ? (train_data[3 * LEN-1'b1:2 *LEN] - feature[3 * LEN-1'b1:2 *LEN]) * (train_data[3 * LEN-1'b1:2 *LEN] - feature[3 * LEN-1'b1:2 *LEN]):{(2*LEN){1'b0}}; 62 | ds_result3 <=(FEATURE_NUM>=4 ) ? (train_data[4 * LEN-1'b1:3 *LEN] - feature[4 * LEN-1'b1:3 *LEN]) * (train_data[4 * LEN-1'b1:3 *LEN] - feature[4 * LEN-1'b1:3 *LEN]):{(2*LEN){1'b0}}; 63 | ds_result4 <=(FEATURE_NUM>=5 ) ? (train_data[5 * LEN-1'b1:4 *LEN] - feature[5 * LEN-1'b1:4 *LEN]) * (train_data[5 * LEN-1'b1:4 *LEN] - feature[5 * LEN-1'b1:4 *LEN]):{(2*LEN){1'b0}}; 64 | ds_result5 <=(FEATURE_NUM>=6 ) ? (train_data[6 * LEN-1'b1:5 *LEN] - feature[6 * LEN-1'b1:5 *LEN]) * (train_data[6 * LEN-1'b1:5 *LEN] - feature[6 * LEN-1'b1:5 *LEN]):{(2*LEN){1'b0}}; 65 | ds_result6 <=(FEATURE_NUM>=7 ) ? (train_data[7 * LEN-1'b1:6 *LEN] - feature[7 * LEN-1'b1:6 *LEN]) * (train_data[7 * LEN-1'b1:6 *LEN] - feature[7 * LEN-1'b1:6 *LEN]):{(2*LEN){1'b0}}; 66 | ds_result7 <=(FEATURE_NUM>=8 ) ? (train_data[8 * LEN-1'b1:7 *LEN] - feature[8 * LEN-1'b1:7 *LEN]) * (train_data[8 * LEN-1'b1:7 *LEN] - feature[8 * LEN-1'b1:7 *LEN]):{(2*LEN){1'b0}}; 67 | ds_result8 <=(FEATURE_NUM>=9 ) ? (train_data[9 * LEN-1'b1:8 *LEN] - feature[9 * LEN-1'b1:8 *LEN]) * (train_data[9 * LEN-1'b1:8 *LEN] - feature[9 * LEN-1'b1:8 *LEN]):{(2*LEN){1'b0}}; 68 | ds_result9 <=(FEATURE_NUM>=10) ? (train_data[10 * LEN-1'b1:9 *LEN] - feature[10 * LEN-1'b1:9 *LEN]) * (train_data[10 * LEN-1'b1:9 *LEN] - feature[10 * LEN-1'b1:9 *LEN]):{(2*LEN){1'b0}}; 69 | ds_result10 <=(FEATURE_NUM>=11) ? (train_data[11 * LEN-1'b1:10*LEN] - feature[11 * LEN-1'b1:10*LEN]) * (train_data[11 * LEN-1'b1:10*LEN] - feature[11 * LEN-1'b1:10*LEN]):{(2*LEN){1'b0}}; 70 | ds_result11 <=(FEATURE_NUM>=12) ? (train_data[12 * LEN-1'b1:11*LEN] - feature[12 * LEN-1'b1:11*LEN]) * (train_data[12 * LEN-1'b1:11*LEN] - feature[12 * LEN-1'b1:11*LEN]):{(2*LEN){1'b0}}; 71 | ds_result12 <=(FEATURE_NUM>=13) ? (train_data[13 * LEN-1'b1:12*LEN] - feature[13 * LEN-1'b1:12*LEN]) * (train_data[13 * LEN-1'b1:12*LEN] - feature[13 * LEN-1'b1:12*LEN]):{(2*LEN){1'b0}}; 72 | ds_result13 <=(FEATURE_NUM>=14) ? (train_data[14 * LEN-1'b1:13*LEN] - feature[14 * LEN-1'b1:13*LEN]) * (train_data[14 * LEN-1'b1:13*LEN] - feature[14 * LEN-1'b1:13*LEN]):{(2*LEN){1'b0}}; 73 | ds_result14 <=(FEATURE_NUM>=15) ? (train_data[15 * LEN-1'b1:14*LEN] - feature[15 * LEN-1'b1:14*LEN]) * (train_data[15 * LEN-1'b1:14*LEN] - feature[15 * LEN-1'b1:14*LEN]):{(2*LEN){1'b0}}; 74 | ds_result15 <=(FEATURE_NUM>=16) ? (train_data[16 * LEN-1'b1:15*LEN] - feature[16 * LEN-1'b1:15*LEN]) * (train_data[16 * LEN-1'b1:15*LEN] - feature[16 * LEN-1'b1:15*LEN]):{(2*LEN){1'b0}}; 75 | end 76 | end 77 | 78 | 79 | 80 | always@(posedge clk or negedge rst_n)begin 81 | if(!rst_n) begin 82 | sigma_result <= {(2*LEN+FEATURE_WIDE){1'b0}}; 83 | end 84 | else begin 85 | sigma_result <= ds_result0 + ds_result1 +ds_result2 + ds_result3+ 86 | ds_result4 + ds_result5 +ds_result6 + ds_result7+ 87 | ds_result8 + ds_result9 +ds_result10 + ds_result11+ 88 | ds_result12 + ds_result13 +ds_result14 + ds_result15; 89 | end 90 | 91 | end 92 | 93 | 94 | endmodule -------------------------------------------------------------------------------- /SVM/top_svm.v: -------------------------------------------------------------------------------- 1 | 2 | 3 | module top_svm 4 | #( 5 | parameter FUNCTION =0 , //0 is classification 1 is regression 6 | parameter CLASS_WIDE =2 , 7 | parameter SVM_NUM =1024 , //<=8(2048),>8(1300) 8 | parameter FEATURE_WIDE =7 , //input feature Intege bit width 9 | parameter FEATURE_NUM =11 //Number of input feature,up to 16 10 | ) 11 | ( 12 | 13 | input clk , 14 | input rst_n , 15 | input signed [FEATURE_WIDE+3'd5:0] feature , 16 | 17 | output signed [CLASS_WIDE-1'b1:0] result , 18 | output wire en_end 19 | ); 20 | 21 | 22 | reg [1:0] cnt0_1 ; 23 | 24 | reg [4:0] cnt ; 25 | 26 | reg [16*(FEATURE_WIDE+3'd6) -1'b1:0] feature_sum ; 27 | 28 | reg signed [8*(FEATURE_WIDE+3'd6) -1'b1:0] feature_sum0 ; 29 | 30 | wire in_en ; 31 | 32 | reg in_en_r ; 33 | 34 | wire en_change ; 35 | 36 | reg [10:0] address ; 37 | 38 | reg [10:0] address_bias ; 39 | 40 | assign in_en=(cnt==FEATURE_NUM )?1'b1:1'b0; 41 | 42 | assign en_change=(cnt0_1!=2'd0)?1'b1:1'b0; 43 | 44 | 45 | 46 | 47 | always@(posedge clk or negedge rst_n )begin 48 | if(!rst_n)begin 49 | cnt<=5'd0; 50 | end 51 | else if(cnt==FEATURE_NUM)begin 52 | cnt<=FEATURE_NUM; 53 | end 54 | else begin 55 | cnt<=cnt+1'b1; 56 | end 57 | end 58 | 59 | always@(posedge clk or negedge rst_n )begin 60 | if(!rst_n)begin 61 | cnt0_1<=2'd0; 62 | end 63 | else if(cnt>=FEATURE_NUM-1'b1)begin 64 | if(FEATURE_NUM<=4'd8)begin 65 | if (cnt0_1==2'd1)begin 66 | cnt0_1<=2'd0; 67 | end 68 | else begin 69 | cnt0_1<=cnt0_1+1'b1; 70 | end 71 | end 72 | else begin 73 | if (cnt0_1==2'd2)begin 74 | cnt0_1<=2'd0; 75 | end 76 | else begin 77 | cnt0_1<=cnt0_1+1'b1; 78 | end 79 | end 80 | end 81 | else begin 82 | cnt0_1<=2'd0; 83 | end 84 | end 85 | 86 | 87 | always@(posedge clk or negedge rst_n )begin 88 | if(!rst_n)begin 89 | feature_sum<={16*(FEATURE_WIDE+3'd6){1'b0}}; 90 | end 91 | else if(cnt<=FEATURE_NUM-1'b1 )begin 92 | feature_sum<={feature_sum[15*(FEATURE_WIDE+3'd6)-1'b1:0],feature}; 93 | end 94 | else begin 95 | feature_sum<=feature_sum; 96 | end 97 | end 98 | 99 | 100 | always@(posedge clk or negedge rst_n)begin 101 | if(!rst_n)begin 102 | feature_sum0<={8*(FEATURE_WIDE+3'd6){1'b0}}; 103 | end 104 | else if (in_en==1'b1)begin 105 | if (FEATURE_NUM<=4'd8 )begin 106 | feature_sum0<=feature_sum; 107 | end 108 | else begin 109 | case (cnt0_1) 110 | 2'd0:feature_sum0<={8*(FEATURE_WIDE+3'd6){1'b0}}; 111 | 2'd1:feature_sum0<=feature_sum[8*(FEATURE_WIDE+3'd6) -1'b1:0]; 112 | 2'd2:feature_sum0<=feature_sum[16*(FEATURE_WIDE+3'd6) -1'b1:8*(FEATURE_WIDE+3'd6)]; 113 | default :feature_sum0<={8*(FEATURE_WIDE+3'd6){1'b0}}; 114 | endcase 115 | end 116 | end 117 | else begin 118 | feature_sum0<={8*(FEATURE_WIDE+3'd6){1'b0}}; 119 | end 120 | end 121 | 122 | always@(posedge clk or negedge rst_n)begin 123 | if(!rst_n)begin 124 | address<=11'd0; 125 | end 126 | else if(en_change==1'b1)begin 127 | address<=address+1'b1; 128 | end 129 | else begin 130 | address<=address; 131 | end 132 | end 133 | 134 | 135 | always@(posedge clk or negedge rst_n)begin 136 | if(!rst_n)begin 137 | address_bias<=11'd0; 138 | end 139 | else if(en_change==1'b0 && in_en==1'b1)begin 140 | address_bias<=address_bias+1'b1; 141 | end 142 | else begin 143 | address_bias<=address_bias; 144 | end 145 | end 146 | 147 | 148 | always@(posedge clk )begin 149 | 150 | in_en_r<=in_en; 151 | 152 | end 153 | 154 | 155 | SVM 156 | #( 157 | .FUNCTION (FUNCTION ), //0 is classification 1 is regression 158 | .SVM_NUM (SVM_NUM ), //Number of neurons in output layer,up to 8 159 | .FEATURE_WIDE (FEATURE_WIDE ), //input feature Intege bit width 160 | .CLASS_WIDE (CLASS_WIDE ), 161 | .FEATURE_NUM (FEATURE_NUM ) //Number of input feature,up to 16 162 | 163 | ) 164 | SVM( 165 | .clk (clk ), 166 | .rst_n (in_en_r ), 167 | .address (address ), 168 | .address_bias(address_bias ), 169 | .feature (feature_sum0 ), 170 | .en_change (en_change ), 171 | 172 | .result (result ), 173 | .en_end (en_end ) 174 | 175 | ); 176 | 177 | 178 | 179 | endmodule -------------------------------------------------------------------------------- /SVM/data_bias.v: -------------------------------------------------------------------------------- 1 | // megafunction wizard: %ROM: 1-PORT% 2 | // GENERATION: STANDARD 3 | // VERSION: WM1.0 4 | // MODULE: altsyncram 5 | 6 | // ============================================================ 7 | // File Name: data_bias.v 8 | // Megafunction Name(s): 9 | // altsyncram 10 | // 11 | // Simulation Library Files(s): 12 | // altera_mf 13 | // ============================================================ 14 | // ************************************************************ 15 | // THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! 16 | // 17 | // 18.1.0 Build 625 09/12/2018 SJ Standard Edition 18 | // ************************************************************ 19 | 20 | 21 | //Copyright (C) 2018 Intel Corporation. All rights reserved. 22 | //Your use of Intel Corporation's design tools, logic functions 23 | //and other software and tools, and its AMPP partner logic 24 | //functions, and any output files from any of the foregoing 25 | //(including device programming or simulation files), and any 26 | //associated documentation or information are expressly subject 27 | //to the terms and conditions of the Intel Program License 28 | //Subscription Agreement, the Intel Quartus Prime License Agreement, 29 | //the Intel FPGA IP License Agreement, or other applicable license 30 | //agreement, including, without limitation, that your use is for 31 | //the sole purpose of programming logic devices manufactured by 32 | //Intel and sold by Intel or its authorized distributors. Please 33 | //refer to the applicable agreement for further details. 34 | 35 | 36 | // synopsys translate_off 37 | `timescale 1 ps / 1 ps 38 | // synopsys translate_on 39 | module data_bias ( 40 | address, 41 | clock, 42 | q); 43 | 44 | input [10:0] address; 45 | input clock; 46 | output [12:0] q; 47 | `ifndef ALTERA_RESERVED_QIS 48 | // synopsys translate_off 49 | `endif 50 | tri1 clock; 51 | `ifndef ALTERA_RESERVED_QIS 52 | // synopsys translate_on 53 | `endif 54 | 55 | wire [12:0] sub_wire0; 56 | wire [12:0] q = sub_wire0[12:0]; 57 | 58 | altsyncram altsyncram_component ( 59 | .address_a (address), 60 | .clock0 (clock), 61 | .q_a (sub_wire0), 62 | .aclr0 (1'b0), 63 | .aclr1 (1'b0), 64 | .address_b (1'b1), 65 | .addressstall_a (1'b0), 66 | .addressstall_b (1'b0), 67 | .byteena_a (1'b1), 68 | .byteena_b (1'b1), 69 | .clock1 (1'b1), 70 | .clocken0 (1'b1), 71 | .clocken1 (1'b1), 72 | .clocken2 (1'b1), 73 | .clocken3 (1'b1), 74 | .data_a ({13{1'b1}}), 75 | .data_b (1'b1), 76 | .eccstatus (), 77 | .q_b (), 78 | .rden_a (1'b1), 79 | .rden_b (1'b1), 80 | .wren_a (1'b0), 81 | .wren_b (1'b0)); 82 | defparam 83 | altsyncram_component.address_aclr_a = "NONE", 84 | altsyncram_component.clock_enable_input_a = "BYPASS", 85 | altsyncram_component.clock_enable_output_a = "BYPASS", 86 | altsyncram_component.init_file = "bias_data.mif", 87 | altsyncram_component.intended_device_family = "Cyclone 10 LP", 88 | altsyncram_component.lpm_hint = "ENABLE_RUNTIME_MOD=NO", 89 | altsyncram_component.lpm_type = "altsyncram", 90 | altsyncram_component.numwords_a = 2048, 91 | altsyncram_component.operation_mode = "ROM", 92 | altsyncram_component.outdata_aclr_a = "NONE", 93 | altsyncram_component.outdata_reg_a = "CLOCK0", 94 | altsyncram_component.widthad_a = 11, 95 | altsyncram_component.width_a = 13, 96 | altsyncram_component.width_byteena_a = 1; 97 | 98 | 99 | endmodule 100 | 101 | // ============================================================ 102 | // CNX file retrieval info 103 | // ============================================================ 104 | // Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" 105 | // Retrieval info: PRIVATE: AclrAddr NUMERIC "0" 106 | // Retrieval info: PRIVATE: AclrByte NUMERIC "0" 107 | // Retrieval info: PRIVATE: AclrOutput NUMERIC "0" 108 | // Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" 109 | // Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" 110 | // Retrieval info: PRIVATE: BlankMemory NUMERIC "0" 111 | // Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" 112 | // Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" 113 | // Retrieval info: PRIVATE: Clken NUMERIC "0" 114 | // Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" 115 | // Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" 116 | // Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" 117 | // Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone 10 LP" 118 | // Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" 119 | // Retrieval info: PRIVATE: JTAG_ID STRING "NONE" 120 | // Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" 121 | // Retrieval info: PRIVATE: MIFfilename STRING "bias_data.mif" 122 | // Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "2048" 123 | // Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" 124 | // Retrieval info: PRIVATE: RegAddr NUMERIC "1" 125 | // Retrieval info: PRIVATE: RegOutput NUMERIC "1" 126 | // Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" 127 | // Retrieval info: PRIVATE: SingleClock NUMERIC "1" 128 | // Retrieval info: PRIVATE: UseDQRAM NUMERIC "0" 129 | // Retrieval info: PRIVATE: WidthAddr NUMERIC "11" 130 | // Retrieval info: PRIVATE: WidthData NUMERIC "13" 131 | // Retrieval info: PRIVATE: rden NUMERIC "0" 132 | // Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all 133 | // Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE" 134 | // Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" 135 | // Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" 136 | // Retrieval info: CONSTANT: INIT_FILE STRING "bias_data.mif" 137 | // Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone 10 LP" 138 | // Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" 139 | // Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" 140 | // Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "2048" 141 | // Retrieval info: CONSTANT: OPERATION_MODE STRING "ROM" 142 | // Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" 143 | // Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0" 144 | // Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "11" 145 | // Retrieval info: CONSTANT: WIDTH_A NUMERIC "13" 146 | // Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" 147 | // Retrieval info: USED_PORT: address 0 0 11 0 INPUT NODEFVAL "address[10..0]" 148 | // Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" 149 | // Retrieval info: USED_PORT: q 0 0 13 0 OUTPUT NODEFVAL "q[12..0]" 150 | // Retrieval info: CONNECT: @address_a 0 0 11 0 address 0 0 11 0 151 | // Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 152 | // Retrieval info: CONNECT: q 0 0 13 0 @q_a 0 0 13 0 153 | // Retrieval info: GEN_FILE: TYPE_NORMAL data_bias.v TRUE 154 | // Retrieval info: GEN_FILE: TYPE_NORMAL data_bias.inc FALSE 155 | // Retrieval info: GEN_FILE: TYPE_NORMAL data_bias.cmp FALSE 156 | // Retrieval info: GEN_FILE: TYPE_NORMAL data_bias.bsf FALSE 157 | // Retrieval info: GEN_FILE: TYPE_NORMAL data_bias_inst.v FALSE 158 | // Retrieval info: GEN_FILE: TYPE_NORMAL data_bias_bb.v FALSE 159 | // Retrieval info: LIB_FILE: altera_mf 160 | -------------------------------------------------------------------------------- /SVM/data.v: -------------------------------------------------------------------------------- 1 | // megafunction wizard: %ROM: 1-PORT% 2 | // GENERATION: STANDARD 3 | // VERSION: WM1.0 4 | // MODULE: altsyncram 5 | 6 | // ============================================================ 7 | // File Name: data.v 8 | // Megafunction Name(s): 9 | // altsyncram 10 | // 11 | // Simulation Library Files(s): 12 | // altera_mf 13 | // ============================================================ 14 | // ************************************************************ 15 | // THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! 16 | // 17 | // 18.1.0 Build 625 09/12/2018 SJ Standard Edition 18 | // ************************************************************ 19 | 20 | 21 | //Copyright (C) 2018 Intel Corporation. All rights reserved. 22 | //Your use of Intel Corporation's design tools, logic functions 23 | //and other software and tools, and its AMPP partner logic 24 | //functions, and any output files from any of the foregoing 25 | //(including device programming or simulation files), and any 26 | //associated documentation or information are expressly subject 27 | //to the terms and conditions of the Intel Program License 28 | //Subscription Agreement, the Intel Quartus Prime License Agreement, 29 | //the Intel FPGA IP License Agreement, or other applicable license 30 | //agreement, including, without limitation, that your use is for 31 | //the sole purpose of programming logic devices manufactured by 32 | //Intel and sold by Intel or its authorized distributors. Please 33 | //refer to the applicable agreement for further details. 34 | 35 | 36 | // synopsys translate_off 37 | `timescale 1 ps / 1 ps 38 | // synopsys translate_on 39 | module data ( 40 | address, 41 | clock, 42 | q); 43 | 44 | input [10:0] address; 45 | input clock; 46 | output [107:0] q; 47 | `ifndef ALTERA_RESERVED_QIS 48 | // synopsys translate_off 49 | `endif 50 | tri1 clock; 51 | `ifndef ALTERA_RESERVED_QIS 52 | // synopsys translate_on 53 | `endif 54 | 55 | wire [107:0] sub_wire0; 56 | wire [107:0] q = sub_wire0[107:0]; 57 | 58 | altsyncram altsyncram_component ( 59 | .address_a (address), 60 | .clock0 (clock), 61 | .q_a (sub_wire0), 62 | .aclr0 (1'b0), 63 | .aclr1 (1'b0), 64 | .address_b (1'b1), 65 | .addressstall_a (1'b0), 66 | .addressstall_b (1'b0), 67 | .byteena_a (1'b1), 68 | .byteena_b (1'b1), 69 | .clock1 (1'b1), 70 | .clocken0 (1'b1), 71 | .clocken1 (1'b1), 72 | .clocken2 (1'b1), 73 | .clocken3 (1'b1), 74 | .data_a ({108{1'b1}}), 75 | .data_b (1'b1), 76 | .eccstatus (), 77 | .q_b (), 78 | .rden_a (1'b1), 79 | .rden_b (1'b1), 80 | .wren_a (1'b0), 81 | .wren_b (1'b0)); 82 | defparam 83 | altsyncram_component.address_aclr_a = "NONE", 84 | altsyncram_component.clock_enable_input_a = "BYPASS", 85 | altsyncram_component.clock_enable_output_a = "BYPASS", 86 | `ifdef NO_PLI 87 | altsyncram_component.init_file = "w.rif" 88 | `else 89 | altsyncram_component.init_file = "w.hex" 90 | `endif 91 | , 92 | altsyncram_component.intended_device_family = "Cyclone 10 LP", 93 | altsyncram_component.lpm_hint = "ENABLE_RUNTIME_MOD=NO", 94 | altsyncram_component.lpm_type = "altsyncram", 95 | altsyncram_component.numwords_a = 2048, 96 | altsyncram_component.operation_mode = "ROM", 97 | altsyncram_component.outdata_aclr_a = "NONE", 98 | altsyncram_component.outdata_reg_a = "CLOCK0", 99 | altsyncram_component.widthad_a = 11, 100 | altsyncram_component.width_a = 108, 101 | altsyncram_component.width_byteena_a = 1; 102 | 103 | 104 | endmodule 105 | 106 | // ============================================================ 107 | // CNX file retrieval info 108 | // ============================================================ 109 | // Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" 110 | // Retrieval info: PRIVATE: AclrAddr NUMERIC "0" 111 | // Retrieval info: PRIVATE: AclrByte NUMERIC "0" 112 | // Retrieval info: PRIVATE: AclrOutput NUMERIC "0" 113 | // Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" 114 | // Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "9" 115 | // Retrieval info: PRIVATE: BlankMemory NUMERIC "0" 116 | // Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" 117 | // Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" 118 | // Retrieval info: PRIVATE: Clken NUMERIC "0" 119 | // Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" 120 | // Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" 121 | // Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" 122 | // Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone 10 LP" 123 | // Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" 124 | // Retrieval info: PRIVATE: JTAG_ID STRING "NONE" 125 | // Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" 126 | // Retrieval info: PRIVATE: MIFfilename STRING "w.hex" 127 | // Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "2048" 128 | // Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" 129 | // Retrieval info: PRIVATE: RegAddr NUMERIC "1" 130 | // Retrieval info: PRIVATE: RegOutput NUMERIC "1" 131 | // Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" 132 | // Retrieval info: PRIVATE: SingleClock NUMERIC "1" 133 | // Retrieval info: PRIVATE: UseDQRAM NUMERIC "0" 134 | // Retrieval info: PRIVATE: WidthAddr NUMERIC "11" 135 | // Retrieval info: PRIVATE: WidthData NUMERIC "108" 136 | // Retrieval info: PRIVATE: rden NUMERIC "0" 137 | // Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all 138 | // Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE" 139 | // Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" 140 | // Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" 141 | // Retrieval info: CONSTANT: INIT_FILE STRING "w.hex" 142 | // Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone 10 LP" 143 | // Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" 144 | // Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" 145 | // Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "2048" 146 | // Retrieval info: CONSTANT: OPERATION_MODE STRING "ROM" 147 | // Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" 148 | // Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0" 149 | // Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "11" 150 | // Retrieval info: CONSTANT: WIDTH_A NUMERIC "108" 151 | // Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" 152 | // Retrieval info: USED_PORT: address 0 0 11 0 INPUT NODEFVAL "address[10..0]" 153 | // Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" 154 | // Retrieval info: USED_PORT: q 0 0 108 0 OUTPUT NODEFVAL "q[107..0]" 155 | // Retrieval info: CONNECT: @address_a 0 0 11 0 address 0 0 11 0 156 | // Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 157 | // Retrieval info: CONNECT: q 0 0 108 0 @q_a 0 0 108 0 158 | // Retrieval info: GEN_FILE: TYPE_NORMAL data.v TRUE 159 | // Retrieval info: GEN_FILE: TYPE_NORMAL data.inc FALSE 160 | // Retrieval info: GEN_FILE: TYPE_NORMAL data.cmp FALSE 161 | // Retrieval info: GEN_FILE: TYPE_NORMAL data.bsf FALSE 162 | // Retrieval info: GEN_FILE: TYPE_NORMAL data_inst.v FALSE 163 | // Retrieval info: GEN_FILE: TYPE_NORMAL data_bb.v FALSE 164 | // Retrieval info: LIB_FILE: altera_mf 165 | -------------------------------------------------------------------------------- /DT/data.v: -------------------------------------------------------------------------------- 1 | // megafunction wizard: %ROM: 1-PORT% 2 | // GENERATION: STANDARD 3 | // VERSION: WM1.0 4 | // MODULE: altsyncram 5 | 6 | // ============================================================ 7 | // File Name: data.v 8 | // Megafunction Name(s): 9 | // altsyncram 10 | // 11 | // Simulation Library Files(s): 12 | // altera_mf 13 | // ============================================================ 14 | // ************************************************************ 15 | // THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! 16 | // 17 | // 18.1.0 Build 625 09/12/2018 SJ Standard Edition 18 | // ************************************************************ 19 | 20 | 21 | //Copyright (C) 2018 Intel Corporation. All rights reserved. 22 | //Your use of Intel Corporation's design tools, logic functions 23 | //and other software and tools, and its AMPP partner logic 24 | //functions, and any output files from any of the foregoing 25 | //(including device programming or simulation files), and any 26 | //associated documentation or information are expressly subject 27 | //to the terms and conditions of the Intel Program License 28 | //Subscription Agreement, the Intel Quartus Prime License Agreement, 29 | //the Intel FPGA IP License Agreement, or other applicable license 30 | //agreement, including, without limitation, that your use is for 31 | //the sole purpose of programming logic devices manufactured by 32 | //Intel and sold by Intel or its authorized distributors. Please 33 | //refer to the applicable agreement for further details. 34 | 35 | 36 | // synopsys translate_off 37 | `timescale 1 ps / 1 ps 38 | // synopsys translate_on 39 | module data ( 40 | address, 41 | clock, 42 | rden, 43 | q); 44 | 45 | input [5:0] address; 46 | input clock; 47 | input rden; 48 | output [15:0] q; 49 | `ifndef ALTERA_RESERVED_QIS 50 | // synopsys translate_off 51 | `endif 52 | tri1 clock; 53 | tri1 rden; 54 | `ifndef ALTERA_RESERVED_QIS 55 | // synopsys translate_on 56 | `endif 57 | 58 | wire [15:0] sub_wire0; 59 | wire [15:0] q = sub_wire0[15:0]; 60 | 61 | altsyncram altsyncram_component ( 62 | .address_a (address), 63 | .clock0 (clock), 64 | .rden_a (rden), 65 | .q_a (sub_wire0), 66 | .aclr0 (1'b0), 67 | .aclr1 (1'b0), 68 | .address_b (1'b1), 69 | .addressstall_a (1'b0), 70 | .addressstall_b (1'b0), 71 | .byteena_a (1'b1), 72 | .byteena_b (1'b1), 73 | .clock1 (1'b1), 74 | .clocken0 (1'b1), 75 | .clocken1 (1'b1), 76 | .clocken2 (1'b1), 77 | .clocken3 (1'b1), 78 | .data_a ({16{1'b1}}), 79 | .data_b (1'b1), 80 | .eccstatus (), 81 | .q_b (), 82 | .rden_b (1'b1), 83 | .wren_a (1'b0), 84 | .wren_b (1'b0)); 85 | defparam 86 | altsyncram_component.address_aclr_a = "NONE", 87 | altsyncram_component.clock_enable_input_a = "BYPASS", 88 | altsyncram_component.clock_enable_output_a = "BYPASS", 89 | `ifdef NO_PLI 90 | altsyncram_component.init_file = "w.rif" 91 | `else 92 | altsyncram_component.init_file = "w.hex" 93 | `endif 94 | , 95 | altsyncram_component.intended_device_family = "Cyclone 10 LP", 96 | altsyncram_component.lpm_hint = "ENABLE_RUNTIME_MOD=NO", 97 | altsyncram_component.lpm_type = "altsyncram", 98 | altsyncram_component.numwords_a = 64, 99 | altsyncram_component.operation_mode = "ROM", 100 | altsyncram_component.outdata_aclr_a = "NONE", 101 | altsyncram_component.outdata_reg_a = "CLOCK0", 102 | altsyncram_component.widthad_a = 6, 103 | altsyncram_component.width_a = 16, 104 | altsyncram_component.width_byteena_a = 1; 105 | 106 | 107 | endmodule 108 | 109 | // ============================================================ 110 | // CNX file retrieval info 111 | // ============================================================ 112 | // Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" 113 | // Retrieval info: PRIVATE: AclrAddr NUMERIC "0" 114 | // Retrieval info: PRIVATE: AclrByte NUMERIC "0" 115 | // Retrieval info: PRIVATE: AclrOutput NUMERIC "0" 116 | // Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" 117 | // Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" 118 | // Retrieval info: PRIVATE: BlankMemory NUMERIC "0" 119 | // Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" 120 | // Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" 121 | // Retrieval info: PRIVATE: Clken NUMERIC "0" 122 | // Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" 123 | // Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" 124 | // Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" 125 | // Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone 10 LP" 126 | // Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" 127 | // Retrieval info: PRIVATE: JTAG_ID STRING "NONE" 128 | // Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" 129 | // Retrieval info: PRIVATE: MIFfilename STRING "w.hex" 130 | // Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "64" 131 | // Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" 132 | // Retrieval info: PRIVATE: RegAddr NUMERIC "1" 133 | // Retrieval info: PRIVATE: RegOutput NUMERIC "1" 134 | // Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" 135 | // Retrieval info: PRIVATE: SingleClock NUMERIC "1" 136 | // Retrieval info: PRIVATE: UseDQRAM NUMERIC "0" 137 | // Retrieval info: PRIVATE: WidthAddr NUMERIC "6" 138 | // Retrieval info: PRIVATE: WidthData NUMERIC "16" 139 | // Retrieval info: PRIVATE: rden NUMERIC "1" 140 | // Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all 141 | // Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE" 142 | // Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" 143 | // Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" 144 | // Retrieval info: CONSTANT: INIT_FILE STRING "w.hex" 145 | // Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone 10 LP" 146 | // Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" 147 | // Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" 148 | // Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "64" 149 | // Retrieval info: CONSTANT: OPERATION_MODE STRING "ROM" 150 | // Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" 151 | // Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0" 152 | // Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "6" 153 | // Retrieval info: CONSTANT: WIDTH_A NUMERIC "16" 154 | // Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" 155 | // Retrieval info: USED_PORT: address 0 0 6 0 INPUT NODEFVAL "address[5..0]" 156 | // Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" 157 | // Retrieval info: USED_PORT: q 0 0 16 0 OUTPUT NODEFVAL "q[15..0]" 158 | // Retrieval info: USED_PORT: rden 0 0 0 0 INPUT VCC "rden" 159 | // Retrieval info: CONNECT: @address_a 0 0 6 0 address 0 0 6 0 160 | // Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 161 | // Retrieval info: CONNECT: @rden_a 0 0 0 0 rden 0 0 0 0 162 | // Retrieval info: CONNECT: q 0 0 16 0 @q_a 0 0 16 0 163 | // Retrieval info: GEN_FILE: TYPE_NORMAL data.v TRUE 164 | // Retrieval info: GEN_FILE: TYPE_NORMAL data.inc FALSE 165 | // Retrieval info: GEN_FILE: TYPE_NORMAL data.cmp FALSE 166 | // Retrieval info: GEN_FILE: TYPE_NORMAL data.bsf FALSE 167 | // Retrieval info: GEN_FILE: TYPE_NORMAL data_inst.v FALSE 168 | // Retrieval info: GEN_FILE: TYPE_NORMAL data_bb.v FALSE 169 | // Retrieval info: LIB_FILE: altera_mf 170 | -------------------------------------------------------------------------------- /k-NN/KNN.v: -------------------------------------------------------------------------------- 1 | 2 | module KNN 3 | #(parameter FUNCTION =0 , //classification 0,regression 1 4 | parameter FEATURE_NUM =4 , //number of feature, up to 16 5 | parameter FEATURE_WIDE =4 , //feature bit width 6 | parameter LEN =12 , //feature bit width 7 | parameter DATA_WIDE =3 , //sample bit width 8 | parameter COM_NUM =600 , //number of sample, up to 2048 9 | parameter K =6 , //up to 16 candidate 10 | parameter CLASS_NUM =6 , //number of category, up to 16 11 | parameter WIDE =48 12 | ) 13 | ( 14 | input clk , 15 | input rst_n , 16 | input [WIDE-1'b1:0] feature , 17 | input [WIDE+DATA_WIDE-1'b1:0] train_data , 18 | 19 | output [DATA_WIDE-1'b1:0] result 20 | 21 | ); 22 | 23 | 24 | 25 | 26 | reg [DATA_WIDE-1'b1:0] lab ; 27 | 28 | reg [DATA_WIDE-1'b1:0] lab0 ; 29 | 30 | wire [2*LEN+FEATURE_WIDE-1'b1:0] sigma_result ; 31 | 32 | wire [DATA_WIDE-1'b1:0] result0 ; 33 | 34 | wire [DATA_WIDE-1'b1:0] result1 ; 35 | 36 | reg [2*LEN+FEATURE_WIDE-1'b1:0] sigma_result0; 37 | 38 | reg [2*LEN+FEATURE_WIDE-1'b1:0] sigma_result1; 39 | 40 | reg cnt ; 41 | 42 | reg en_e ; 43 | 44 | reg en_o ; 45 | 46 | reg [DATA_WIDE-1'b1:0] lab_e ; 47 | 48 | reg [DATA_WIDE-1'b1:0] lab_o ; 49 | 50 | wire [K*(2*LEN+FEATURE_WIDE)-1'b1:0] ocandidate ; 51 | 52 | wire [K*(2*LEN+FEATURE_WIDE)-1'b1:0] ecandidate ; 53 | 54 | wire [K*DATA_WIDE-1'b1:0] lab_e0 ; 55 | 56 | wire [K*DATA_WIDE-1'b1:0] lab_o0 ; 57 | 58 | wire flag ; 59 | 60 | 61 | 62 | always@(posedge clk )begin 63 | 64 | lab0<=train_data[WIDE+DATA_WIDE-1'b1:WIDE]; 65 | 66 | lab <=lab0; 67 | 68 | end 69 | 70 | 71 | always@(posedge clk or negedge rst_n)begin 72 | if(!rst_n)begin 73 | cnt<=1'b0; 74 | end 75 | else begin 76 | cnt<=cnt+1'b1; 77 | end 78 | end 79 | 80 | 81 | always@(posedge clk or negedge rst_n)begin 82 | if(!rst_n)begin 83 | sigma_result0<={(2*LEN+FEATURE_WIDE){1'b0}}; 84 | sigma_result1<={(2*LEN+FEATURE_WIDE){1'b0}}; 85 | en_e<=1'b0; 86 | en_o<=1'b0; 87 | lab_e<={DATA_WIDE{1'b0}}; 88 | lab_o<={DATA_WIDE{1'b0}}; 89 | end 90 | else begin 91 | case(cnt) 92 | 1'b0:begin 93 | sigma_result0<=sigma_result; 94 | en_e<=1'b1; 95 | lab_e<=lab; 96 | end 97 | 1'b1:begin 98 | sigma_result1<=sigma_result; 99 | en_o<=1'b1; 100 | lab_o<=lab; 101 | end 102 | default:begin 103 | sigma_result0<={(2*LEN+FEATURE_WIDE){1'b0}}; 104 | sigma_result1<={(2*LEN+FEATURE_WIDE){1'b0}}; 105 | en_e<=en_e; 106 | en_o<=en_o; 107 | lab_e<=lab_e; 108 | lab_o<=lab_o; 109 | end 110 | endcase 111 | end 112 | end 113 | 114 | 115 | 116 | ds 117 | #( .LEN (LEN ), 118 | .FEATURE_NUM (FEATURE_NUM ), 119 | .FEATURE_WIDE(FEATURE_WIDE ), 120 | .WIDE (WIDE ) 121 | ) 122 | u_ds0 ( 123 | .clk ( clk ), 124 | .rst_n ( rst_n ), 125 | .feature ( feature ), 126 | .train_data ( train_data ), 127 | 128 | .sigma_result ( sigma_result) 129 | ); 130 | 131 | 132 | sort 133 | #( .LEN (LEN ), 134 | .NUM (DATA_WIDE ), 135 | .FEATURE_WIDE(FEATURE_WIDE ), 136 | .K (K ), 137 | .COM_NUM (COM_NUM ) 138 | ) 139 | e_u_sort ( 140 | .clk ( clk ), 141 | .rst_n ( en_e ), 142 | .sigma_result ( sigma_result0 ), 143 | .lab ( lab_e ), 144 | 145 | 146 | .candidate ( ecandidate ), 147 | .out_lab ( lab_e0 ) 148 | ); 149 | 150 | sort 151 | #( .LEN (LEN ), 152 | .NUM (DATA_WIDE ), 153 | .FEATURE_WIDE(FEATURE_WIDE ), 154 | .K (K ), 155 | .COM_NUM (COM_NUM ) 156 | ) 157 | o_u_sort ( 158 | .clk ( clk ), 159 | .rst_n ( en_o ), 160 | .sigma_result ( sigma_result1 ), 161 | .lab ( lab_o ), 162 | 163 | .flag (flag ), 164 | .candidate ( ocandidate ), 165 | .out_lab ( lab_o0 ) 166 | ); 167 | 168 | 169 | 170 | class_result_con 171 | #( .LEN (LEN ), 172 | .K (K ), 173 | .FEATURE_WIDE(FEATURE_WIDE ), 174 | .NUM (DATA_WIDE ), 175 | .CLASS_NUM (CLASS_NUM ) 176 | ) 177 | u_result ( 178 | .clk ( clk ), 179 | .rst_n ( rst_n ), 180 | .ocandidate ( ocandidate ), 181 | .ecandidate ( ecandidate ), 182 | .flag ( flag && !FUNCTION ), 183 | .lab_o ( lab_o0 ), 184 | .lab_e ( lab_e0 ), 185 | 186 | .lab (result0 ) 187 | ); 188 | 189 | 190 | regression_result_con 191 | #( .LEN (LEN ), 192 | .K (K ), 193 | .FEATURE_WIDE (FEATURE_WIDE ), 194 | .NUM (DATA_WIDE ), 195 | .CLASS_NUM (CLASS_NUM ) 196 | ) 197 | e_result ( 198 | .clk ( clk ), 199 | .rst_n ( rst_n ), 200 | .ocandidate ( ocandidate ), 201 | .ecandidate ( ecandidate ), 202 | .flag ( flag && FUNCTION ), 203 | .lab_o ( lab_o0 ), 204 | .lab_e ( lab_e0 ), 205 | 206 | .result (result1 ) 207 | ); 208 | 209 | 210 | assign result=(FUNCTION)?result1:result0; 211 | 212 | endmodule -------------------------------------------------------------------------------- /SVM/SVM.v: -------------------------------------------------------------------------------- 1 | module SVM 2 | #( 3 | parameter FUNCTION =0 , //0 is classification 1 is regression 4 | parameter CLASS_WIDE =2 , 5 | parameter SVM_NUM =800 , //Number of neurons in output layer,up to 8 6 | parameter FEATURE_WIDE =7 , //input feature Intege bit width 7 | parameter FEATURE_NUM =16 //Number of input feature,up to 16 8 | 9 | )( 10 | input clk , 11 | input rst_n , 12 | input en_change , 13 | input [8*(FEATURE_WIDE+3'd6)-1'b1:0] feature , 14 | input [10:0] address , 15 | input [10:0] address_bias, 16 | 17 | output signed [CLASS_WIDE-1'b1:0] result , 18 | output reg en_end 19 | 20 | ); 21 | 22 | reg [8*(FEATURE_WIDE+3'd6)-1'b1:0] feature_r ; 23 | 24 | wire signed [FEATURE_NUM+2*FEATURE_WIDE+3'd5:0] sigma0 ; 25 | 26 | wire signed [FEATURE_NUM+2*FEATURE_WIDE+3'd5:0] sigma1 ; 27 | 28 | wire signed [FEATURE_NUM+2*FEATURE_WIDE+3'd5:0] sigma2 ; 29 | 30 | wire signed [FEATURE_NUM+2*FEATURE_WIDE+3'd5:0] sigma3 ; 31 | 32 | wire signed [FEATURE_NUM+2*FEATURE_WIDE+3'd5:0] sigma4 ; 33 | 34 | wire signed [FEATURE_NUM+2*FEATURE_WIDE+3'd5:0] sigma5 ; 35 | 36 | wire signed [FEATURE_NUM+2*FEATURE_WIDE+3'd5:0] sigma6 ; 37 | 38 | wire signed [FEATURE_NUM+2*FEATURE_WIDE+3'd5:0] sigma7 ; 39 | 40 | wire [107:0] weight ; 41 | 42 | reg signed [FEATURE_NUM+2*FEATURE_WIDE+4'd9:0] result0 ; 43 | 44 | reg [10:0] cnt ; 45 | 46 | wire signed [12:0] bias ; 47 | 48 | wire signed [1:0] result_r ; 49 | 50 | wire flag_n ; 51 | 52 | reg en_change_r ; 53 | 54 | reg en_change_rr; 55 | 56 | wire en_end_r ; 57 | 58 | reg en ; 59 | 60 | 61 | 62 | assign en_end_r=!en_change_rr && en; 63 | 64 | assign result =(FUNCTION==1'b0)?result_r:result0; 65 | 66 | assign result_r=(en_end==1'b1)?(flag_n==1'b1)?2'd1:-2'd1:2'd0; 67 | 68 | assign flag_n =(result0[FEATURE_NUM+2*FEATURE_WIDE+4'd9]==1'b0 && result0!={(FEATURE_NUM+2*FEATURE_WIDE+4'd10){1'b0}})?1'b1:1'b0; 69 | 70 | 71 | 72 | 73 | 74 | always@(posedge clk or negedge rst_n)begin 75 | if(!rst_n)begin 76 | result0<={(FEATURE_NUM+2*FEATURE_WIDE+4'd10){1'b0}}; 77 | end 78 | else begin 79 | result0<=sigma0+sigma1+sigma2+sigma3+sigma4+sigma5+sigma6+sigma7+bias; 80 | end 81 | end 82 | 83 | 84 | 85 | 86 | always@(posedge clk or negedge rst_n)begin 87 | if (!rst_n)begin 88 | cnt<=11'd0; 89 | end 90 | else if (cnt==SVM_NUM)begin 91 | cnt<=SVM_NUM; 92 | end 93 | else if(en_change_rr==1'b0)begin 94 | cnt<=cnt+1'b1; 95 | end 96 | end 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | always@(posedge clk )begin 105 | 106 | feature_r<=feature; 107 | en_change_r<=en_change; 108 | en_change_rr<=en_change_r; 109 | en_end<=en_end_r; 110 | en<=rst_n; 111 | end 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | data data( 120 | .address(address ), 121 | .clock (clk ), 122 | 123 | .q (weight ) 124 | ); 125 | 126 | data_bias data_bias( 127 | .address (address_bias), 128 | .clock (clk ), 129 | .q (bias ) 130 | ); 131 | 132 | 133 | mux 134 | #( 135 | .FEATURE_WIDE (FEATURE_WIDE ), 136 | .FEATURE_NUM (FEATURE_NUM ) 137 | 138 | 139 | )int_mux0( 140 | .clk (clk ), 141 | .rst_n (rst_n ), 142 | .feature (feature_r[FEATURE_WIDE+3'd5:0] ), 143 | .weight (weight[12:0] ), 144 | .en (en_change_rr ), 145 | 146 | .sigma (sigma0 ) 147 | ); 148 | 149 | mux 150 | #( 151 | .FEATURE_WIDE (FEATURE_WIDE ), 152 | .FEATURE_NUM (FEATURE_NUM ) 153 | 154 | 155 | )int_mux1( 156 | .clk (clk ), 157 | .rst_n (rst_n ), 158 | .feature (feature_r[2*(FEATURE_WIDE+3'd6)-1'b1:FEATURE_WIDE+3'd6]), 159 | .weight (weight[25:13] ), 160 | .en (en_change_rr ), 161 | 162 | .sigma (sigma1 ) 163 | ); 164 | 165 | 166 | 167 | mux 168 | #( 169 | .FEATURE_WIDE (FEATURE_WIDE ), 170 | .FEATURE_NUM (FEATURE_NUM ) 171 | 172 | 173 | )int_mux2( 174 | .clk (clk ), 175 | .rst_n (rst_n ), 176 | .feature (feature_r[3*(FEATURE_WIDE+3'd6)-1'b1:2*(FEATURE_WIDE+3'd6)]), 177 | .weight (weight[38:26] ), 178 | .en (en_change_rr ), 179 | 180 | .sigma (sigma2 ) 181 | ); 182 | 183 | 184 | 185 | mux 186 | #( 187 | .FEATURE_WIDE (FEATURE_WIDE ), 188 | .FEATURE_NUM (FEATURE_NUM ) 189 | 190 | 191 | )int_mux3( 192 | .clk (clk ), 193 | .rst_n (rst_n ), 194 | .feature (feature_r[4*(FEATURE_WIDE+3'd6)-1'b1:3*(FEATURE_WIDE+3'd6)]), 195 | .weight (weight[51:39] ), 196 | .en (en_change_rr ), 197 | 198 | .sigma (sigma3 ) 199 | ); 200 | 201 | 202 | mux 203 | #( 204 | .FEATURE_WIDE (FEATURE_WIDE ), 205 | .FEATURE_NUM (FEATURE_NUM ) 206 | 207 | 208 | )int_mux4( 209 | .clk (clk ), 210 | .rst_n (rst_n ), 211 | .feature (feature_r[5*(FEATURE_WIDE+3'd6)-1'b1:4*(FEATURE_WIDE+3'd6)]), 212 | .weight (weight[64:52] ), 213 | .en (en_change_rr ), 214 | 215 | .sigma (sigma4 ) 216 | ); 217 | 218 | 219 | mux 220 | #( 221 | .FEATURE_WIDE (FEATURE_WIDE ), 222 | .FEATURE_NUM (FEATURE_NUM ) 223 | 224 | 225 | )int_mux5( 226 | .clk (clk ), 227 | .rst_n (rst_n ), 228 | .feature (feature_r[6*(FEATURE_WIDE+3'd6)-1'b1:5*(FEATURE_WIDE+3'd6)]), 229 | .weight (weight[77:65] ), 230 | .en (en_change_rr ), 231 | 232 | .sigma (sigma5 ) 233 | ); 234 | 235 | 236 | 237 | mux 238 | #( 239 | .FEATURE_WIDE (FEATURE_WIDE ), 240 | .FEATURE_NUM (FEATURE_NUM ) 241 | 242 | 243 | )int_mux6( 244 | .clk (clk ), 245 | .rst_n (rst_n ), 246 | .feature (feature_r[7*(FEATURE_WIDE+3'd6)-1'b1:6*(FEATURE_WIDE+3'd6)]), 247 | .weight (weight[90:78] ), 248 | .en (en_change_rr ), 249 | 250 | .sigma (sigma6 ) 251 | ); 252 | 253 | 254 | 255 | mux 256 | #( 257 | .FEATURE_WIDE (FEATURE_WIDE ), 258 | .FEATURE_NUM (FEATURE_NUM ) 259 | 260 | 261 | )int_mux7( 262 | .clk (clk ), 263 | .rst_n (rst_n ), 264 | .feature (feature_r[8*(FEATURE_WIDE+3'd6)-1'b1:7*(FEATURE_WIDE+3'd6)]), 265 | .weight (weight[103:91] ), 266 | .en (en_change_rr ), 267 | 268 | .sigma (sigma7 ) 269 | ); 270 | 271 | 272 | endmodule -------------------------------------------------------------------------------- /ANN/mac.v: -------------------------------------------------------------------------------- 1 | 2 | 3 | module mac 4 | #( 5 | parameter FEATURE_WIDE =4, 6 | parameter CLASS_NUM =8 7 | )( 8 | 9 | input clk , 10 | input rst_n , 11 | input en , 12 | input signed [FEATURE_WIDE+4'd15:0] feature , 13 | input [127:0] w , 14 | input [4:0] n_num , 15 | input [4:0] f_num , 16 | input flag_end , 17 | 18 | output flag_begin , 19 | output [8*(FEATURE_WIDE+5'd16)-1:0] result , 20 | output reg en_end , 21 | output en_addr 22 | ); 23 | 24 | 25 | reg [3:0] cnt_x ; 26 | 27 | reg [4:0] cnt_y ; 28 | 29 | reg signed [FEATURE_WIDE+5'd25:0] result0 ; 30 | 31 | reg signed [FEATURE_WIDE+5'd25:0] result1 ; 32 | 33 | reg signed [FEATURE_WIDE+5'd25:0] result2 ; 34 | 35 | reg signed [FEATURE_WIDE+5'd25:0] result3 ; 36 | 37 | reg signed [FEATURE_WIDE+5'd25:0] result4 ; 38 | 39 | reg signed [FEATURE_WIDE+5'd25:0] result5 ; 40 | 41 | reg signed [FEATURE_WIDE+5'd25:0] result6 ; 42 | 43 | reg signed [FEATURE_WIDE+5'd25:0] result7 ; 44 | 45 | wire signed [FEATURE_WIDE+5'd25:0] result0r ; 46 | 47 | wire signed [FEATURE_WIDE+5'd25:0] result1r ; 48 | 49 | wire signed [FEATURE_WIDE+5'd25:0] result2r ; 50 | 51 | wire signed [FEATURE_WIDE+5'd25:0] result3r ; 52 | 53 | wire signed [FEATURE_WIDE+5'd25:0] result4r ; 54 | 55 | wire signed [FEATURE_WIDE+5'd25:0] result5r ; 56 | 57 | wire signed [FEATURE_WIDE+5'd25:0] result6r ; 58 | 59 | wire signed [FEATURE_WIDE+5'd25:0] result7r ; 60 | 61 | wire signed [FEATURE_WIDE+5'd25:0] result00 ; 62 | 63 | wire signed [FEATURE_WIDE+5'd25:0] result11 ; 64 | 65 | wire signed [FEATURE_WIDE+5'd25:0] result22 ; 66 | 67 | wire signed [FEATURE_WIDE+5'd25:0] result33 ; 68 | 69 | wire signed [FEATURE_WIDE+5'd25:0] result44 ; 70 | 71 | wire signed [FEATURE_WIDE+5'd25:0] result55 ; 72 | 73 | wire signed [FEATURE_WIDE+5'd25:0] result66 ; 74 | 75 | wire signed [FEATURE_WIDE+5'd25:0] result77 ; 76 | 77 | wire signed [FEATURE_WIDE+3'd5:0] b0 ; 78 | 79 | wire signed [FEATURE_WIDE+3'd5:0] b1 ; 80 | 81 | wire signed [FEATURE_WIDE+3'd5:0] b2 ; 82 | 83 | wire signed [FEATURE_WIDE+3'd5:0] b3 ; 84 | 85 | wire signed [FEATURE_WIDE+3'd5:0] b4 ; 86 | 87 | wire signed [FEATURE_WIDE+3'd5:0] b5 ; 88 | 89 | wire signed [FEATURE_WIDE+3'd5:0] b6 ; 90 | 91 | wire signed [FEATURE_WIDE+3'd5:0] b7 ; 92 | 93 | wire signed [FEATURE_WIDE+3'd5:0] w0 ; 94 | 95 | wire signed [FEATURE_WIDE+3'd5:0] w1 ; 96 | 97 | wire signed [FEATURE_WIDE+3'd5:0] w2 ; 98 | 99 | wire signed [FEATURE_WIDE+3'd5:0] w3 ; 100 | 101 | wire signed [FEATURE_WIDE+3'd5:0] w4 ; 102 | 103 | wire signed [FEATURE_WIDE+3'd5:0] w5 ; 104 | 105 | wire signed [FEATURE_WIDE+3'd5:0] w6 ; 106 | 107 | wire signed [FEATURE_WIDE+3'd5:0] w7 ; 108 | 109 | reg en_r ; 110 | 111 | reg en_rr ; 112 | 113 | reg signed [FEATURE_WIDE+4'd15:0] feature_r ; 114 | 115 | reg signed [FEATURE_WIDE+4'd15:0] feature_rr; 116 | 117 | reg [4:0] n_num_r ; 118 | 119 | reg [4:0] n_num_rr ; 120 | 121 | wire en_end_r ; 122 | 123 | reg en_end_rr ; 124 | 125 | reg en_end_rrr; 126 | 127 | reg flag ; 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | assign result={result7[FEATURE_WIDE+4'd15:0],result6[FEATURE_WIDE+4'd15:0],result5[FEATURE_WIDE+4'd15:0] 136 | ,result4[FEATURE_WIDE+4'd15:0],result3[FEATURE_WIDE+4'd15:0],result2[FEATURE_WIDE+4'd15:0] 137 | ,result1[FEATURE_WIDE+4'd15:0],result0[FEATURE_WIDE+4'd15:0]}; 138 | 139 | assign w0=(en_end_rrr==1'b0 || (cnt_x!=f_num && flag_end==1'b1))?w[ 15: 0]:{(FEATURE_WIDE+3'd5){1'b0}}; 140 | assign w1=(en_end_rrr==1'b0 || (cnt_x!=f_num && flag_end==1'b1))?w[ 31: 16]:{(FEATURE_WIDE+3'd5){1'b0}}; 141 | assign w2=(en_end_rrr==1'b0 || (cnt_x!=f_num && flag_end==1'b1))?w[ 47: 32]:{(FEATURE_WIDE+3'd5){1'b0}}; 142 | assign w3=(en_end_rrr==1'b0 || (cnt_x!=f_num && flag_end==1'b1))?w[ 63: 48]:{(FEATURE_WIDE+3'd5){1'b0}}; 143 | assign w4=(en_end_rrr==1'b0 || (cnt_x!=f_num && flag_end==1'b1))?w[ 79: 64]:{(FEATURE_WIDE+3'd5){1'b0}}; 144 | assign w5=(en_end_rrr==1'b0 || (cnt_x!=f_num && flag_end==1'b1))?w[ 95: 80]:{(FEATURE_WIDE+3'd5){1'b0}}; 145 | assign w6=(en_end_rrr==1'b0 || (cnt_x!=f_num && flag_end==1'b1))?w[111: 96]:{(FEATURE_WIDE+3'd5){1'b0}}; 146 | assign w7=(en_end_rrr==1'b0 || (cnt_x!=f_num && flag_end==1'b1))?w[127:112]:{(FEATURE_WIDE+3'd5){1'b0}}; 147 | 148 | assign b0=(en_end_rrr==1'b1 || cnt_x==f_num )?w[ 15: 0]:{(FEATURE_WIDE+3'd5){1'b0}}; 149 | assign b1=(en_end_rrr==1'b1 || cnt_x==f_num )?w[ 31: 16]:{(FEATURE_WIDE+3'd5){1'b0}}; 150 | assign b2=(en_end_rrr==1'b1 || cnt_x==f_num )?w[ 47: 32]:{(FEATURE_WIDE+3'd5){1'b0}}; 151 | assign b3=(en_end_rrr==1'b1 || cnt_x==f_num )?w[ 63: 48]:{(FEATURE_WIDE+3'd5){1'b0}}; 152 | assign b4=(en_end_rrr==1'b1 || cnt_x==f_num )?w[ 79: 64]:{(FEATURE_WIDE+3'd5){1'b0}}; 153 | assign b5=(en_end_rrr==1'b1 || cnt_x==f_num )?w[ 95: 80]:{(FEATURE_WIDE+3'd5){1'b0}}; 154 | assign b6=(en_end_rrr==1'b1 || cnt_x==f_num )?w[111: 96]:{(FEATURE_WIDE+3'd5){1'b0}}; 155 | assign b7=(en_end_rrr==1'b1 || cnt_x==f_num )?w[127:112]:{(FEATURE_WIDE+3'd5){1'b0}}; 156 | 157 | 158 | assign result00=(w0 * feature_rr)>>6; 159 | assign result11=(w1 * feature_rr)>>6; 160 | assign result22=(w2 * feature_rr)>>6; 161 | assign result33=(w3 * feature_rr)>>6; 162 | assign result44=(w4 * feature_rr)>>6; 163 | assign result55=(w5 * feature_rr)>>6; 164 | assign result66=(w6 * feature_rr)>>6; 165 | assign result77=(w7 * feature_rr)>>6; 166 | 167 | 168 | assign result0r=(cnt_x==4'd0 && flag_end==1'b1)?{(FEATURE_WIDE+5'd26){1'b0}}:result0; 169 | assign result1r=(cnt_x==4'd0 && flag_end==1'b1)?{(FEATURE_WIDE+5'd26){1'b0}}:result1; 170 | assign result2r=(cnt_x==4'd0 && flag_end==1'b1)?{(FEATURE_WIDE+5'd26){1'b0}}:result2; 171 | assign result3r=(cnt_x==4'd0 && flag_end==1'b1)?{(FEATURE_WIDE+5'd26){1'b0}}:result3; 172 | assign result4r=(cnt_x==4'd0 && flag_end==1'b1)?{(FEATURE_WIDE+5'd26){1'b0}}:result4; 173 | assign result5r=(cnt_x==4'd0 && flag_end==1'b1)?{(FEATURE_WIDE+5'd26){1'b0}}:result5; 174 | assign result6r=(cnt_x==4'd0 && flag_end==1'b1)?{(FEATURE_WIDE+5'd26){1'b0}}:result6; 175 | assign result7r=(cnt_x==4'd0 && flag_end==1'b1)?{(FEATURE_WIDE+5'd26){1'b0}}:result7; 176 | 177 | 178 | assign en_end_r=(en==1'b1 && cnt_y==f_num)?1'b1:1'b0; 179 | 180 | assign en_addr=((flag==1'b0 && en==1'b1 ) || flag_end==1'b1 )?1'b1:1'b0; 181 | 182 | assign flag_begin=(cnt_x==4'd0 && flag_end==1'b1)?1'b1:1'b0; 183 | 184 | always@(posedge clk or negedge rst_n)begin 185 | if(!rst_n)begin 186 | flag<=1'b0; 187 | end 188 | else if(en ==1'b0)begin 189 | flag<=1'b0; 190 | end 191 | else if (en_end_r==1'b1)begin 192 | flag<=1'b1; 193 | end 194 | end 195 | 196 | always@(posedge clk )begin 197 | en_r<=en; 198 | en_rr<=en_r; 199 | feature_r<=feature; 200 | feature_rr<=feature_r; 201 | n_num_r<=n_num; 202 | n_num_rr<=n_num_r; 203 | en_end_rr<=en_end_r; 204 | en_end_rrr<=en_end_rr; 205 | en_end<=en_end_rrr; 206 | end 207 | 208 | always@(posedge clk or negedge rst_n )begin 209 | if(!rst_n)begin 210 | cnt_x<=4'd0; 211 | end 212 | else if(cnt_x==f_num)begin 213 | cnt_x<=4'd0; 214 | end 215 | else if(flag_end==1'b1 && en_rr==1'b1)begin 216 | cnt_x<=cnt_x+1'b1; 217 | end 218 | end 219 | 220 | 221 | always@(posedge clk or negedge rst_n )begin 222 | if(!rst_n)begin 223 | cnt_y<=5'd0; 224 | 225 | end 226 | else if (en==1'b1)begin 227 | if(cnt_y==f_num+1'b1)begin 228 | cnt_y<=f_num+1'b1; 229 | end 230 | else begin 231 | cnt_y<=cnt_y+1'b1; 232 | end 233 | end 234 | else begin 235 | cnt_y<=5'd0; 236 | end 237 | end 238 | 239 | 240 | always@(posedge clk or negedge rst_n)begin 241 | if (!rst_n)begin 242 | result0 <={(FEATURE_WIDE+5'd26){1'b0}}; 243 | result1 <={(FEATURE_WIDE+5'd26){1'b0}}; 244 | result2 <={(FEATURE_WIDE+5'd26){1'b0}}; 245 | result3 <={(FEATURE_WIDE+5'd26){1'b0}}; 246 | result4 <={(FEATURE_WIDE+5'd26){1'b0}}; 247 | result5 <={(FEATURE_WIDE+5'd26){1'b0}}; 248 | result6 <={(FEATURE_WIDE+5'd26){1'b0}}; 249 | result7 <={(FEATURE_WIDE+5'd26){1'b0}}; 250 | end 251 | else if (en_rr==1'b1)begin 252 | result0 <=(n_num_rr>=4'd1)? result0r+{{6{result00[FEATURE_WIDE+5'd19]}},result00[FEATURE_WIDE+5'd19:0]}+b0:{(FEATURE_WIDE+5'd26){1'b0}}; 253 | result1 <=(n_num_rr>=4'd2)? result1r+{{6{result11[FEATURE_WIDE+5'd19]}},result11[FEATURE_WIDE+5'd19:0]}+b1:{(FEATURE_WIDE+5'd26){1'b0}}; 254 | result2 <=(n_num_rr>=4'd3)? result2r+{{6{result22[FEATURE_WIDE+5'd19]}},result22[FEATURE_WIDE+5'd19:0]}+b2:{(FEATURE_WIDE+5'd26){1'b0}}; 255 | result3 <=(n_num_rr>=4'd4)? result3r+{{6{result33[FEATURE_WIDE+5'd19]}},result33[FEATURE_WIDE+5'd19:0]}+b3:{(FEATURE_WIDE+5'd26){1'b0}}; 256 | result4 <=(n_num_rr>=4'd5)? result4r+{{6{result44[FEATURE_WIDE+5'd19]}},result44[FEATURE_WIDE+5'd19:0]}+b4:{(FEATURE_WIDE+5'd26){1'b0}}; 257 | result5 <=(n_num_rr>=4'd6)? result5r+{{6{result55[FEATURE_WIDE+5'd19]}},result55[FEATURE_WIDE+5'd19:0]}+b5:{(FEATURE_WIDE+5'd26){1'b0}}; 258 | result6 <=(n_num_rr>=4'd7)? result6r+{{6{result66[FEATURE_WIDE+5'd19]}},result66[FEATURE_WIDE+5'd19:0]}+b6:{(FEATURE_WIDE+5'd26){1'b0}}; 259 | result7 <=(n_num_rr>=4'd8)? result7r+{{6{result77[FEATURE_WIDE+5'd19]}},result77[FEATURE_WIDE+5'd19:0]}+b7:{(FEATURE_WIDE+5'd26){1'b0}}; 260 | end 261 | else begin 262 | result0 <={(FEATURE_WIDE+5'd26){1'b0}}; 263 | result1 <={(FEATURE_WIDE+5'd26){1'b0}}; 264 | result2 <={(FEATURE_WIDE+5'd26){1'b0}}; 265 | result3 <={(FEATURE_WIDE+5'd26){1'b0}}; 266 | result4 <={(FEATURE_WIDE+5'd26){1'b0}}; 267 | result5 <={(FEATURE_WIDE+5'd26){1'b0}}; 268 | result6 <={(FEATURE_WIDE+5'd26){1'b0}}; 269 | result7 <={(FEATURE_WIDE+5'd26){1'b0}}; 270 | 271 | end 272 | 273 | end 274 | 275 | 276 | 277 | 278 | 279 | endmodule -------------------------------------------------------------------------------- /ANN/nn.v: -------------------------------------------------------------------------------- 1 | 2 | 3 | module nn 4 | #( 5 | 6 | parameter CLASS_NUM =6 , 7 | parameter FEATURE_WIDE =4 , 8 | parameter FEATURE_NUM =4 , //up to 16 9 | parameter LAYER_NUM =4 , 10 | parameter FUNCTION ={2'd2,2'd1,2'd3,2'd2,2'd1}, 11 | parameter NEU_NUM ={4'd8,4'd8,4'd8,4'd8} //每一层神经元8位,然后从低到高位第一层隐藏层到最后一层隐藏层 12 | )( 13 | 14 | input clk , 15 | input rst_n , 16 | input signed [FEATURE_WIDE+3'd5:0] feature , 17 | input en , 18 | 19 | output signed[(FEATURE_WIDE+4'd15):0] lab , 20 | output out_end 21 | ); 22 | 23 | 24 | 25 | reg [9:0] address ; 26 | 27 | reg mac_en ; 28 | 29 | reg signed [(FEATURE_WIDE+4'd15):0] in_feature ; 30 | 31 | reg [4:0] n_num ; 32 | 33 | 34 | reg [4:0] f_num ; 35 | 36 | wire [3:0] f_num0 ; 37 | 38 | wire [8*(FEATURE_WIDE+5'd16)-1'b1:0] result ; 39 | 40 | wire en_end ; 41 | 42 | wire signed [(FEATURE_WIDE+4'd15):0] result0 ; 43 | 44 | wire en_end0 ; 45 | 46 | wire signed [(FEATURE_WIDE+4'd15):0] result1 ; 47 | 48 | wire en_end1 ; 49 | 50 | wire signed [(FEATURE_WIDE+4'd15):0] result2 ; 51 | 52 | wire en_end2 ; 53 | 54 | wire signed [(FEATURE_WIDE+4'd15):0] result3 ; 55 | 56 | wire en_end3 ; 57 | 58 | wire signed [(FEATURE_WIDE+4'd15):0] result4 ; 59 | 60 | wire en_end4 ; 61 | 62 | wire signed [(FEATURE_WIDE+4'd15):0] result5 ; 63 | 64 | wire en_end5 ; 65 | 66 | wire signed [(FEATURE_WIDE+4'd15):0] result6 ; 67 | 68 | wire en_end6 ; 69 | 70 | wire signed [(FEATURE_WIDE+4'd15):0] result7 ; 71 | 72 | wire en_end7 ; 73 | 74 | wire signed [(FEATURE_WIDE+4'd15):0] result8 ; 75 | 76 | wire en_end8 ; 77 | 78 | reg en_end_fr ; 79 | 80 | reg signed [(FEATURE_WIDE+4'd15):0] result_fr ; 81 | 82 | reg en_end_ft ; 83 | 84 | reg signed [(FEATURE_WIDE+4'd15):0] result_ft ; 85 | 86 | wire en_end_r ; 87 | 88 | wire signed [(FEATURE_WIDE+4'd15):0] result_r ; 89 | 90 | wire en_end_t ; 91 | 92 | wire signed [(FEATURE_WIDE+4'd15):0] result_t ; 93 | 94 | reg flag_end ; 95 | 96 | wire out_en ; 97 | 98 | wire out_en0 ; 99 | 100 | wire [127:0] w ; 101 | 102 | wire rden ; 103 | 104 | reg en_flag ; 105 | 106 | reg [3:0 ] test ; 107 | 108 | reg [3:0 ] test_r ; 109 | 110 | reg choice ; 111 | 112 | wire flag_begin ; 113 | 114 | wire [FEATURE_WIDE+4'd15:0] out_result ; 115 | 116 | 117 | assign out_en=(LAYER_NUM==1)?en_end1:(LAYER_NUM==2)?en_end3:(LAYER_NUM==3)?en_end5 118 | :(LAYER_NUM==4)?en_end7:1'b0; 119 | 120 | assign out_result=(LAYER_NUM==1)?result1:(LAYER_NUM==2)?result3:(LAYER_NUM==3)?result5 121 | :(LAYER_NUM==4)?result7:{(FEATURE_WIDE+5'd16){1'b0}}; 122 | 123 | assign out_en0=(LAYER_NUM==1)?en_end0:(LAYER_NUM==2)?en_end2:(LAYER_NUM==3)?en_end4 124 | :(LAYER_NUM==4)?en_end6:1'b0; 125 | 126 | assign f_num0=(LAYER_NUM==1)?NEU_NUM[3:0]:(LAYER_NUM==2)?NEU_NUM[7:4]:(LAYER_NUM==3)?NEU_NUM[11:8] 127 | :(LAYER_NUM==4)?NEU_NUM[15:12]:4'd0; 128 | 129 | 130 | 131 | assign result1=(en_end0==1'b1)?((FUNCTION[1:0]==2'd1)?result_r 132 | :(FUNCTION[1:0]==2'd2 || FUNCTION[1:0]==2'd3)?result_t:{(FEATURE_WIDE+5'd16){1'b0}}) 133 | :{(FEATURE_WIDE+5'd16){1'b0}}; 134 | 135 | assign en_end1=(en_end0==1'b1)?((FUNCTION[1:0]==2'd1)?en_end_r 136 | :(FUNCTION[1:0]==2'd2 || FUNCTION[1:0]==2'd3)?en_end_t:1'b0):1'b0; 137 | 138 | assign result3=(en_end2==1'b1)?((FUNCTION[3:2]==2'd1)?result_r 139 | :(FUNCTION[3:2]==2'd2 ||FUNCTION[3:2]==2'd3)?result_t:{(FEATURE_WIDE+5'd16){1'b0}}) 140 | :{(FEATURE_WIDE+5'd16){1'b0}}; 141 | 142 | assign en_end3=(en_end2==1'b1)?((FUNCTION[3:2]==2'd1)?en_end_r 143 | :(FUNCTION[3:2]==2'd2 || FUNCTION[3:2]==2'd3)?en_end_t:1'b0):1'b0; 144 | 145 | assign result5=(en_end4==1'b1)?((FUNCTION[5:4]==2'd1)?result_r 146 | :(FUNCTION[5:4]==2'd2 || FUNCTION[5:4]==2'd3)?result_t:{(FEATURE_WIDE+5'd16){1'b0}}) 147 | :{(FEATURE_WIDE+5'd16){1'b0}}; 148 | 149 | assign en_end5=(en_end4==1'b1)?((FUNCTION[5:4]==2'd1)?en_end_r 150 | :(FUNCTION[5:4]==2'd2 || FUNCTION[5:4]==2'd3)?en_end_t:1'b0):1'b0; 151 | 152 | assign result7=(en_end6==1'b1)?((FUNCTION[7:6]==2'd1)?result_r 153 | :(FUNCTION[7:6]==2'd2 || FUNCTION[7:6]==2'd3)?result_t:{(FEATURE_WIDE+5'd16){1'b0}}) 154 | :{(FEATURE_WIDE+5'd16){1'b0}}; 155 | 156 | assign en_end7=(en_end6==1'b1)?((FUNCTION[7:6]==2'd1)?en_end_r 157 | :(FUNCTION[7:6]==2'd2 || FUNCTION[7:6]==2'd3)?en_end_t:1'b0):1'b0; 158 | 159 | assign lab=(en_end8==1'b1)?(FUNCTION[9:8]==2'd1)?result_r:(FUNCTION[9:8]==2'd2 || FUNCTION[9:8]==2'd3)?result_t:{(FEATURE_WIDE+5'd16){1'b0}}:{(FEATURE_WIDE+5'd16){1'b0}}; 160 | 161 | assign out_end=(FUNCTION[9:8]==2'd1)?en_end_r:(FUNCTION[9:8]==2'd2 || FUNCTION[9:8]==2'd3)?en_end_t:1'b0; 162 | 163 | 164 | always @(posedge clk or negedge rst_n)begin 165 | if (!rst_n)begin 166 | mac_en <=1'd0; 167 | in_feature <={(FEATURE_WIDE+5'd16){1'b0}}; 168 | n_num <=5'd0; 169 | f_num <=5'd0; 170 | test<=4'd0; 171 | end 172 | else if(en_end8==1'b1 )begin 173 | test<=4'd6; 174 | mac_en <=1'b1 ; 175 | in_feature <=out_result ; 176 | f_num <=f_num0 ; 177 | n_num <=CLASS_NUM ; 178 | end 179 | else if (out_en0==1'b1 )begin 180 | mac_en <=out_en ; 181 | in_feature <=out_result ; 182 | f_num <=f_num0 ; 183 | n_num <=CLASS_NUM ; 184 | test<=4'd5; 185 | end 186 | else if (en_end4==1'b1 && LAYER_NUM>=4)begin 187 | mac_en <=en_end5; 188 | in_feature <=result5; 189 | f_num <=NEU_NUM[11:8] ; 190 | n_num <=NEU_NUM[15:12] ; 191 | test<=4'd4; 192 | end 193 | else if (en_end2==1'b1 && LAYER_NUM>=3)begin 194 | mac_en <=en_end3; 195 | in_feature <=result3; 196 | f_num <=NEU_NUM[7:4] ; 197 | n_num <=NEU_NUM[11:8]; 198 | test<=4'd3; 199 | end 200 | else if (en_end0==1'b1 && LAYER_NUM>=2)begin 201 | mac_en <=en_end1; 202 | in_feature <=result1; 203 | f_num <=NEU_NUM[3:0]; 204 | n_num <=NEU_NUM[7:4]; 205 | test<=4'd2; 206 | end 207 | else if (en==1'b1 && LAYER_NUM>=1)begin 208 | mac_en <=en; 209 | in_feature <=feature; 210 | f_num <=FEATURE_NUM ; 211 | n_num <=NEU_NUM[3:0]; 212 | test<=4'd1; 213 | end 214 | else begin 215 | mac_en <=1'd0; 216 | in_feature <={(FEATURE_WIDE+5'd16){1'b0}}; 217 | n_num <=5'd0; 218 | f_num <=5'd0; 219 | test<=4'd0; 220 | end 221 | 222 | end 223 | 224 | always@(posedge clk )begin 225 | 226 | test_r<=test; 227 | 228 | end 229 | 230 | 231 | always@(*)begin 232 | if(!rst_n)begin 233 | en_flag =1'b0; 234 | end 235 | else begin 236 | case(test_r) 237 | 4'd1: en_flag=en_end0; 238 | 4'd2: en_flag=en_end2; 239 | 4'd3: en_flag=en_end4; 240 | 4'd4: en_flag=en_end6; 241 | 4'd5: en_flag=en_end8; 242 | 4'd6: en_flag=1'b0; 243 | default : en_flag=1'b0; 244 | endcase 245 | end 246 | 247 | 248 | 249 | 250 | end 251 | 252 | 253 | 254 | 255 | always @(posedge clk or negedge rst_n)begin 256 | if (!rst_n)begin 257 | choice <= 1'b0; 258 | en_end_fr <= 1'b0; 259 | result_fr <= {(FEATURE_WIDE+5'd16){1'b0}}; 260 | en_end_ft <= 1'b0; 261 | result_ft <= {(FEATURE_WIDE+5'd16){1'b0}}; 262 | 263 | end 264 | else if (en_end8==1'b1)begin 265 | 266 | case (FUNCTION[9:8]) 267 | 2'd1:begin 268 | choice <= 1'b0; 269 | en_end_fr <= en_end8; 270 | result_fr <= result8; 271 | en_end_ft <= 1'b0; 272 | result_ft <= {(FEATURE_WIDE+5'd16){1'b0}}; 273 | end 274 | 2'd2:begin 275 | choice <= 1'b0; 276 | en_end_fr <= 1'b0; 277 | result_fr <= {(FEATURE_WIDE+5'd16){1'b0}}; 278 | en_end_ft <= en_end8; 279 | result_ft <= result8; 280 | 281 | end 282 | 2'd3:begin 283 | choice <= 1'b1; 284 | en_end_fr <= 1'b0; 285 | result_fr <= {(FEATURE_WIDE+5'd16){1'b0}}; 286 | en_end_ft <= en_end8; 287 | result_ft <= result8; 288 | end 289 | endcase 290 | end 291 | else if (en_end6==1'b1)begin 292 | 293 | case (FUNCTION[7:6]) 294 | 2'd1:begin 295 | choice <= 1'b0; 296 | en_end_fr <= en_end6; 297 | result_fr <= result6; 298 | en_end_ft <= 1'b0; 299 | result_ft <= {(FEATURE_WIDE+5'd16){1'b0}}; 300 | end 301 | 2'd2:begin 302 | choice <= 1'b0; 303 | en_end_fr <= 1'b0; 304 | result_fr <= {(FEATURE_WIDE+5'd16){1'b0}}; 305 | en_end_ft <= en_end6; 306 | result_ft <= result6; 307 | end 308 | 2'd3:begin 309 | choice <= 1'b1; 310 | en_end_fr <= 1'b0; 311 | result_fr <= {(FEATURE_WIDE+5'd16){1'b0}}; 312 | en_end_ft <= en_end6; 313 | result_ft <= result6; 314 | end 315 | endcase 316 | end 317 | else if (en_end4==1'b1)begin 318 | case (FUNCTION[5:4]) 319 | 2'd1:begin 320 | choice <= 1'b0; 321 | en_end_fr <= en_end4; 322 | result_fr <= result4; 323 | en_end_ft <= 1'b0; 324 | result_ft <= {(FEATURE_WIDE+5'd16){1'b0}}; 325 | end 326 | 2'd2:begin 327 | choice <= 1'b0; 328 | en_end_fr <= 1'b0; 329 | result_fr <= {(FEATURE_WIDE+5'd16){1'b0}}; 330 | en_end_ft <= en_end4; 331 | result_ft <= result4; 332 | 333 | end 334 | 2'd3:begin 335 | choice <= 1'b1; 336 | en_end_fr <= 1'b0; 337 | result_fr <= {(FEATURE_WIDE+5'd16){1'b0}}; 338 | en_end_ft <= en_end4; 339 | result_ft <= result4; 340 | end 341 | endcase 342 | end 343 | else if (en_end2==1'b1)begin 344 | 345 | case (FUNCTION[3:2]) 346 | 2'd1:begin 347 | choice <= 1'b0; 348 | en_end_fr <= en_end2; 349 | result_fr <= result2; 350 | en_end_ft <= 1'b0; 351 | result_ft <= {(FEATURE_WIDE+5'd16){1'b0}}; 352 | end 353 | 2'd2:begin 354 | choice <= 1'b0; 355 | en_end_fr <= 1'b0; 356 | result_fr <= {(FEATURE_WIDE+5'd16){1'b0}}; 357 | en_end_ft <= en_end2; 358 | result_ft <= result2; 359 | end 360 | 2'd3:begin 361 | choice <= 1'b1; 362 | en_end_fr <= 1'b0; 363 | result_fr <= {(FEATURE_WIDE+5'd16){1'b0}}; 364 | en_end_ft <= en_end2; 365 | result_ft <= result2; 366 | end 367 | endcase 368 | end 369 | else if (en_end0==1'b1)begin 370 | 371 | case (FUNCTION[1:0]) 372 | 2'd1:begin 373 | choice <= 1'b0; 374 | en_end_fr <= en_end0; 375 | result_fr <= result0; 376 | en_end_ft <= 1'b0; 377 | result_ft <= {(FEATURE_WIDE+5'd16){1'b0}}; 378 | end 379 | 2'd2:begin 380 | choice <= 1'b0; 381 | en_end_fr <= 1'b0; 382 | result_fr <= {(FEATURE_WIDE+5'd16){1'b0}}; 383 | en_end_ft <= en_end0; 384 | result_ft <= result0; 385 | end 386 | 2'd3:begin 387 | choice <= 1'b1; 388 | en_end_fr <= 1'b0; 389 | result_fr <= {(FEATURE_WIDE+5'd16){1'b0}}; 390 | en_end_ft <= en_end0; 391 | result_ft <= result0; 392 | 393 | end 394 | endcase 395 | end 396 | else begin 397 | choice <= 1'b0; 398 | en_end_fr <= 1'b0; 399 | result_fr <= {(FEATURE_WIDE+5'd16){1'b0}}; 400 | en_end_ft <= 1'b0; 401 | result_ft <= {(FEATURE_WIDE+5'd16){1'b0}}; 402 | end 403 | 404 | end 405 | 406 | 407 | 408 | 409 | always@(posedge clk or negedge rst_n)begin 410 | if (!rst_n)begin 411 | address<=10'd0; 412 | end 413 | else if (rden==1'b1)begin 414 | address<=address+1'b1; 415 | end 416 | else begin 417 | address<=address; 418 | 419 | end 420 | 421 | end 422 | 423 | 424 | always@(posedge clk or negedge rst_n)begin 425 | if (!rst_n)begin 426 | flag_end<=1'b0; 427 | end 428 | else if (CLASS_NUM>=4'd9 && mac_en==1'b1 && test>=3'd5)begin 429 | flag_end<=1'b1; 430 | end 431 | else begin 432 | flag_end<=1'b0; 433 | end 434 | 435 | end 436 | 437 | 438 | 439 | 440 | /* data data( 441 | .address(address ), 442 | .clock (clk ), 443 | .rden (rden ), 444 | 445 | .q (w ) 446 | ); 447 | 448 | */ 449 | 450 | 451 | rom data( 452 | .addr (address ), 453 | 454 | .data (w ) 455 | ); 456 | 457 | 458 | 459 | 460 | mac 461 | #( 462 | .FEATURE_WIDE (FEATURE_WIDE ), 463 | .CLASS_NUM (CLASS_NUM ) 464 | ) 465 | u_max( 466 | 467 | .clk (clk ), 468 | .rst_n (rst_n ), 469 | .en (mac_en ), 470 | .feature (in_feature ), 471 | .w (w ), 472 | .n_num (n_num ), 473 | .f_num (f_num ), 474 | .flag_end (flag_end ), 475 | 476 | .flag_begin(flag_begin ), 477 | .result (result ), 478 | .en_end (en_end ), 479 | .en_addr (rden ) 480 | ); 481 | 482 | 483 | relu 484 | #( 485 | .FEATURE_WIDE (FEATURE_WIDE ) 486 | ) 487 | u_relu( 488 | 489 | 490 | .clk (clk ), 491 | .rst_n (rst_n ), 492 | .en (en_end_fr ), 493 | .in_data (result_fr ), 494 | .mac_en (en_flag ), 495 | 496 | .out_data (result_r ), 497 | .end_en (en_end_r ) 498 | 499 | ); 500 | 501 | 502 | tanh 503 | #( 504 | .FEATURE_WIDE (FEATURE_WIDE ) 505 | ) 506 | u_tanh( 507 | 508 | .clk (clk ), 509 | .rst_n (rst_n ), 510 | .en (en_end_ft ), 511 | .in_data (result_ft ), 512 | .mac_en (en_flag ), 513 | .choice (choice ), 514 | 515 | .out_data (result_t ), 516 | .end_en (en_end_t ) 517 | 518 | ); 519 | 520 | 521 | 522 | 523 | layer 524 | #( 525 | .FEATURE_WIDE (FEATURE_WIDE ), 526 | .NEU_NUM (NEU_NUM[3:0] ) 527 | ) 528 | u_layer0( 529 | 530 | .clk (clk ), 531 | .rst_n (rst_n && LAYER_NUM>=1 ), 532 | .feature (result ), 533 | .en (en && en_end ), 534 | 535 | 536 | .result (result0 ), 537 | 538 | .en_end (en_end0 ) 539 | ); 540 | 541 | 542 | 543 | layer 544 | #( 545 | .FEATURE_WIDE (FEATURE_WIDE ), 546 | .NEU_NUM (NEU_NUM[7:4] ) 547 | ) 548 | u_layer1( 549 | 550 | .clk (clk ), 551 | .rst_n (rst_n && LAYER_NUM>=2 ), 552 | .feature (result ), 553 | .en (en_end1 && en_end ), 554 | 555 | 556 | .result (result2 ), 557 | .en_end (en_end2 ) 558 | ); 559 | 560 | 561 | 562 | 563 | layer 564 | #( 565 | .FEATURE_WIDE (FEATURE_WIDE ), 566 | .NEU_NUM (NEU_NUM[11:8] ) 567 | ) 568 | u_layer2( 569 | 570 | .clk (clk ), 571 | .rst_n (rst_n && LAYER_NUM>=3 ), 572 | .feature (result ), 573 | .en (en_end3 && en_end ), 574 | 575 | 576 | .result (result4 ), 577 | .en_end (en_end4 ) 578 | ); 579 | 580 | 581 | 582 | layer 583 | #( 584 | .FEATURE_WIDE (FEATURE_WIDE ), 585 | .NEU_NUM (NEU_NUM[15:12] ) 586 | ) 587 | u_layer3( 588 | 589 | .clk (clk ), 590 | .rst_n (rst_n && LAYER_NUM>=4 ), 591 | .feature (result ), 592 | .en (en_end5 && en_end ), 593 | 594 | 595 | .result (result6 ), 596 | .en_end (en_end6 ) 597 | ); 598 | 599 | 600 | 601 | out_layer 602 | #( 603 | .FEATURE_WIDE (FEATURE_WIDE ), 604 | .NEU_NUM (CLASS_NUM ) 605 | ) 606 | out_lay( 607 | 608 | .clk (clk ), 609 | .rst_n (rst_n ), 610 | .feature (result ), 611 | .en (en_end && out_en ), 612 | .flag_begin(flag_begin ), 613 | 614 | .result (result8 ), 615 | .en_end (en_end8 ) 616 | ); 617 | 618 | 619 | 620 | 621 | endmodule -------------------------------------------------------------------------------- /k-NN/class_result_con.v: -------------------------------------------------------------------------------- 1 | module class_result_con 2 | #( 3 | parameter NUM =3 , 4 | parameter CLASS_NUM =6 , 5 | parameter FEATURE_WIDE =4 , 6 | parameter K =7 , 7 | parameter LEN =12 8 | )( 9 | input clk , 10 | input rst_n , 11 | input flag , 12 | input [K*(2*LEN+FEATURE_WIDE)-1'b1:0] ocandidate , 13 | input [K*(2*LEN+FEATURE_WIDE)-1'b1:0] ecandidate , 14 | input [K*NUM-1'b1:0] lab_e , 15 | input [K*NUM-1'b1:0] lab_o , 16 | 17 | output [NUM-1'b1:0] lab 18 | 19 | 20 | ); 21 | 22 | 23 | 24 | wire [NUM-1'b1:0] lab0 ; 25 | 26 | wire [NUM-1'b1:0] lab1 ; 27 | 28 | wire [NUM-1'b1:0] lab2 ; 29 | 30 | wire [NUM-1'b1:0] lab3 ; 31 | 32 | wire [NUM-1'b1:0] lab4 ; 33 | 34 | wire [NUM-1'b1:0] lab5 ; 35 | 36 | wire [NUM-1'b1:0] lab6 ; 37 | 38 | wire [NUM-1'b1:0] lab7 ; 39 | 40 | wire [NUM-1'b1:0] lab8 ; 41 | 42 | wire [NUM-1'b1:0] lab9 ; 43 | 44 | wire [NUM-1'b1:0] lab10 ; 45 | 46 | wire [NUM-1'b1:0] lab11 ; 47 | 48 | wire [NUM-1'b1:0] lab12 ; 49 | 50 | wire [NUM-1'b1:0] lab13 ; 51 | 52 | wire [NUM-1'b1:0] lab14 ; 53 | 54 | wire [NUM-1'b1:0] lab15 ; 55 | 56 | reg [4:0] cnt ; 57 | 58 | reg [3:0] cnt_r ; 59 | 60 | reg [4:0] cnt_0 ; 61 | 62 | reg [4:0] cnt_1 ; 63 | 64 | reg [4:0] cnt_2 ; 65 | 66 | reg [4:0] cnt_3 ; 67 | 68 | reg [4:0] cnt_4 ; 69 | 70 | reg [4:0] cnt_5 ; 71 | 72 | reg [4:0] cnt_6 ; 73 | 74 | reg [4:0] cnt_7 ; 75 | 76 | reg [4:0] cnt_8 ; 77 | 78 | reg [4:0] cnt_9 ; 79 | 80 | reg [4:0] cnt_10 ; 81 | 82 | reg [4:0] cnt_11 ; 83 | 84 | reg [4:0] cnt_12 ; 85 | 86 | reg [4:0] cnt_13 ; 87 | 88 | reg [4:0] cnt_14 ; 89 | 90 | reg [4:0] cnt_15 ; 91 | 92 | wire flag_0 ; 93 | 94 | wire flag_1 ; 95 | 96 | wire flag_2 ; 97 | 98 | wire flag_3 ; 99 | 100 | wire flag_4 ; 101 | 102 | wire flag_5 ; 103 | 104 | wire flag_6 ; 105 | 106 | wire flag_7 ; 107 | 108 | wire flag_8 ; 109 | 110 | wire flag_9 ; 111 | 112 | wire flag_10 ; 113 | 114 | wire flag_11 ; 115 | 116 | wire flag_12 ; 117 | 118 | wire flag_13 ; 119 | 120 | wire flag_14 ; 121 | 122 | wire flag_15 ; 123 | 124 | reg flag_out ; 125 | 126 | reg [4:0] result_r ; 127 | 128 | reg [NUM-1:0] lab_r ; 129 | 130 | wire en ; 131 | 132 | 133 | 134 | 135 | 136 | 137 | always@(posedge clk or negedge rst_n)begin 138 | if(!rst_n)begin 139 | cnt<=5'd0; 140 | end 141 | else if (cnt==K)begin 142 | cnt<=K; 143 | 144 | end 145 | else if (en==1'b1)begin 146 | cnt<=cnt+1'b1; 147 | end 148 | end 149 | 150 | 151 | assign flag_0 =(CLASS_NUM>=1'b1 && en==1'b1 && cnt<=K-1'b1)? (lab0 ==1'b1 && cnt==5'd0 || lab1 ==1'b1 && cnt==5'd1 || lab2 ==1'b1 && cnt==5'd2 152 | || lab3 ==1'b1 && cnt==5'd3 || lab4 ==1'b1 && cnt==5'd4 || lab5 ==1'b1 && cnt==5'd5 || lab6 ==1'b1 && cnt==5'd6 || lab7 ==1'b1 && cnt==5'd7 153 | || lab8 ==1'b1 && cnt==5'd8 || lab9 ==1'b1 && cnt==5'd9 || lab10==1'b1 && cnt==5'd10|| lab11==1'b1 && cnt==5'd11|| lab12==1'b1 && cnt==5'd12 154 | || lab13==1'b1 && cnt==5'd13|| lab14==1'b1 && cnt==5'd14|| lab15==1'b1 && cnt==5'd15)?1'b1:1'b0:1'b0; 155 | 156 | assign flag_1 =(CLASS_NUM>=2'd2 && en==1'b1 && cnt<=K-1'b1)? (lab0 ==2'd2 && cnt==5'd0 || lab1 ==2'd2 && cnt==5'd1 || lab2 ==2'd2 && cnt==5'd2 157 | || lab3 ==2'd2 && cnt==5'd3 || lab4 ==2'd2 && cnt==5'd4 || lab5 ==2'd2 && cnt==5'd5 || lab6 ==2'd2 && cnt==5'd6 || lab7 ==2'd2 && cnt==5'd7 158 | || lab8 ==2'd2 && cnt==5'd8 || lab9 ==2'd2 && cnt==5'd9 || lab10==2'd2 && cnt==5'd10|| lab11==2'd2 && cnt==5'd11|| lab12==2'd2 && cnt==5'd12 159 | || lab13==2'd2 && cnt==5'd13|| lab14==2'd2 && cnt==5'd14|| lab15==2'd2 && cnt==5'd15)?1'b1:1'b0:1'b0; 160 | 161 | assign flag_2 =(CLASS_NUM>=2'd3 && en==1'b1 && cnt<=K-1'b1)? (lab0 ==2'd3 && cnt==5'd0 || lab1 ==2'd3 && cnt==5'd1 || lab2 ==2'd3 && cnt==5'd2 162 | || lab3 ==2'd3 && cnt==5'd3 || lab4 ==2'd3 && cnt==5'd4 || lab5 ==2'd3 && cnt==5'd5 || lab6 ==2'd3 && cnt==5'd6 || lab7 ==2'd3 && cnt==5'd7 163 | || lab8 ==2'd3 && cnt==5'd8 || lab9 ==2'd3 && cnt==5'd9 || lab10==2'd3 && cnt==5'd10|| lab11==2'd3 && cnt==5'd11|| lab12==2'd3 && cnt==5'd12 164 | || lab13==2'd3 && cnt==5'd13|| lab14==2'd3 && cnt==5'd14|| lab15==2'd3 && cnt==5'd15)?1'b1:1'b0:1'b0; 165 | 166 | assign flag_3 =(CLASS_NUM>=3'd4 && en==1'b1 && cnt<=K-1'b1)? (lab0 ==3'd4 && cnt==5'd0 || lab1 ==3'd4 && cnt==5'd1 || lab2 ==3'd4 && cnt==5'd2 167 | || lab3 ==3'd4 && cnt==5'd3 || lab4 ==3'd4 && cnt==5'd4 || lab5 ==3'd4 && cnt==5'd5 || lab6 ==3'd4 && cnt==5'd6 || lab7 ==3'd4 && cnt==5'd7 168 | || lab8 ==3'd4 && cnt==5'd8 || lab9 ==3'd4 && cnt==5'd9 || lab10==3'd4 && cnt==5'd10|| lab11==3'd4 && cnt==5'd11|| lab12==3'd4 && cnt==5'd12 169 | || lab13==3'd4 && cnt==5'd13|| lab14==3'd4 && cnt==5'd14|| lab15==3'd4 && cnt==5'd15)?1'b1:1'b0:1'b0; 170 | 171 | assign flag_4 =(CLASS_NUM>=3'd5 && en==1'b1 && cnt<=K-1'b1)? (lab0 ==3'd5 && cnt==5'd0 || lab1 ==3'd5 && cnt==5'd1 || lab2 ==3'd5 && cnt==5'd2 172 | || lab3 ==3'd5 && cnt==5'd3 || lab4 ==3'd5 && cnt==5'd4 || lab5 ==3'd5 && cnt==5'd5 || lab6 ==3'd5 && cnt==5'd6 || lab7 ==3'd5 && cnt==5'd7 173 | || lab8 ==3'd5 && cnt==5'd8 || lab9 ==3'd5 && cnt==5'd9 || lab10==3'd5 && cnt==5'd10|| lab11==3'd5 && cnt==5'd11|| lab12==3'd5 && cnt==5'd12 174 | || lab13==3'd5 && cnt==5'd13|| lab14==3'd5 && cnt==5'd14|| lab15==3'd5 && cnt==5'd15)?1'b1:1'b0:1'b0; 175 | 176 | assign flag_5 =(CLASS_NUM>=3'd6 && en==1'b1 && cnt<=K-1'b1)? (lab0 ==3'd6 && cnt==5'd0 || lab1 ==3'd6 && cnt==5'd1 || lab2 ==3'd6 && cnt==5'd2 177 | || lab3 ==3'd6 && cnt==5'd3 || lab4 ==3'd6 && cnt==5'd4 || lab5 ==3'd6 && cnt==5'd5 || lab6 ==3'd6 && cnt==5'd6 || lab7 ==3'd6 && cnt==5'd7 178 | || lab8 ==3'd6 && cnt==5'd8 || lab9 ==3'd6 && cnt==5'd9 || lab10==3'd6 && cnt==5'd10|| lab11==3'd6 && cnt==5'd11|| lab12==3'd6 && cnt==5'd12 179 | || lab13==3'd6 && cnt==5'd13|| lab14==3'd6 && cnt==5'd14|| lab15==3'd6 && cnt==5'd15)?1'b1:1'b0:1'b0; 180 | 181 | assign flag_6 =(CLASS_NUM>=3'd7 && en==1'b1 && cnt<=K-1'b1)? (lab0 ==3'd7 && cnt==5'd0 || lab1 ==3'd7 && cnt==5'd1 || lab2 ==3'd7 && cnt==5'd2 182 | || lab3 ==3'd7 && cnt==5'd3 || lab4 ==3'd7 && cnt==5'd4 || lab5 ==3'd7 && cnt==5'd5 || lab6 ==3'd7 && cnt==5'd6 || lab7 ==3'd7 && cnt==5'd7 183 | || lab8 ==3'd7 && cnt==5'd8 || lab9 ==3'd7 && cnt==5'd9 || lab10==3'd7 && cnt==5'd10|| lab11==3'd7 && cnt==5'd11|| lab12==3'd7 && cnt==5'd12 184 | || lab13==3'd7 && cnt==5'd13|| lab14==3'd7 && cnt==5'd14|| lab15==3'd7 && cnt==5'd15)?1'b1:1'b0:1'b0; 185 | 186 | assign flag_7 =(CLASS_NUM>=4'd8 && en==1'b1 && cnt<=K-1'b1)? (lab0 ==4'd8 && cnt==5'd0 || lab1 ==4'd8 && cnt==5'd1 || lab2 ==4'd8 && cnt==5'd2 187 | || lab3 ==4'd8 && cnt==5'd3 || lab4 ==4'd8 && cnt==5'd4 || lab5 ==4'd8 && cnt==5'd5 || lab6 ==4'd8 && cnt==5'd6 || lab7 ==4'd8 && cnt==5'd7 188 | || lab8 ==4'd8 && cnt==5'd8 || lab9 ==4'd8 && cnt==5'd9 || lab10==4'd8 && cnt==5'd10|| lab11==4'd8 && cnt==5'd11|| lab12==4'd8 && cnt==5'd12 189 | || lab13==4'd8 && cnt==5'd13|| lab14==4'd8 && cnt==5'd14|| lab15==4'd8 && cnt==5'd15)?1'b1:1'b0:1'b0; 190 | 191 | assign flag_8 =(CLASS_NUM>=4'd9 && en==1'b1 && cnt<=K-1'b1)? (lab0 ==4'd9 && cnt==5'd0 || lab1 ==4'd9 && cnt==5'd1 || lab2 ==4'd9 && cnt==5'd2 192 | || lab3 ==4'd9 && cnt==5'd3 || lab4 ==4'd9 && cnt==5'd4 || lab5 ==4'd9 && cnt==5'd5 || lab6 ==4'd9 && cnt==5'd6 || lab7 ==4'd9 && cnt==5'd7 193 | || lab8 ==4'd9 && cnt==5'd8 || lab9 ==4'd9 && cnt==5'd9 || lab10==4'd9 && cnt==5'd10|| lab11==4'd9 && cnt==5'd11|| lab12==4'd9 && cnt==5'd12 194 | || lab13==4'd9 && cnt==5'd13|| lab14==4'd9 && cnt==5'd14|| lab15==4'd9 && cnt==5'd15)?1'b1:1'b0:1'b0; 195 | 196 | assign flag_9 =(CLASS_NUM>=4'd10&& en==1'b1 && cnt<=K-1'b1)? (lab0 ==4'd10 && cnt==5'd0 || lab1 ==4'd10 && cnt==5'd1 || lab2 ==4'd10 && cnt==5'd2 197 | || lab3 ==4'd10 && cnt==5'd3 || lab4 ==4'd10 && cnt==5'd4 || lab5 ==4'd10 && cnt==5'd5 || lab6 ==4'd10 && cnt==5'd6 || lab7 ==4'd10 && cnt==5'd7 198 | || lab8 ==4'd10 && cnt==5'd8 || lab9 ==4'd10 && cnt==5'd9 || lab10==4'd10 && cnt==5'd10|| lab11==4'd10 && cnt==5'd11|| lab12==4'd10 && cnt==5'd12 199 | || lab13==4'd10 && cnt==5'd13|| lab14==4'd10 && cnt==5'd14|| lab15==4'd10 && cnt==5'd15)?1'b1:1'b0:1'b0; 200 | 201 | assign flag_10=(CLASS_NUM>=4'd11&& en==1'b1 && cnt<=K-1'b1)? (lab0 ==4'd11 && cnt==5'd0 || lab1 ==4'd11 && cnt==5'd1 || lab2 ==4'd11 && cnt==5'd2 202 | || lab3 ==4'd11 && cnt==5'd3 || lab4 ==4'd11 && cnt==5'd4 || lab5 ==4'd11 && cnt==5'd5 || lab6 ==4'd11 && cnt==5'd6 || lab7 ==4'd11 && cnt==5'd7 203 | || lab8 ==4'd11 && cnt==5'd8 || lab9 ==4'd11 && cnt==5'd9 || lab10==4'd11 && cnt==5'd10|| lab11==4'd11 && cnt==5'd11|| lab12==4'd11 && cnt==5'd12 204 | || lab13==4'd11 && cnt==5'd13|| lab14==4'd11 && cnt==5'd14|| lab15==4'd11 && cnt==5'd15)?1'b1:1'b0:1'b0; 205 | 206 | assign flag_11=(CLASS_NUM>=4'd12&& en==1'b1 && cnt<=K-1'b1)? (lab0 ==4'd12 && cnt==5'd0 || lab1 ==4'd12 && cnt==5'd1 || lab2 ==4'd12 && cnt==5'd2 207 | || lab3 ==4'd12 && cnt==5'd3 || lab4 ==4'd12 && cnt==5'd4 || lab5 ==4'd12 && cnt==5'd5 || lab6 ==4'd12 && cnt==5'd6 || lab7 ==4'd12 && cnt==5'd7 208 | || lab8 ==4'd12 && cnt==5'd8 || lab9 ==4'd12 && cnt==5'd9 || lab10==4'd12 && cnt==5'd10|| lab11==4'd12 && cnt==5'd11|| lab12==4'd12 && cnt==5'd12 209 | || lab13==4'd12 && cnt==5'd13|| lab14==4'd12 && cnt==5'd14|| lab15==4'd12 && cnt==5'd15)?1'b1:1'b0:1'b0; 210 | 211 | assign flag_12=(CLASS_NUM>=4'd13&& en==1'b1 && cnt<=K-1'b1)? (lab0 ==4'd13 && cnt==5'd0 || lab1 ==4'd13 && cnt==5'd1 || lab2 ==4'd13 && cnt==5'd2 212 | || lab3 ==4'd13 && cnt==5'd3 || lab4 ==4'd13 && cnt==5'd4 || lab5 ==4'd13 && cnt==5'd5 || lab6 ==4'd13 && cnt==5'd6 || lab7 ==4'd13 && cnt==5'd7 213 | || lab8 ==4'd13 && cnt==5'd8 || lab9 ==4'd13 && cnt==5'd9 || lab10==4'd13 && cnt==5'd10|| lab11==4'd13 && cnt==5'd11|| lab12==4'd13 && cnt==5'd12 214 | || lab13==4'd13 && cnt==5'd13|| lab14==4'd13 && cnt==5'd14|| lab15==4'd13 && cnt==5'd15)?1'b1:1'b0:1'b0; 215 | 216 | assign flag_13=(CLASS_NUM>=4'd14&& en==1'b1 && cnt<=K-1'b1)? (lab0 ==4'd14 && cnt==5'd0 || lab1 ==4'd14 && cnt==5'd1 || lab2 ==4'd14 && cnt==5'd2 217 | || lab3 ==4'd14 && cnt==5'd3 || lab4 ==4'd14 && cnt==5'd4 || lab5 ==4'd14 && cnt==5'd5 || lab6 ==4'd14 && cnt==5'd6 || lab7 ==4'd14 && cnt==5'd7 218 | || lab8 ==4'd14 && cnt==5'd8 || lab9 ==4'd14 && cnt==5'd9 || lab10==4'd14 && cnt==5'd10|| lab11==4'd14 && cnt==5'd11|| lab12==4'd14 && cnt==5'd12 219 | || lab13==4'd14 && cnt==5'd13|| lab14==4'd14 && cnt==5'd14|| lab15==4'd14 && cnt==5'd15)?1'b1:1'b0:1'b0; 220 | 221 | assign flag_14=(CLASS_NUM>=4'd15&& en==1'b1 && cnt<=K-1'b1)? (lab0 ==4'd15 && cnt==5'd0 || lab1 ==4'd15 && cnt==5'd1 || lab2 ==4'd15 && cnt==5'd2 222 | || lab3 ==4'd15 && cnt==5'd3 || lab4 ==4'd15 && cnt==5'd4 || lab5 ==4'd15 && cnt==5'd5 || lab6 ==4'd15 && cnt==5'd6 || lab7 ==4'd15 && cnt==5'd7 223 | || lab8 ==4'd15 && cnt==5'd8 || lab9 ==4'd15 && cnt==5'd9 || lab10==4'd15 && cnt==5'd10|| lab11==4'd15 && cnt==5'd11|| lab12==4'd15 && cnt==5'd12 224 | || lab13==4'd15 && cnt==5'd13|| lab14==4'd15 && cnt==5'd14|| lab15==4'd15 && cnt==5'd15)?1'b1:1'b0:1'b0; 225 | 226 | assign flag_15=(CLASS_NUM>=5'd16&& en==1'b1 && cnt<=K-1'b1)? (lab0 ==5'd16 && cnt==5'd0 || lab1 ==5'd16 && cnt==5'd1 || lab2 ==5'd16 && cnt==5'd2 227 | || lab3 ==5'd16 && cnt==5'd3 || lab4 ==5'd16 && cnt==5'd4 || lab5 ==5'd16 && cnt==5'd5 || lab6 ==5'd16 && cnt==5'd6 || lab7 ==5'd16 && cnt==5'd7 228 | || lab8 ==5'd16 && cnt==5'd8 || lab9 ==5'd16 && cnt==5'd9 || lab10==5'd16 && cnt==5'd10|| lab11==5'd16 && cnt==5'd11|| lab12==5'd16 && cnt==5'd12 229 | || lab13==5'd16 && cnt==5'd13|| lab14==5'd16 && cnt==5'd14|| lab15==5'd16 && cnt==5'd15)?1'b1:1'b0:1'b0; 230 | 231 | 232 | 233 | 234 | 235 | 236 | always@(posedge clk or negedge rst_n)begin 237 | if(!rst_n)begin 238 | cnt_0<=0; 239 | end 240 | else if (flag_0==1'b1)begin 241 | cnt_0<=cnt_0+1'b1; 242 | end 243 | end 244 | 245 | always@(posedge clk or negedge rst_n)begin 246 | if(!rst_n)begin 247 | cnt_1<=0; 248 | end 249 | else if (flag_1==1'b1)begin 250 | cnt_1<=cnt_1+1'b1; 251 | end 252 | end 253 | 254 | always@(posedge clk or negedge rst_n)begin 255 | if(!rst_n)begin 256 | cnt_2<=0; 257 | end 258 | else if (flag_2==1'b1)begin 259 | cnt_2<=cnt_2+1'b1; 260 | end 261 | end 262 | 263 | always@(posedge clk or negedge rst_n)begin 264 | if(!rst_n)begin 265 | cnt_3<=0; 266 | end 267 | else if (flag_3==1'b1)begin 268 | cnt_3<=cnt_3+1'b1; 269 | end 270 | end 271 | 272 | always@(posedge clk or negedge rst_n)begin 273 | if(!rst_n)begin 274 | cnt_4<=0; 275 | end 276 | else if (flag_4==1'b1 )begin 277 | cnt_4<=cnt_4+1'b1; 278 | end 279 | end 280 | 281 | always@(posedge clk or negedge rst_n)begin 282 | if(!rst_n)begin 283 | cnt_5<=0; 284 | end 285 | else if (flag_5==1'b1)begin 286 | cnt_5<=cnt_5+1'b1; 287 | end 288 | end 289 | 290 | always@(posedge clk or negedge rst_n)begin 291 | if(!rst_n)begin 292 | cnt_6<=0; 293 | end 294 | else if (flag_6==1'b1)begin 295 | cnt_6<=cnt_6+1'b1; 296 | end 297 | end 298 | 299 | always@(posedge clk or negedge rst_n)begin 300 | if(!rst_n)begin 301 | cnt_7<=0; 302 | end 303 | else if (flag_7==1'b1)begin 304 | cnt_7<=cnt_7+1'b1; 305 | end 306 | end 307 | 308 | always@(posedge clk or negedge rst_n)begin 309 | if(!rst_n)begin 310 | cnt_8<=0; 311 | end 312 | else if (flag_8==1'b1)begin 313 | cnt_8<=cnt_8+1'b1; 314 | end 315 | end 316 | 317 | always@(posedge clk or negedge rst_n)begin 318 | if(!rst_n)begin 319 | cnt_9<=0; 320 | end 321 | else if (flag_9==1'b1)begin 322 | cnt_9<=cnt_9+1'b1; 323 | end 324 | end 325 | 326 | always@(posedge clk or negedge rst_n)begin 327 | if(!rst_n)begin 328 | cnt_10<=0; 329 | end 330 | else if (flag_10==1'b1)begin 331 | cnt_10<=cnt_10+1'b1; 332 | end 333 | end 334 | 335 | always@(posedge clk or negedge rst_n)begin 336 | if(!rst_n)begin 337 | cnt_11<=0; 338 | end 339 | else if (flag_11==1'b1)begin 340 | cnt_11<=cnt_11+1'b1; 341 | end 342 | end 343 | 344 | always@(posedge clk or negedge rst_n)begin 345 | if(!rst_n)begin 346 | cnt_12<=0; 347 | end 348 | else if (flag_12==1'b1)begin 349 | cnt_12<=cnt_12+1'b1; 350 | end 351 | end 352 | 353 | always@(posedge clk or negedge rst_n)begin 354 | if(!rst_n)begin 355 | cnt_13<=0; 356 | end 357 | else if (flag_13==1'b1)begin 358 | cnt_13<=cnt_13+1'b1; 359 | end 360 | end 361 | 362 | always@(posedge clk or negedge rst_n)begin 363 | if(!rst_n)begin 364 | cnt_14<=0; 365 | end 366 | else if (flag_14==1'b1)begin 367 | cnt_14<=cnt_14+1'b1; 368 | end 369 | end 370 | 371 | always@(posedge clk or negedge rst_n)begin 372 | if(!rst_n)begin 373 | cnt_15<=0; 374 | end 375 | else if (flag_15==1'b1)begin 376 | cnt_15<=cnt_15+1'b1; 377 | end 378 | end 379 | 380 | 381 | always@(posedge clk or negedge rst_n)begin 382 | if(!rst_n)begin 383 | cnt_r<=0; 384 | flag_out<=0; 385 | end 386 | else if (cnt_r==CLASS_NUM-2)begin 387 | cnt_r<=CLASS_NUM-2; 388 | flag_out<=1'b1; 389 | end 390 | else if (cnt==K)begin 391 | cnt_r<=cnt_r+1'b1; 392 | end 393 | end 394 | 395 | always@(posedge clk or negedge rst_n)begin 396 | if(!rst_n)begin 397 | result_r<=0; 398 | lab_r<=0; 399 | end 400 | else if (cnt==K)begin 401 | case(cnt_r) 402 | 4'd0:begin 403 | if(CLASS_NUM>=2 && cnt_0=3 && result_r=4 && result_r=5 && result_r=6 && result_r=7 && result_r=8 && result_r=9 && result_r=10 && result_r=11 && result_r=12 && result_r=13 && result_r=14 && result_r=15 && result_r=16 && result_r=1 ) begin 143 | location = 5'd1; 144 | end 145 | else if(sigma_result=2 ) begin 146 | location = 5'd2; 147 | end 148 | else if(sigma_result=3 ) begin 149 | location = 5'd3; 150 | end 151 | else if(sigma_result=4 ) begin 152 | location = 5'd4; 153 | end 154 | else if(sigma_result=5 ) begin 155 | location = 5'd5; 156 | end 157 | else if(sigma_result=6 ) begin 158 | location = 5'd6; 159 | end 160 | else if(sigma_result=7 ) begin 161 | location = 5'd7; 162 | end 163 | else if(sigma_result=8 ) begin 164 | location = 5'd8; 165 | end 166 | else if(sigma_result=9 ) begin 167 | location = 5'd9; 168 | end 169 | else if(sigma_result=10) begin 170 | location = 5'd10; 171 | end 172 | else if(sigma_result=11) begin 173 | location = 5'd11; 174 | end 175 | else if(sigma_result=12) begin 176 | location = 5'd12; 177 | end 178 | else if(sigma_result=13) begin 179 | location = 5'd13; 180 | end 181 | else if(sigma_result=14) begin 182 | location = 5'd14; 183 | end 184 | else if(sigma_result=15) begin 185 | location = 5'd15; 186 | end 187 | else if(sigma_result=1 ) ?{(2*LEN+FEATURE_WIDE){1'b1}}:{(2*LEN+FEATURE_WIDE){1'b0}}; 204 | candidate1 <=(K>=2 ) ?{(2*LEN+FEATURE_WIDE){1'b1}}:{(2*LEN+FEATURE_WIDE){1'b0}}; 205 | candidate2 <=(K>=3 ) ?{(2*LEN+FEATURE_WIDE){1'b1}}:{(2*LEN+FEATURE_WIDE){1'b0}}; 206 | candidate3 <=(K>=4 ) ?{(2*LEN+FEATURE_WIDE){1'b1}}:{(2*LEN+FEATURE_WIDE){1'b0}}; 207 | candidate4 <=(K>=5 ) ?{(2*LEN+FEATURE_WIDE){1'b1}}:{(2*LEN+FEATURE_WIDE){1'b0}}; 208 | candidate5 <=(K>=6 ) ?{(2*LEN+FEATURE_WIDE){1'b1}}:{(2*LEN+FEATURE_WIDE){1'b0}}; 209 | candidate6 <=(K>=7 ) ?{(2*LEN+FEATURE_WIDE){1'b1}}:{(2*LEN+FEATURE_WIDE){1'b0}}; 210 | candidate7 <=(K>=8 ) ?{(2*LEN+FEATURE_WIDE){1'b1}}:{(2*LEN+FEATURE_WIDE){1'b0}}; 211 | candidate8 <=(K>=9 ) ?{(2*LEN+FEATURE_WIDE){1'b1}}:{(2*LEN+FEATURE_WIDE){1'b0}}; 212 | candidate9 <=(K>=10) ?{(2*LEN+FEATURE_WIDE){1'b1}}:{(2*LEN+FEATURE_WIDE){1'b0}}; 213 | candidate10<=(K>=11) ?{(2*LEN+FEATURE_WIDE){1'b1}}:{(2*LEN+FEATURE_WIDE){1'b0}}; 214 | candidate11<=(K>=12) ?{(2*LEN+FEATURE_WIDE){1'b1}}:{(2*LEN+FEATURE_WIDE){1'b0}}; 215 | candidate12<=(K>=13) ?{(2*LEN+FEATURE_WIDE){1'b1}}:{(2*LEN+FEATURE_WIDE){1'b0}}; 216 | candidate13<=(K>=14) ?{(2*LEN+FEATURE_WIDE){1'b1}}:{(2*LEN+FEATURE_WIDE){1'b0}}; 217 | candidate14<=(K>=15) ?{(2*LEN+FEATURE_WIDE){1'b1}}:{(2*LEN+FEATURE_WIDE){1'b0}}; 218 | candidate15<=(K>=16) ?{(2*LEN+FEATURE_WIDE){1'b1}}:{(2*LEN+FEATURE_WIDE){1'b0}}; 219 | lab0 <={NUM{1'b0}}; 220 | lab1 <={NUM{1'b0}}; 221 | lab2 <={NUM{1'b0}}; 222 | lab3 <={NUM{1'b0}}; 223 | lab4 <={NUM{1'b0}}; 224 | lab5 <={NUM{1'b0}}; 225 | lab6 <={NUM{1'b0}}; 226 | lab7 <={NUM{1'b0}}; 227 | lab8 <={NUM{1'b0}}; 228 | lab9 <={NUM{1'b0}}; 229 | lab10<={NUM{1'b0}}; 230 | lab11<={NUM{1'b0}}; 231 | lab12<={NUM{1'b0}}; 232 | lab13<={NUM{1'b0}}; 233 | lab14<={NUM{1'b0}}; 234 | lab15<={NUM{1'b0}}; 235 | end 236 | else 237 | case (location) 238 | 5'd1:begin 239 | candidate0 <= (K>=1 ) ?sigma_result:{(2*LEN+FEATURE_WIDE){1'b0}}; 240 | candidate1 <= (K>=2 ) ?candidate0 :{(2*LEN+FEATURE_WIDE){1'b0}}; 241 | candidate2 <= (K>=3 ) ?candidate1 :{(2*LEN+FEATURE_WIDE){1'b0}}; 242 | candidate3 <= (K>=4 ) ?candidate2 :{(2*LEN+FEATURE_WIDE){1'b0}}; 243 | candidate4 <= (K>=5 ) ?candidate3 :{(2*LEN+FEATURE_WIDE){1'b0}}; 244 | candidate5 <= (K>=6 ) ?candidate4 :{(2*LEN+FEATURE_WIDE){1'b0}}; 245 | candidate6 <= (K>=7 ) ?candidate5 :{(2*LEN+FEATURE_WIDE){1'b0}}; 246 | candidate7 <= (K>=8 ) ?candidate6 :{(2*LEN+FEATURE_WIDE){1'b0}}; 247 | candidate8 <= (K>=9 ) ?candidate7 :{(2*LEN+FEATURE_WIDE){1'b0}}; 248 | candidate9 <= (K>=10) ?candidate8 :{(2*LEN+FEATURE_WIDE){1'b0}}; 249 | candidate10<= (K>=11) ?candidate9 :{(2*LEN+FEATURE_WIDE){1'b0}}; 250 | candidate11<= (K>=12) ?candidate10 :{(2*LEN+FEATURE_WIDE){1'b0}}; 251 | candidate12<= (K>=13) ?candidate11 :{(2*LEN+FEATURE_WIDE){1'b0}}; 252 | candidate13<= (K>=14) ?candidate12 :{(2*LEN+FEATURE_WIDE){1'b0}}; 253 | candidate14<= (K>=15) ?candidate13 :{(2*LEN+FEATURE_WIDE){1'b0}}; 254 | candidate15<= (K>=16) ?candidate14 :{(2*LEN+FEATURE_WIDE){1'b0}}; 255 | lab0 <=(K>=1 ) ?lab :{NUM{1'b0}}; 256 | lab1 <=(K>=2 ) ?lab0 :{NUM{1'b0}}; 257 | lab2 <=(K>=3 ) ?lab1 :{NUM{1'b0}}; 258 | lab3 <=(K>=4 ) ?lab2 :{NUM{1'b0}}; 259 | lab4 <=(K>=5 ) ?lab3 :{NUM{1'b0}}; 260 | lab5 <=(K>=6 ) ?lab4 :{NUM{1'b0}}; 261 | lab6 <=(K>=7 ) ?lab5 :{NUM{1'b0}}; 262 | lab7 <=(K>=8 ) ?lab6 :{NUM{1'b0}}; 263 | lab8 <=(K>=9 ) ?lab7 :{NUM{1'b0}}; 264 | lab9 <=(K>=10) ?lab8 :{NUM{1'b0}}; 265 | lab10 <=(K>=11) ?lab9 :{NUM{1'b0}}; 266 | lab11 <=(K>=12) ?lab10:{NUM{1'b0}}; 267 | lab12 <=(K>=13) ?lab11:{NUM{1'b0}}; 268 | lab13 <=(K>=14) ?lab12:{NUM{1'b0}}; 269 | lab14 <=(K>=15) ?lab13:{NUM{1'b0}}; 270 | lab15 <=(K>=16) ?lab14:{NUM{1'b0}}; 271 | end 272 | 5'd2:begin 273 | candidate0 <= (K>=1 ) ?candidate0 :{(2*LEN+FEATURE_WIDE){1'b0}}; 274 | candidate1 <= (K>=2 ) ?sigma_result:{(2*LEN+FEATURE_WIDE){1'b0}}; 275 | candidate2 <= (K>=3 ) ?candidate1 :{(2*LEN+FEATURE_WIDE){1'b0}}; 276 | candidate3 <= (K>=4 ) ?candidate2 :{(2*LEN+FEATURE_WIDE){1'b0}}; 277 | candidate4 <= (K>=5 ) ?candidate3 :{(2*LEN+FEATURE_WIDE){1'b0}}; 278 | candidate5 <= (K>=6 ) ?candidate4 :{(2*LEN+FEATURE_WIDE){1'b0}}; 279 | candidate6 <= (K>=7 ) ?candidate5 :{(2*LEN+FEATURE_WIDE){1'b0}}; 280 | candidate7 <= (K>=8 ) ?candidate6 :{(2*LEN+FEATURE_WIDE){1'b0}}; 281 | candidate8 <= (K>=9 ) ?candidate7 :{(2*LEN+FEATURE_WIDE){1'b0}}; 282 | candidate9 <= (K>=10) ?candidate8 :{(2*LEN+FEATURE_WIDE){1'b0}}; 283 | candidate10<= (K>=11) ?candidate9 :{(2*LEN+FEATURE_WIDE){1'b0}}; 284 | candidate11<= (K>=12) ?candidate10 :{(2*LEN+FEATURE_WIDE){1'b0}}; 285 | candidate12<= (K>=13) ?candidate11 :{(2*LEN+FEATURE_WIDE){1'b0}}; 286 | candidate13<= (K>=14) ?candidate12 :{(2*LEN+FEATURE_WIDE){1'b0}}; 287 | candidate14<= (K>=15) ?candidate13 :{(2*LEN+FEATURE_WIDE){1'b0}}; 288 | candidate15<= (K>=16) ?candidate14 :{(2*LEN+FEATURE_WIDE){1'b0}}; 289 | lab0 <= (K>=1 ) ?lab0 :{NUM{1'b0}}; 290 | lab1 <= (K>=2 ) ?lab :{NUM{1'b0}}; 291 | lab2 <= (K>=3 ) ?lab1 :{NUM{1'b0}}; 292 | lab3 <= (K>=4 ) ?lab2 :{NUM{1'b0}}; 293 | lab4 <= (K>=5 ) ?lab3 :{NUM{1'b0}}; 294 | lab5 <= (K>=6 ) ?lab4 :{NUM{1'b0}}; 295 | lab6 <= (K>=7 ) ?lab5 :{NUM{1'b0}}; 296 | lab7 <= (K>=8 ) ?lab6 :{NUM{1'b0}}; 297 | lab8 <= (K>=9 ) ?lab7 :{NUM{1'b0}}; 298 | lab9 <= (K>=10) ?lab8 :{NUM{1'b0}}; 299 | lab10 <= (K>=11) ?lab9 :{NUM{1'b0}}; 300 | lab11 <= (K>=12) ?lab10:{NUM{1'b0}}; 301 | lab12 <= (K>=13) ?lab11:{NUM{1'b0}}; 302 | lab13 <= (K>=14) ?lab12:{NUM{1'b0}}; 303 | lab14 <= (K>=15) ?lab13:{NUM{1'b0}}; 304 | lab15 <= (K>=16) ?lab14:{NUM{1'b0}}; 305 | end 306 | 5'd3:begin 307 | candidate0 <= (K>=1 ) ?candidate0 :{(2*LEN+FEATURE_WIDE){1'b0}}; 308 | candidate1 <= (K>=2 ) ?candidate1 :{(2*LEN+FEATURE_WIDE){1'b0}}; 309 | candidate2 <= (K>=3 ) ?sigma_result:{(2*LEN+FEATURE_WIDE){1'b0}}; 310 | candidate3 <= (K>=4 ) ?candidate2 :{(2*LEN+FEATURE_WIDE){1'b0}}; 311 | candidate4 <= (K>=5 ) ?candidate3 :{(2*LEN+FEATURE_WIDE){1'b0}}; 312 | candidate5 <= (K>=6 ) ?candidate4 :{(2*LEN+FEATURE_WIDE){1'b0}}; 313 | candidate6 <= (K>=7 ) ?candidate5 :{(2*LEN+FEATURE_WIDE){1'b0}}; 314 | candidate7 <= (K>=8 ) ?candidate6 :{(2*LEN+FEATURE_WIDE){1'b0}}; 315 | candidate8 <= (K>=9 ) ?candidate7 :{(2*LEN+FEATURE_WIDE){1'b0}}; 316 | candidate9 <= (K>=10) ?candidate8 :{(2*LEN+FEATURE_WIDE){1'b0}}; 317 | candidate10<= (K>=11) ?candidate9 :{(2*LEN+FEATURE_WIDE){1'b0}}; 318 | candidate11<= (K>=12) ?candidate10 :{(2*LEN+FEATURE_WIDE){1'b0}}; 319 | candidate12<= (K>=13) ?candidate11 :{(2*LEN+FEATURE_WIDE){1'b0}}; 320 | candidate13<= (K>=14) ?candidate12 :{(2*LEN+FEATURE_WIDE){1'b0}}; 321 | candidate14<= (K>=15) ?candidate13 :{(2*LEN+FEATURE_WIDE){1'b0}}; 322 | candidate15<= (K>=16) ?candidate14 :{(2*LEN+FEATURE_WIDE){1'b0}}; 323 | lab0 <= (K>=1 ) ?lab0 :{NUM{1'b0}}; 324 | lab1 <= (K>=2 ) ?lab1 :{NUM{1'b0}}; 325 | lab2 <= (K>=3 ) ?lab :{NUM{1'b0}}; 326 | lab3 <= (K>=4 ) ?lab2 :{NUM{1'b0}}; 327 | lab4 <= (K>=5 ) ?lab3 :{NUM{1'b0}}; 328 | lab5 <= (K>=6 ) ?lab4 :{NUM{1'b0}}; 329 | lab6 <= (K>=7 ) ?lab5 :{NUM{1'b0}}; 330 | lab7 <= (K>=8 ) ?lab6 :{NUM{1'b0}}; 331 | lab8 <= (K>=9 ) ?lab7 :{NUM{1'b0}}; 332 | lab9 <= (K>=10) ?lab8 :{NUM{1'b0}}; 333 | lab10 <= (K>=11) ?lab9 :{NUM{1'b0}}; 334 | lab11 <= (K>=12) ?lab10:{NUM{1'b0}}; 335 | lab12 <= (K>=13) ?lab11:{NUM{1'b0}}; 336 | lab13 <= (K>=14) ?lab12:{NUM{1'b0}}; 337 | lab14 <= (K>=15) ?lab13:{NUM{1'b0}}; 338 | lab15 <= (K>=16) ?lab14:{NUM{1'b0}}; 339 | 340 | end 341 | 5'd4:begin 342 | candidate0 <= (K>=1 ) ?candidate0 :{(2*LEN+FEATURE_WIDE){1'b0}}; 343 | candidate1 <= (K>=2 ) ?candidate1 :{(2*LEN+FEATURE_WIDE){1'b0}}; 344 | candidate2 <= (K>=3 ) ?candidate2 :{(2*LEN+FEATURE_WIDE){1'b0}}; 345 | candidate3 <= (K>=4 ) ?sigma_result:{(2*LEN+FEATURE_WIDE){1'b0}}; 346 | candidate4 <= (K>=5 ) ?candidate3 :{(2*LEN+FEATURE_WIDE){1'b0}}; 347 | candidate5 <= (K>=6 ) ?candidate4 :{(2*LEN+FEATURE_WIDE){1'b0}}; 348 | candidate6 <= (K>=7 ) ?candidate5 :{(2*LEN+FEATURE_WIDE){1'b0}}; 349 | candidate7 <= (K>=8 ) ?candidate6 :{(2*LEN+FEATURE_WIDE){1'b0}}; 350 | candidate8 <= (K>=9 ) ?candidate7 :{(2*LEN+FEATURE_WIDE){1'b0}}; 351 | candidate9 <= (K>=10) ?candidate8 :{(2*LEN+FEATURE_WIDE){1'b0}}; 352 | candidate10<= (K>=11) ?candidate9 :{(2*LEN+FEATURE_WIDE){1'b0}}; 353 | candidate11<= (K>=12) ?candidate10 :{(2*LEN+FEATURE_WIDE){1'b0}}; 354 | candidate12<= (K>=13) ?candidate11 :{(2*LEN+FEATURE_WIDE){1'b0}}; 355 | candidate13<= (K>=14) ?candidate12 :{(2*LEN+FEATURE_WIDE){1'b0}}; 356 | candidate14<= (K>=15) ?candidate13 :{(2*LEN+FEATURE_WIDE){1'b0}}; 357 | candidate15<= (K>=16) ?candidate14 :{(2*LEN+FEATURE_WIDE){1'b0}}; 358 | lab0 <= (K>=1 ) ?lab0 :{NUM{1'b0}}; 359 | lab1 <= (K>=2 ) ?lab1 :{NUM{1'b0}}; 360 | lab2 <= (K>=3 ) ?lab2 :{NUM{1'b0}}; 361 | lab3 <= (K>=4 ) ?lab :{NUM{1'b0}}; 362 | lab4 <= (K>=5 ) ?lab3 :{NUM{1'b0}}; 363 | lab5 <= (K>=6 ) ?lab4 :{NUM{1'b0}}; 364 | lab6 <= (K>=7 ) ?lab5 :{NUM{1'b0}}; 365 | lab7 <= (K>=8 ) ?lab6 :{NUM{1'b0}}; 366 | lab8 <= (K>=9 ) ?lab7 :{NUM{1'b0}}; 367 | lab9 <= (K>=10) ?lab8 :{NUM{1'b0}}; 368 | lab10 <= (K>=11) ?lab9 :{NUM{1'b0}}; 369 | lab11 <= (K>=12) ?lab10:{NUM{1'b0}}; 370 | lab12 <= (K>=13) ?lab11:{NUM{1'b0}}; 371 | lab13 <= (K>=14) ?lab12:{NUM{1'b0}}; 372 | lab14 <= (K>=15) ?lab13:{NUM{1'b0}}; 373 | lab15 <= (K>=16) ?lab14:{NUM{1'b0}}; 374 | end 375 | 5'd5:begin 376 | candidate0 <= (K>=1 ) ?candidate0 :{(2*LEN+FEATURE_WIDE){1'b0}}; 377 | candidate1 <= (K>=2 ) ?candidate1 :{(2*LEN+FEATURE_WIDE){1'b0}}; 378 | candidate2 <= (K>=3 ) ?candidate2 :{(2*LEN+FEATURE_WIDE){1'b0}}; 379 | candidate3 <= (K>=4 ) ?candidate3 :{(2*LEN+FEATURE_WIDE){1'b0}}; 380 | candidate4 <= (K>=5 ) ?sigma_result :{(2*LEN+FEATURE_WIDE){1'b0}}; 381 | candidate5 <= (K>=6 ) ?candidate4 :{(2*LEN+FEATURE_WIDE){1'b0}}; 382 | candidate6 <= (K>=7 ) ?candidate5 :{(2*LEN+FEATURE_WIDE){1'b0}}; 383 | candidate7 <= (K>=8 ) ?candidate6 :{(2*LEN+FEATURE_WIDE){1'b0}}; 384 | candidate8 <= (K>=9 ) ?candidate7 :{(2*LEN+FEATURE_WIDE){1'b0}}; 385 | candidate9 <= (K>=10) ?candidate8 :{(2*LEN+FEATURE_WIDE){1'b0}}; 386 | candidate10<= (K>=11) ?candidate9 :{(2*LEN+FEATURE_WIDE){1'b0}}; 387 | candidate11<= (K>=12) ?candidate10 :{(2*LEN+FEATURE_WIDE){1'b0}}; 388 | candidate12<= (K>=13) ?candidate11 :{(2*LEN+FEATURE_WIDE){1'b0}}; 389 | candidate13<= (K>=14) ?candidate12 :{(2*LEN+FEATURE_WIDE){1'b0}}; 390 | candidate14<= (K>=15) ?candidate13 :{(2*LEN+FEATURE_WIDE){1'b0}}; 391 | candidate15<= (K>=16) ?candidate14 :{(2*LEN+FEATURE_WIDE){1'b0}}; 392 | lab0 <= (K>=1 ) ?lab0 :{NUM{1'b0}}; 393 | lab1 <= (K>=2 ) ?lab1 :{NUM{1'b0}}; 394 | lab2 <= (K>=3 ) ?lab2 :{NUM{1'b0}}; 395 | lab3 <= (K>=4 ) ?lab3 :{NUM{1'b0}}; 396 | lab4 <= (K>=5 ) ?lab :{NUM{1'b0}}; 397 | lab5 <= (K>=6 ) ?lab4 :{NUM{1'b0}}; 398 | lab6 <= (K>=7 ) ?lab5 :{NUM{1'b0}}; 399 | lab7 <= (K>=8 ) ?lab6 :{NUM{1'b0}}; 400 | lab8 <= (K>=9 ) ?lab7 :{NUM{1'b0}}; 401 | lab9 <= (K>=10) ?lab8 :{NUM{1'b0}}; 402 | lab10 <= (K>=11) ?lab9 :{NUM{1'b0}}; 403 | lab11 <= (K>=12) ?lab10:{NUM{1'b0}}; 404 | lab12 <= (K>=13) ?lab11:{NUM{1'b0}}; 405 | lab13 <= (K>=14) ?lab12:{NUM{1'b0}}; 406 | lab14 <= (K>=15) ?lab13:{NUM{1'b0}}; 407 | lab15 <= (K>=16) ?lab14:{NUM{1'b0}}; 408 | 409 | end 410 | 5'd6:begin 411 | candidate0 <=(K>=1 ) ?candidate0 :{(2*LEN+FEATURE_WIDE){1'b0}}; 412 | candidate1 <=(K>=2 ) ?candidate1 :{(2*LEN+FEATURE_WIDE){1'b0}}; 413 | candidate2 <=(K>=3 ) ?candidate2 :{(2*LEN+FEATURE_WIDE){1'b0}}; 414 | candidate3 <=(K>=4 ) ?candidate3 :{(2*LEN+FEATURE_WIDE){1'b0}}; 415 | candidate4 <=(K>=5 ) ?candidate4 :{(2*LEN+FEATURE_WIDE){1'b0}}; 416 | candidate5 <=(K>=6 ) ?sigma_result:{(2*LEN+FEATURE_WIDE){1'b0}}; 417 | candidate6 <=(K>=7 ) ?candidate5 :{(2*LEN+FEATURE_WIDE){1'b0}}; 418 | candidate7 <=(K>=8 ) ?candidate6 :{(2*LEN+FEATURE_WIDE){1'b0}}; 419 | candidate8 <=(K>=9 ) ?candidate7 :{(2*LEN+FEATURE_WIDE){1'b0}}; 420 | candidate9 <=(K>=10) ?candidate8 :{(2*LEN+FEATURE_WIDE){1'b0}}; 421 | candidate10<=(K>=11) ?candidate9 :{(2*LEN+FEATURE_WIDE){1'b0}}; 422 | candidate11<=(K>=12) ?candidate10 :{(2*LEN+FEATURE_WIDE){1'b0}}; 423 | candidate12<=(K>=13) ?candidate11 :{(2*LEN+FEATURE_WIDE){1'b0}}; 424 | candidate13<=(K>=14) ?candidate12 :{(2*LEN+FEATURE_WIDE){1'b0}}; 425 | candidate14<=(K>=15) ?candidate13 :{(2*LEN+FEATURE_WIDE){1'b0}}; 426 | candidate15<=(K>=16) ?candidate14 :{(2*LEN+FEATURE_WIDE){1'b0}}; 427 | lab0 <=(K>=1 ) ?lab0 :{NUM{1'b0}}; 428 | lab1 <=(K>=2 ) ?lab1 :{NUM{1'b0}}; 429 | lab2 <=(K>=3 ) ?lab2 :{NUM{1'b0}}; 430 | lab3 <=(K>=4 ) ?lab3 :{NUM{1'b0}}; 431 | lab4 <=(K>=5 ) ?lab4 :{NUM{1'b0}}; 432 | lab5 <=(K>=6 ) ?lab :{NUM{1'b0}}; 433 | lab6 <=(K>=7 ) ?lab5 :{NUM{1'b0}}; 434 | lab7 <=(K>=8 ) ?lab6 :{NUM{1'b0}}; 435 | lab8 <=(K>=9 ) ?lab7 :{NUM{1'b0}}; 436 | lab9 <=(K>=10) ?lab8 :{NUM{1'b0}}; 437 | lab10 <=(K>=11) ?lab9 :{NUM{1'b0}}; 438 | lab11 <=(K>=12) ?lab10:{NUM{1'b0}}; 439 | lab12 <=(K>=13) ?lab11:{NUM{1'b0}}; 440 | lab13 <=(K>=14) ?lab12:{NUM{1'b0}}; 441 | lab14 <=(K>=15) ?lab13:{NUM{1'b0}}; 442 | lab15 <=(K>=16) ?lab14:{NUM{1'b0}}; 443 | 444 | end 445 | 5'd7:begin 446 | candidate0 <=(K>=1 ) ?candidate0 :{(2*LEN+FEATURE_WIDE){1'b0}}; 447 | candidate1 <=(K>=2 ) ?candidate1 :{(2*LEN+FEATURE_WIDE){1'b0}}; 448 | candidate2 <=(K>=3 ) ?candidate2 :{(2*LEN+FEATURE_WIDE){1'b0}}; 449 | candidate3 <=(K>=4 ) ?candidate3 :{(2*LEN+FEATURE_WIDE){1'b0}}; 450 | candidate4 <=(K>=5 ) ?candidate4 :{(2*LEN+FEATURE_WIDE){1'b0}}; 451 | candidate5 <=(K>=6 ) ?candidate5 :{(2*LEN+FEATURE_WIDE){1'b0}}; 452 | candidate6 <=(K>=7 ) ?sigma_result:{(2*LEN+FEATURE_WIDE){1'b0}}; 453 | candidate7 <=(K>=8 ) ?candidate6 :{(2*LEN+FEATURE_WIDE){1'b0}}; 454 | candidate8 <=(K>=9 ) ?candidate7 :{(2*LEN+FEATURE_WIDE){1'b0}}; 455 | candidate9 <=(K>=10) ?candidate8 :{(2*LEN+FEATURE_WIDE){1'b0}}; 456 | candidate10<=(K>=11) ?candidate9 :{(2*LEN+FEATURE_WIDE){1'b0}}; 457 | candidate11<=(K>=12) ?candidate10 :{(2*LEN+FEATURE_WIDE){1'b0}}; 458 | candidate12<=(K>=13) ?candidate11 :{(2*LEN+FEATURE_WIDE){1'b0}}; 459 | candidate13<=(K>=14) ?candidate12 :{(2*LEN+FEATURE_WIDE){1'b0}}; 460 | candidate14<=(K>=15) ?candidate13 :{(2*LEN+FEATURE_WIDE){1'b0}}; 461 | candidate15<=(K>=16) ?candidate14 :{(2*LEN+FEATURE_WIDE){1'b0}}; 462 | lab0 <=(K>=1 ) ?lab0 :{NUM{1'b0}}; 463 | lab1 <=(K>=2 ) ?lab1 :{NUM{1'b0}}; 464 | lab2 <=(K>=3 ) ?lab2 :{NUM{1'b0}}; 465 | lab3 <=(K>=4 ) ?lab3 :{NUM{1'b0}}; 466 | lab4 <=(K>=5 ) ?lab4 :{NUM{1'b0}}; 467 | lab5 <=(K>=6 ) ?lab5 :{NUM{1'b0}}; 468 | lab6 <=(K>=7 ) ?lab :{NUM{1'b0}}; 469 | lab7 <=(K>=8 ) ?lab6 :{NUM{1'b0}}; 470 | lab8 <=(K>=9 ) ?lab7 :{NUM{1'b0}}; 471 | lab9 <=(K>=10) ?lab8 :{NUM{1'b0}}; 472 | lab10 <=(K>=11) ?lab9 :{NUM{1'b0}}; 473 | lab11 <=(K>=12) ?lab10:{NUM{1'b0}}; 474 | lab12 <=(K>=13) ?lab11:{NUM{1'b0}}; 475 | lab13 <=(K>=14) ?lab12:{NUM{1'b0}}; 476 | lab14 <=(K>=15) ?lab13:{NUM{1'b0}}; 477 | lab15 <=(K>=16) ?lab14:{NUM{1'b0}}; 478 | 479 | end 480 | 5'd8:begin 481 | candidate0 <=(K>=1 ) ?candidate0 :{(2*LEN+FEATURE_WIDE){1'b0}}; 482 | candidate1 <=(K>=2 ) ?candidate1 :{(2*LEN+FEATURE_WIDE){1'b0}}; 483 | candidate2 <=(K>=3 ) ?candidate2 :{(2*LEN+FEATURE_WIDE){1'b0}}; 484 | candidate3 <=(K>=4 ) ?candidate3 :{(2*LEN+FEATURE_WIDE){1'b0}}; 485 | candidate4 <=(K>=5 ) ?candidate4 :{(2*LEN+FEATURE_WIDE){1'b0}}; 486 | candidate5 <=(K>=6 ) ?candidate5 :{(2*LEN+FEATURE_WIDE){1'b0}}; 487 | candidate6 <=(K>=7 ) ?candidate6 :{(2*LEN+FEATURE_WIDE){1'b0}}; 488 | candidate7 <=(K>=8 ) ?sigma_result:{(2*LEN+FEATURE_WIDE){1'b0}}; 489 | candidate8 <=(K>=9 ) ?candidate7 :{(2*LEN+FEATURE_WIDE){1'b0}}; 490 | candidate9 <=(K>=10) ?candidate8 :{(2*LEN+FEATURE_WIDE){1'b0}}; 491 | candidate10<=(K>=11) ?candidate9 :{(2*LEN+FEATURE_WIDE){1'b0}}; 492 | candidate11<=(K>=12) ?candidate10 :{(2*LEN+FEATURE_WIDE){1'b0}}; 493 | candidate12<=(K>=13) ?candidate11 :{(2*LEN+FEATURE_WIDE){1'b0}}; 494 | candidate13<=(K>=14) ?candidate12 :{(2*LEN+FEATURE_WIDE){1'b0}}; 495 | candidate14<=(K>=15) ?candidate13 :{(2*LEN+FEATURE_WIDE){1'b0}}; 496 | candidate15<=(K>=16) ?candidate14 :{(2*LEN+FEATURE_WIDE){1'b0}}; 497 | lab0 <=(K>=1 ) ?lab0 :{NUM{1'b0}}; 498 | lab1 <=(K>=2 ) ?lab1 :{NUM{1'b0}}; 499 | lab2 <=(K>=3 ) ?lab2 :{NUM{1'b0}}; 500 | lab3 <=(K>=4 ) ?lab3 :{NUM{1'b0}}; 501 | lab4 <=(K>=5 ) ?lab4 :{NUM{1'b0}}; 502 | lab5 <=(K>=6 ) ?lab5 :{NUM{1'b0}}; 503 | lab6 <=(K>=7 ) ?lab6 :{NUM{1'b0}}; 504 | lab7 <=(K>=8 ) ?lab :{NUM{1'b0}}; 505 | lab8 <=(K>=9 ) ?lab7 :{NUM{1'b0}}; 506 | lab9 <=(K>=10) ?lab8 :{NUM{1'b0}}; 507 | lab10 <=(K>=11) ?lab9 :{NUM{1'b0}}; 508 | lab11 <=(K>=12) ?lab10:{NUM{1'b0}}; 509 | lab12 <=(K>=13) ?lab11:{NUM{1'b0}}; 510 | lab13 <=(K>=14) ?lab12:{NUM{1'b0}}; 511 | lab14 <=(K>=15) ?lab13:{NUM{1'b0}}; 512 | lab15 <=(K>=16) ?lab14:{NUM{1'b0}}; 513 | end 514 | 5'd9:begin 515 | candidate0 <=(K>=1 ) ?candidate0 :{(2*LEN+FEATURE_WIDE){1'b0}}; 516 | candidate1 <=(K>=2 ) ?candidate1 :{(2*LEN+FEATURE_WIDE){1'b0}}; 517 | candidate2 <=(K>=3 ) ?candidate2 :{(2*LEN+FEATURE_WIDE){1'b0}}; 518 | candidate3 <=(K>=4 ) ?candidate3 :{(2*LEN+FEATURE_WIDE){1'b0}}; 519 | candidate4 <=(K>=5 ) ?candidate4 :{(2*LEN+FEATURE_WIDE){1'b0}}; 520 | candidate5 <=(K>=6 ) ?candidate5 :{(2*LEN+FEATURE_WIDE){1'b0}}; 521 | candidate6 <=(K>=7 ) ?candidate6 :{(2*LEN+FEATURE_WIDE){1'b0}}; 522 | candidate7 <=(K>=8 ) ?candidate7 :{(2*LEN+FEATURE_WIDE){1'b0}}; 523 | candidate8 <=(K>=9 ) ?sigma_result:{(2*LEN+FEATURE_WIDE){1'b0}}; 524 | candidate9 <=(K>=10) ?candidate8 :{(2*LEN+FEATURE_WIDE){1'b0}}; 525 | candidate10<=(K>=11) ?candidate9 :{(2*LEN+FEATURE_WIDE){1'b0}}; 526 | candidate11<=(K>=12) ?candidate10 :{(2*LEN+FEATURE_WIDE){1'b0}}; 527 | candidate12<=(K>=13) ?candidate11 :{(2*LEN+FEATURE_WIDE){1'b0}}; 528 | candidate13<=(K>=14) ?candidate12 :{(2*LEN+FEATURE_WIDE){1'b0}}; 529 | candidate14<=(K>=15) ?candidate13 :{(2*LEN+FEATURE_WIDE){1'b0}}; 530 | candidate15<=(K>=16) ?candidate14 :{(2*LEN+FEATURE_WIDE){1'b0}}; 531 | lab0 <=(K>=1 ) ?lab0 :{NUM{1'b0}}; 532 | lab1 <=(K>=2 ) ?lab1 :{NUM{1'b0}}; 533 | lab2 <=(K>=3 ) ?lab2 :{NUM{1'b0}}; 534 | lab3 <=(K>=4 ) ?lab3 :{NUM{1'b0}}; 535 | lab4 <=(K>=5 ) ?lab4 :{NUM{1'b0}}; 536 | lab5 <=(K>=6 ) ?lab5 :{NUM{1'b0}}; 537 | lab6 <=(K>=7 ) ?lab6 :{NUM{1'b0}}; 538 | lab7 <=(K>=8 ) ?lab7 :{NUM{1'b0}}; 539 | lab8 <=(K>=9 ) ?lab :{NUM{1'b0}}; 540 | lab9 <=(K>=10) ?lab8 :{NUM{1'b0}}; 541 | lab10 <=(K>=11) ?lab9 :{NUM{1'b0}}; 542 | lab11 <=(K>=12) ?lab10:{NUM{1'b0}}; 543 | lab12 <=(K>=13) ?lab11:{NUM{1'b0}}; 544 | lab13 <=(K>=14) ?lab12:{NUM{1'b0}}; 545 | lab14 <=(K>=15) ?lab13:{NUM{1'b0}}; 546 | lab15 <=(K>=16) ?lab14:{NUM{1'b0}}; 547 | end 548 | 5'd10:begin 549 | candidate0 <=(K>=1 ) ?candidate0 :{(2*LEN+FEATURE_WIDE){1'b0}}; 550 | candidate1 <=(K>=2 ) ?candidate1 :{(2*LEN+FEATURE_WIDE){1'b0}}; 551 | candidate2 <=(K>=3 ) ?candidate2 :{(2*LEN+FEATURE_WIDE){1'b0}}; 552 | candidate3 <=(K>=4 ) ?candidate3 :{(2*LEN+FEATURE_WIDE){1'b0}}; 553 | candidate4 <=(K>=5 ) ?candidate4 :{(2*LEN+FEATURE_WIDE){1'b0}}; 554 | candidate5 <=(K>=6 ) ?candidate5 :{(2*LEN+FEATURE_WIDE){1'b0}}; 555 | candidate6 <=(K>=7 ) ?candidate6 :{(2*LEN+FEATURE_WIDE){1'b0}}; 556 | candidate7 <=(K>=8 ) ?candidate7 :{(2*LEN+FEATURE_WIDE){1'b0}}; 557 | candidate8 <=(K>=9 ) ?candidate8 :{(2*LEN+FEATURE_WIDE){1'b0}}; 558 | candidate9 <=(K>=10) ?sigma_result:{(2*LEN+FEATURE_WIDE){1'b0}}; 559 | candidate10<=(K>=11) ?candidate9 :{(2*LEN+FEATURE_WIDE){1'b0}}; 560 | candidate11<=(K>=12) ?candidate10 :{(2*LEN+FEATURE_WIDE){1'b0}}; 561 | candidate12<=(K>=13) ?candidate11 :{(2*LEN+FEATURE_WIDE){1'b0}}; 562 | candidate13<=(K>=14) ?candidate12 :{(2*LEN+FEATURE_WIDE){1'b0}}; 563 | candidate14<=(K>=15) ?candidate13 :{(2*LEN+FEATURE_WIDE){1'b0}}; 564 | candidate15<=(K>=16) ?candidate14 :{(2*LEN+FEATURE_WIDE){1'b0}}; 565 | lab0 <=(K>=1 ) ?lab0 :{NUM{1'b0}}; 566 | lab1 <=(K>=2 ) ?lab1 :{NUM{1'b0}}; 567 | lab2 <=(K>=3 ) ?lab2 :{NUM{1'b0}}; 568 | lab3 <=(K>=4 ) ?lab3 :{NUM{1'b0}}; 569 | lab4 <=(K>=5 ) ?lab4 :{NUM{1'b0}}; 570 | lab5 <=(K>=6 ) ?lab5 :{NUM{1'b0}}; 571 | lab6 <=(K>=7 ) ?lab6 :{NUM{1'b0}}; 572 | lab7 <=(K>=8 ) ?lab7 :{NUM{1'b0}}; 573 | lab8 <=(K>=9 ) ?lab8 :{NUM{1'b0}}; 574 | lab9 <=(K>=10) ?lab :{NUM{1'b0}}; 575 | lab10 <=(K>=11) ?lab9 :{NUM{1'b0}}; 576 | lab11 <=(K>=12) ?lab10:{NUM{1'b0}}; 577 | lab12 <=(K>=13) ?lab11:{NUM{1'b0}}; 578 | lab13 <=(K>=14) ?lab12:{NUM{1'b0}}; 579 | lab14 <=(K>=15) ?lab13:{NUM{1'b0}}; 580 | lab15 <=(K>=16) ?lab14:{NUM{1'b0}}; 581 | 582 | end 583 | 5'd11:begin 584 | candidate0 <=(K>=1 ) ?candidate0 :{(2*LEN+FEATURE_WIDE){1'b0}}; 585 | candidate1 <=(K>=2 ) ?candidate1 :{(2*LEN+FEATURE_WIDE){1'b0}}; 586 | candidate2 <=(K>=3 ) ?candidate2 :{(2*LEN+FEATURE_WIDE){1'b0}}; 587 | candidate3 <=(K>=4 ) ?candidate3 :{(2*LEN+FEATURE_WIDE){1'b0}}; 588 | candidate4 <=(K>=5 ) ?candidate4 :{(2*LEN+FEATURE_WIDE){1'b0}}; 589 | candidate5 <=(K>=6 ) ?candidate5 :{(2*LEN+FEATURE_WIDE){1'b0}}; 590 | candidate6 <=(K>=7 ) ?candidate6 :{(2*LEN+FEATURE_WIDE){1'b0}}; 591 | candidate7 <=(K>=8 ) ?candidate7 :{(2*LEN+FEATURE_WIDE){1'b0}}; 592 | candidate8 <=(K>=9 ) ?candidate8 :{(2*LEN+FEATURE_WIDE){1'b0}}; 593 | candidate9 <=(K>=10) ?candidate9 :{(2*LEN+FEATURE_WIDE){1'b0}}; 594 | candidate10<=(K>=11) ?sigma_result:{(2*LEN+FEATURE_WIDE){1'b0}}; 595 | candidate11<=(K>=12) ?candidate10 :{(2*LEN+FEATURE_WIDE){1'b0}}; 596 | candidate12<=(K>=13) ?candidate11 :{(2*LEN+FEATURE_WIDE){1'b0}}; 597 | candidate13<=(K>=14) ?candidate12 :{(2*LEN+FEATURE_WIDE){1'b0}}; 598 | candidate14<=(K>=15) ?candidate13 :{(2*LEN+FEATURE_WIDE){1'b0}}; 599 | candidate15<=(K>=16) ?candidate14 :{(2*LEN+FEATURE_WIDE){1'b0}}; 600 | lab0 <=(K>=1 ) ?lab0 :{NUM{1'b0}}; 601 | lab1 <=(K>=2 ) ?lab1 :{NUM{1'b0}}; 602 | lab2 <=(K>=3 ) ?lab2 :{NUM{1'b0}}; 603 | lab3 <=(K>=4 ) ?lab3 :{NUM{1'b0}}; 604 | lab4 <=(K>=5 ) ?lab4 :{NUM{1'b0}}; 605 | lab5 <=(K>=6 ) ?lab5 :{NUM{1'b0}}; 606 | lab6 <=(K>=7 ) ?lab6 :{NUM{1'b0}}; 607 | lab7 <=(K>=8 ) ?lab7 :{NUM{1'b0}}; 608 | lab8 <=(K>=9 ) ?lab8 :{NUM{1'b0}}; 609 | lab9 <=(K>=10) ?lab9 :{NUM{1'b0}}; 610 | lab10 <=(K>=11) ?lab :{NUM{1'b0}}; 611 | lab11 <=(K>=12) ?lab10:{NUM{1'b0}}; 612 | lab12 <=(K>=13) ?lab11:{NUM{1'b0}}; 613 | lab13 <=(K>=14) ?lab12:{NUM{1'b0}}; 614 | lab14 <=(K>=15) ?lab13:{NUM{1'b0}}; 615 | lab15 <=(K>=16) ?lab14:{NUM{1'b0}}; 616 | end 617 | 5'd12:begin 618 | candidate0 <=(K>=1 ) ?candidate0 :{(2*LEN+FEATURE_WIDE){1'b0}}; 619 | candidate1 <=(K>=2 ) ?candidate1 :{(2*LEN+FEATURE_WIDE){1'b0}}; 620 | candidate2 <=(K>=3 ) ?candidate2 :{(2*LEN+FEATURE_WIDE){1'b0}}; 621 | candidate3 <=(K>=4 ) ?candidate3 :{(2*LEN+FEATURE_WIDE){1'b0}}; 622 | candidate4 <=(K>=5 ) ?candidate4 :{(2*LEN+FEATURE_WIDE){1'b0}}; 623 | candidate5 <=(K>=6 ) ?candidate5 :{(2*LEN+FEATURE_WIDE){1'b0}}; 624 | candidate6 <=(K>=7 ) ?candidate6 :{(2*LEN+FEATURE_WIDE){1'b0}}; 625 | candidate7 <=(K>=8 ) ?candidate7 :{(2*LEN+FEATURE_WIDE){1'b0}}; 626 | candidate8 <=(K>=9 ) ?candidate8 :{(2*LEN+FEATURE_WIDE){1'b0}}; 627 | candidate9 <=(K>=10) ?candidate9 :{(2*LEN+FEATURE_WIDE){1'b0}}; 628 | candidate10<=(K>=11) ?candidate10 :{(2*LEN+FEATURE_WIDE){1'b0}}; 629 | candidate11<=(K>=12) ?sigma_result:{(2*LEN+FEATURE_WIDE){1'b0}}; 630 | candidate12<=(K>=13) ?candidate11 :{(2*LEN+FEATURE_WIDE){1'b0}}; 631 | candidate13<=(K>=14) ?candidate12 :{(2*LEN+FEATURE_WIDE){1'b0}}; 632 | candidate14<=(K>=15) ?candidate13 :{(2*LEN+FEATURE_WIDE){1'b0}}; 633 | candidate15<=(K>=16) ?candidate14 :{(2*LEN+FEATURE_WIDE){1'b0}}; 634 | lab0 <=(K>=1 ) ?lab0 :{NUM{1'b0}}; 635 | lab1 <=(K>=2 ) ?lab1 :{NUM{1'b0}}; 636 | lab2 <=(K>=3 ) ?lab2 :{NUM{1'b0}}; 637 | lab3 <=(K>=4 ) ?lab3 :{NUM{1'b0}}; 638 | lab4 <=(K>=5 ) ?lab4 :{NUM{1'b0}}; 639 | lab5 <=(K>=6 ) ?lab5 :{NUM{1'b0}}; 640 | lab6 <=(K>=7 ) ?lab6 :{NUM{1'b0}}; 641 | lab7 <=(K>=8 ) ?lab7 :{NUM{1'b0}}; 642 | lab8 <=(K>=9 ) ?lab8 :{NUM{1'b0}}; 643 | lab9 <=(K>=10) ?lab9 :{NUM{1'b0}}; 644 | lab10 <=(K>=11) ?lab10:{NUM{1'b0}}; 645 | lab11 <=(K>=12) ?lab :{NUM{1'b0}}; 646 | lab12 <=(K>=13) ?lab11:{NUM{1'b0}}; 647 | lab13 <=(K>=14) ?lab12:{NUM{1'b0}}; 648 | lab14 <=(K>=15) ?lab13:{NUM{1'b0}}; 649 | lab15 <=(K>=16) ?lab14:{NUM{1'b0}}; 650 | 651 | end 652 | 5'd13:begin 653 | candidate0 <=(K>=1 ) ?candidate0 :{(2*LEN+FEATURE_WIDE){1'b0}}; 654 | candidate1 <=(K>=2 ) ?candidate1 :{(2*LEN+FEATURE_WIDE){1'b0}}; 655 | candidate2 <=(K>=3 ) ?candidate2 :{(2*LEN+FEATURE_WIDE){1'b0}}; 656 | candidate3 <=(K>=4 ) ?candidate3 :{(2*LEN+FEATURE_WIDE){1'b0}}; 657 | candidate4 <=(K>=5 ) ?candidate4 :{(2*LEN+FEATURE_WIDE){1'b0}}; 658 | candidate5 <=(K>=6 ) ?candidate5 :{(2*LEN+FEATURE_WIDE){1'b0}}; 659 | candidate6 <=(K>=7 ) ?candidate6 :{(2*LEN+FEATURE_WIDE){1'b0}}; 660 | candidate7 <=(K>=8 ) ?candidate7 :{(2*LEN+FEATURE_WIDE){1'b0}}; 661 | candidate8 <=(K>=9 ) ?candidate8 :{(2*LEN+FEATURE_WIDE){1'b0}}; 662 | candidate9 <=(K>=10) ?candidate9 :{(2*LEN+FEATURE_WIDE){1'b0}}; 663 | candidate10<=(K>=11) ?candidate10 :{(2*LEN+FEATURE_WIDE){1'b0}}; 664 | candidate11<=(K>=12) ?candidate11 :{(2*LEN+FEATURE_WIDE){1'b0}}; 665 | candidate12<=(K>=13) ?sigma_result:{(2*LEN+FEATURE_WIDE){1'b0}}; 666 | candidate13<=(K>=14) ?candidate12 :{(2*LEN+FEATURE_WIDE){1'b0}}; 667 | candidate14<=(K>=15) ?candidate13 :{(2*LEN+FEATURE_WIDE){1'b0}}; 668 | candidate15<=(K>=16) ?candidate14 :{(2*LEN+FEATURE_WIDE){1'b0}}; 669 | lab0 <=(K>=1 ) ?lab0 :{NUM{1'b0}}; 670 | lab1 <=(K>=2 ) ?lab1 :{NUM{1'b0}}; 671 | lab2 <=(K>=3 ) ?lab2 :{NUM{1'b0}}; 672 | lab3 <=(K>=4 ) ?lab3 :{NUM{1'b0}}; 673 | lab4 <=(K>=5 ) ?lab4 :{NUM{1'b0}}; 674 | lab5 <=(K>=6 ) ?lab5 :{NUM{1'b0}}; 675 | lab6 <=(K>=7 ) ?lab6 :{NUM{1'b0}}; 676 | lab7 <=(K>=8 ) ?lab7 :{NUM{1'b0}}; 677 | lab8 <=(K>=9 ) ?lab8 :{NUM{1'b0}}; 678 | lab9 <=(K>=10) ?lab9 :{NUM{1'b0}}; 679 | lab10 <=(K>=11) ?lab10:{NUM{1'b0}}; 680 | lab11 <=(K>=12) ?lab11:{NUM{1'b0}}; 681 | lab12 <=(K>=13) ?lab :{NUM{1'b0}}; 682 | lab13 <=(K>=14) ?lab12:{NUM{1'b0}}; 683 | lab14 <=(K>=15) ?lab13:{NUM{1'b0}}; 684 | lab15 <=(K>=16) ?lab14:{NUM{1'b0}}; 685 | 686 | end 687 | 5'd14:begin 688 | candidate0 <=(K>=1 ) ?candidate0 :{(2*LEN+FEATURE_WIDE){1'b0}}; 689 | candidate1 <=(K>=2 ) ?candidate1 :{(2*LEN+FEATURE_WIDE){1'b0}}; 690 | candidate2 <=(K>=3 ) ?candidate2 :{(2*LEN+FEATURE_WIDE){1'b0}}; 691 | candidate3 <=(K>=4 ) ?candidate3 :{(2*LEN+FEATURE_WIDE){1'b0}}; 692 | candidate4 <=(K>=5 ) ?candidate4 :{(2*LEN+FEATURE_WIDE){1'b0}}; 693 | candidate5 <=(K>=6 ) ?candidate5 :{(2*LEN+FEATURE_WIDE){1'b0}}; 694 | candidate6 <=(K>=7 ) ?candidate6 :{(2*LEN+FEATURE_WIDE){1'b0}}; 695 | candidate7 <=(K>=8 ) ?candidate7 :{(2*LEN+FEATURE_WIDE){1'b0}}; 696 | candidate8 <=(K>=9 ) ?candidate8 :{(2*LEN+FEATURE_WIDE){1'b0}}; 697 | candidate9 <=(K>=10) ?candidate9 :{(2*LEN+FEATURE_WIDE){1'b0}}; 698 | candidate10<=(K>=11) ?candidate10 :{(2*LEN+FEATURE_WIDE){1'b0}}; 699 | candidate11<=(K>=12) ?candidate11 :{(2*LEN+FEATURE_WIDE){1'b0}}; 700 | candidate12<=(K>=13) ?candidate12 :{(2*LEN+FEATURE_WIDE){1'b0}}; 701 | candidate13<=(K>=14) ?sigma_result:{(2*LEN+FEATURE_WIDE){1'b0}}; 702 | candidate14<=(K>=15) ?candidate13 :{(2*LEN+FEATURE_WIDE){1'b0}}; 703 | candidate15<=(K>=16) ?candidate14 :{(2*LEN+FEATURE_WIDE){1'b0}}; 704 | lab0 <=(K>=1 ) ?lab0 :{NUM{1'b0}}; 705 | lab1 <=(K>=2 ) ?lab1 :{NUM{1'b0}}; 706 | lab2 <=(K>=3 ) ?lab2 :{NUM{1'b0}}; 707 | lab3 <=(K>=4 ) ?lab3 :{NUM{1'b0}}; 708 | lab4 <=(K>=5 ) ?lab4 :{NUM{1'b0}}; 709 | lab5 <=(K>=6 ) ?lab5 :{NUM{1'b0}}; 710 | lab6 <=(K>=7 ) ?lab6 :{NUM{1'b0}}; 711 | lab7 <=(K>=8 ) ?lab7 :{NUM{1'b0}}; 712 | lab8 <=(K>=9 ) ?lab8 :{NUM{1'b0}}; 713 | lab9 <=(K>=10) ?lab9 :{NUM{1'b0}}; 714 | lab10 <=(K>=11) ?lab10:{NUM{1'b0}}; 715 | lab11 <=(K>=12) ?lab11:{NUM{1'b0}}; 716 | lab12 <=(K>=13) ?lab12:{NUM{1'b0}}; 717 | lab13 <=(K>=14) ?lab :{NUM{1'b0}}; 718 | lab14 <=(K>=15) ?lab13:{NUM{1'b0}}; 719 | lab15 <=(K>=16) ?lab14:{NUM{1'b0}}; 720 | 721 | end 722 | 5'd15:begin 723 | candidate0 <=(K>=1 ) ?candidate0 :{(2*LEN+FEATURE_WIDE){1'b0}}; 724 | candidate1 <=(K>=2 ) ?candidate1 :{(2*LEN+FEATURE_WIDE){1'b0}}; 725 | candidate2 <=(K>=3 ) ?candidate2 :{(2*LEN+FEATURE_WIDE){1'b0}}; 726 | candidate3 <=(K>=4 ) ?candidate3 :{(2*LEN+FEATURE_WIDE){1'b0}}; 727 | candidate4 <=(K>=5 ) ?candidate4 :{(2*LEN+FEATURE_WIDE){1'b0}}; 728 | candidate5 <=(K>=6 ) ?candidate5 :{(2*LEN+FEATURE_WIDE){1'b0}}; 729 | candidate6 <=(K>=7 ) ?candidate6 :{(2*LEN+FEATURE_WIDE){1'b0}}; 730 | candidate7 <=(K>=8 ) ?candidate7 :{(2*LEN+FEATURE_WIDE){1'b0}}; 731 | candidate8 <=(K>=9 ) ?candidate8 :{(2*LEN+FEATURE_WIDE){1'b0}}; 732 | candidate9 <=(K>=10) ?candidate9 :{(2*LEN+FEATURE_WIDE){1'b0}}; 733 | candidate10<=(K>=11) ?candidate10 :{(2*LEN+FEATURE_WIDE){1'b0}}; 734 | candidate11<=(K>=12) ?candidate11 :{(2*LEN+FEATURE_WIDE){1'b0}}; 735 | candidate12<=(K>=13) ?candidate12 :{(2*LEN+FEATURE_WIDE){1'b0}}; 736 | candidate13<=(K>=14) ?candidate13 :{(2*LEN+FEATURE_WIDE){1'b0}}; 737 | candidate14<=(K>=15) ?sigma_result:{(2*LEN+FEATURE_WIDE){1'b0}}; 738 | candidate15<=(K>=16) ?candidate14 :{(2*LEN+FEATURE_WIDE){1'b0}}; 739 | lab0 <=(K>=1 ) ?lab0 :{NUM{1'b0}}; 740 | lab1 <=(K>=2 ) ?lab1 :{NUM{1'b0}}; 741 | lab2 <=(K>=3 ) ?lab2 :{NUM{1'b0}}; 742 | lab3 <=(K>=4 ) ?lab3 :{NUM{1'b0}}; 743 | lab4 <=(K>=5 ) ?lab4 :{NUM{1'b0}}; 744 | lab5 <=(K>=6 ) ?lab5 :{NUM{1'b0}}; 745 | lab6 <=(K>=7 ) ?lab6 :{NUM{1'b0}}; 746 | lab7 <=(K>=8 ) ?lab7 :{NUM{1'b0}}; 747 | lab8 <=(K>=9 ) ?lab8 :{NUM{1'b0}}; 748 | lab9 <=(K>=10) ?lab9 :{NUM{1'b0}}; 749 | lab10 <=(K>=11) ?lab10:{NUM{1'b0}}; 750 | lab11 <=(K>=12) ?lab11:{NUM{1'b0}}; 751 | lab12 <=(K>=13) ?lab12:{NUM{1'b0}}; 752 | lab13 <=(K>=14) ?lab13:{NUM{1'b0}}; 753 | lab14 <=(K>=15) ?lab :{NUM{1'b0}}; 754 | lab15 <=(K>=16) ?lab14:{NUM{1'b0}}; 755 | 756 | end 757 | 5'd16:begin 758 | candidate0 <=(K>=1 ) ?candidate0 :{(2*LEN+FEATURE_WIDE){1'b0}}; 759 | candidate1 <=(K>=2 ) ?candidate1 :{(2*LEN+FEATURE_WIDE){1'b0}}; 760 | candidate2 <=(K>=3 ) ?candidate2 :{(2*LEN+FEATURE_WIDE){1'b0}}; 761 | candidate3 <=(K>=4 ) ?candidate3 :{(2*LEN+FEATURE_WIDE){1'b0}}; 762 | candidate4 <=(K>=5 ) ?candidate4 :{(2*LEN+FEATURE_WIDE){1'b0}}; 763 | candidate5 <=(K>=6 ) ?candidate5 :{(2*LEN+FEATURE_WIDE){1'b0}}; 764 | candidate6 <=(K>=7 ) ?candidate6 :{(2*LEN+FEATURE_WIDE){1'b0}}; 765 | candidate7 <=(K>=8 ) ?candidate7 :{(2*LEN+FEATURE_WIDE){1'b0}}; 766 | candidate8 <=(K>=9 ) ?candidate8 :{(2*LEN+FEATURE_WIDE){1'b0}}; 767 | candidate9 <=(K>=10) ?candidate9 :{(2*LEN+FEATURE_WIDE){1'b0}}; 768 | candidate10<=(K>=11) ?candidate10 :{(2*LEN+FEATURE_WIDE){1'b0}}; 769 | candidate11<=(K>=12) ?candidate11 :{(2*LEN+FEATURE_WIDE){1'b0}}; 770 | candidate12<=(K>=13) ?candidate12 :{(2*LEN+FEATURE_WIDE){1'b0}}; 771 | candidate13<=(K>=14) ?candidate13 :{(2*LEN+FEATURE_WIDE){1'b0}}; 772 | candidate14<=(K>=15) ?candidate14 :{(2*LEN+FEATURE_WIDE){1'b0}}; 773 | candidate15<=(K>=16) ?sigma_result:{(2*LEN+FEATURE_WIDE){1'b0}}; 774 | lab0 <=(K>=1 ) ?lab0 :{NUM{1'b0}}; 775 | lab1 <=(K>=2 ) ?lab1 :{NUM{1'b0}}; 776 | lab2 <=(K>=3 ) ?lab2 :{NUM{1'b0}}; 777 | lab3 <=(K>=4 ) ?lab3 :{NUM{1'b0}}; 778 | lab4 <=(K>=5 ) ?lab4 :{NUM{1'b0}}; 779 | lab5 <=(K>=6 ) ?lab5 :{NUM{1'b0}}; 780 | lab6 <=(K>=7 ) ?lab6 :{NUM{1'b0}}; 781 | lab7 <=(K>=8 ) ?lab7 :{NUM{1'b0}}; 782 | lab8 <=(K>=9 ) ?lab8 :{NUM{1'b0}}; 783 | lab9 <=(K>=10) ?lab9 :{NUM{1'b0}}; 784 | lab10 <=(K>=11) ?lab10:{NUM{1'b0}}; 785 | lab11 <=(K>=12) ?lab11:{NUM{1'b0}}; 786 | lab12 <=(K>=13) ?lab12:{NUM{1'b0}}; 787 | lab13 <=(K>=14) ?lab13:{NUM{1'b0}}; 788 | lab14 <=(K>=15) ?lab14:{NUM{1'b0}}; 789 | lab15 <=(K>=16) ?lab :{NUM{1'b0}}; 790 | 791 | end 792 | default:begin 793 | candidate0 <=(K>=1 ) ?candidate0 :{(2*LEN+FEATURE_WIDE){1'b0}}; 794 | candidate1 <=(K>=2 ) ?candidate1 :{(2*LEN+FEATURE_WIDE){1'b0}}; 795 | candidate2 <=(K>=3 ) ?candidate2 :{(2*LEN+FEATURE_WIDE){1'b0}}; 796 | candidate3 <=(K>=4 ) ?candidate3 :{(2*LEN+FEATURE_WIDE){1'b0}}; 797 | candidate4 <=(K>=5 ) ?candidate4 :{(2*LEN+FEATURE_WIDE){1'b0}}; 798 | candidate5 <=(K>=6 ) ?candidate5 :{(2*LEN+FEATURE_WIDE){1'b0}}; 799 | candidate6 <=(K>=7 ) ?candidate6 :{(2*LEN+FEATURE_WIDE){1'b0}}; 800 | candidate7 <=(K>=8 ) ?candidate7 :{(2*LEN+FEATURE_WIDE){1'b0}}; 801 | candidate8 <=(K>=9 ) ?candidate8 :{(2*LEN+FEATURE_WIDE){1'b0}}; 802 | candidate9 <=(K>=10) ?candidate9 :{(2*LEN+FEATURE_WIDE){1'b0}}; 803 | candidate10<=(K>=11) ?candidate10:{(2*LEN+FEATURE_WIDE){1'b0}}; 804 | candidate11<=(K>=12) ?candidate11:{(2*LEN+FEATURE_WIDE){1'b0}}; 805 | candidate12<=(K>=13) ?candidate12:{(2*LEN+FEATURE_WIDE){1'b0}}; 806 | candidate13<=(K>=14) ?candidate13:{(2*LEN+FEATURE_WIDE){1'b0}}; 807 | candidate14<=(K>=15) ?candidate14:{(2*LEN+FEATURE_WIDE){1'b0}}; 808 | candidate15<=(K>=16) ?candidate15:{(2*LEN+FEATURE_WIDE){1'b0}}; 809 | lab0 <= (K>=1 ) ?lab0 :{NUM{1'b0}}; 810 | lab1 <= (K>=2 ) ?lab1 :{NUM{1'b0}}; 811 | lab2 <= (K>=3 ) ?lab2 :{NUM{1'b0}}; 812 | lab3 <= (K>=4 ) ?lab3 :{NUM{1'b0}}; 813 | lab4 <= (K>=5 ) ?lab4 :{NUM{1'b0}}; 814 | lab5 <= (K>=6 ) ?lab5 :{NUM{1'b0}}; 815 | lab6 <= (K>=7 ) ?lab6 :{NUM{1'b0}}; 816 | lab7 <= (K>=8 ) ?lab7 :{NUM{1'b0}}; 817 | lab8 <= (K>=9 ) ?lab8 :{NUM{1'b0}}; 818 | lab9 <= (K>=10) ?lab9 :{NUM{1'b0}}; 819 | lab10 <= (K>=11) ?lab10:{NUM{1'b0}}; 820 | lab11 <= (K>=12) ?lab11:{NUM{1'b0}}; 821 | lab12 <= (K>=13) ?lab12:{NUM{1'b0}}; 822 | lab13 <= (K>=14) ?lab13:{NUM{1'b0}}; 823 | lab14 <= (K>=15) ?lab14:{NUM{1'b0}}; 824 | lab15 <= (K>=16) ?lab15:{NUM{1'b0}}; 825 | 826 | end 827 | endcase 828 | end 829 | 830 | 831 | 832 | 833 | assign candidate=(flag==1'b1)?{candidate15,candidate14,candidate13,candidate12,candidate11,candidate10,candidate9 ,candidate8, 834 | candidate7 ,candidate6 ,candidate5 ,candidate4 ,candidate3 ,candidate2 ,candidate1 ,candidate0}:{(2*LEN+FEATURE_WIDE){1'b1}}; 835 | 836 | assign out_lab=(flag==1'b1)?{lab15,lab14,lab13,lab12,lab11,lab10,lab9 ,lab8, 837 | lab7 ,lab6 ,lab5 ,lab4 ,lab3 ,lab2 ,lab1 ,lab0}:{NUM{1'b0}}; 838 | 839 | 840 | endmodule --------------------------------------------------------------------------------