├── 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
--------------------------------------------------------------------------------