- //############################################################################
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- // (C) Copyright Laboratory System Integration and Silicon Implementation
- // All Right Reserved
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- //
- // ICLAB 2011 Spring
- // Lab02 : PID
- // Author : Ju-Hung Hsiao (ju0909@si2lab.org)
- //
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- //
- // File Name : PID.v
- // Module Name : PID
- // Release version : V1.0 (Release Date: 2011-03)
- //
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- //############################################################################
- module PID(//input
- MODE,
- IN_A,
- IN_B,
- IN_C,
- IN_D,
- IN_X1,
- IN_X2,
- SHIFT,
- //output
- OUT);
-
- input MODE;
- input [ 4:0] IN_A, IN_B, IN_C, IN_D;
- input [ 4:0] IN_X1, IN_X2;
- input [ 4:0] SHIFT;
- output [31:0] OUT;
- wire signed [4:0] A, B, C, D;
- wire signed [4:0] X1, X2;
- assign A = IN_A;
- assign B = IN_B;
- assign C = IN_C;
- assign D = IN_D;
- assign X1 = IN_X1;
- assign X2 = IN_X2;
- //----------------------------Basic Coefficient-----------------------------//
- wire signed [9:0] temp2=X2*X2;
- wire signed [19:0] temp4=temp2*temp2;
- wire signed [9:0] tp2=X1*X1;
- wire signed [19:0] tp4=tp2*tp2;
- //need to plus one bit to avoid subtraction overflow
- wire signed [20:0] temp41=temp4-tp4;
- wire signed [10:0] temp21=temp2-tp2;
- wire signed [5:0] temp11=X2-X1;
- //1.ten instead of eight bit to be more convinient use later
- //2.division and multiply with small number will be mapped to shift and add automatically
- wire signed [10:0] temp4A = (A<<<4)/4;//use shift??
- wire signed [10:0] temp4B = (B<<<4)/4;
- wire signed [10:0] temp4C = (C<<<4)/4;
- wire signed [10:0] temp4D = (D<<<4)/4;
-
- wire signed [10:0] temp2A = (A<<<4)/2;
- wire signed [10:0] temp2B = (B<<<4)/2;
- wire signed [10:0] temp2C = (C<<<4)/2;
- wire signed [10:0] temp2D = (D<<<4)/2;
- wire signed [6:0] temp33A = 3*A;
- wire signed [6:0] temp33B = 3*B;
- wire signed [6:0] temp33C = 3*C;
- wire signed [6:0] temp33D = 3*D;
- wire signed [5:0] temp22A = 2*A;
- wire signed [5:0] temp22B = 2*B;
- wire signed [5:0] temp22C = 2*C;
- wire signed [5:0] temp22D = 2*D;
- //----------------------------Multiplexer Part-----------------------------//
- wire signed [10:0] FIRST=({SHIFT[1:0],MODE}==3'b000)?temp4A:
- ({SHIFT[1:0],MODE}==3'b010)?temp4B:
- ({SHIFT[1:0],MODE}==3'b100)?temp4C:
- ({SHIFT[1:0],MODE}==3'b110)?temp4D:
- ({SHIFT[1:0],MODE}==3'b001)?{temp33A,4'b0000}:
- ({SHIFT[1:0],MODE}==3'b011)?{temp33B,4'b0000}:
- ({SHIFT[1:0],MODE}==3'b101)?{temp33C,4'b0000}:
- {temp33D,4'b0000};
-
-
- wire signed [10:0] SECOND=({SHIFT[1:0],MODE}==3'b000)?temp2C:
- ({SHIFT[1:0],MODE}==3'b010)?temp2D:
- ({SHIFT[1:0],MODE}==3'b100)?temp2A:
- ({SHIFT[1:0],MODE}==3'b110)?temp2B:
- ({SHIFT[1:0],MODE}==3'b001)?{temp22B[5],temp22B,4'b0000}:
- ({SHIFT[1:0],MODE}==3'b011)?{temp22C[5],temp22C,4'b0000}:
- ({SHIFT[1:0],MODE}==3'b101)?{temp22D[5],temp22D,4'b0000}:
- {temp22A[5],temp22A,4'b0000};
- wire signed [4:0] THIRD=({SHIFT[1:0],MODE}==3'b000)?D:
- ({SHIFT[1:0],MODE}==3'b010)?A:
- ({SHIFT[1:0],MODE}==3'b100)?B:
- ({SHIFT[1:0],MODE}==3'b110)?C:
- ({SHIFT[1:0],MODE}==3'b001)?C:
- ({SHIFT[1:0],MODE}==3'b011)?D:
- ({SHIFT[1:0],MODE}==3'b101)?A:
- B;
-
- wire signed [20:0] EL1 =(MODE)?{{11{temp2[9]}},temp2}:temp41;
- wire signed [10:0] EL2 =(MODE)?{{6{X2[4]}},X2}:temp21;
- wire signed [5:0] EL3 =(MODE)?5'b00001:temp11;
-
- //1.Over 4 bit to shift
- //----------------------------Calculate Part-----------------------------//
- wire signed [31:0] t1 = ({{25{FIRST[10]}},FIRST}*{{{11{EL1[20]}},EL1},4'b0000})>>>4;
- wire signed [31:0] t2 = ({{25{SECOND[10]}},SECOND}*{{{21{EL2[10]}},EL2},4'b0000})>>>4;
- wire signed [31:0] t3 = ({{{27{THIRD[4]}},THIRD},4'b0000}*{{{26{EL3[5]}},EL3},4'b0000})>>>4;
-
- wire signed [31:0] tt10 = t1+t2;
- assign OUT=tt10+t3;
- endmodule
复制代码 |