wuyuhua 发表于 2014-5-5 11:21:15

有人能提供《基于FPGA的PID控制器的设计》的相关程序吗?感激不尽!

有人能提供《基于FPGA的PID控制器的设计》的程序吗?感激不尽!

小梅哥 发表于 2014-5-6 13:12:38

再给你来一个版本的,因为本人没有用过,所以也没做实际的验证,如果你验证后证明可行,请回复,以方便大家。
module PID_ctrlplus (kt,T,K,L,U);
    inputkt,T,K,L;
    output U;
    reg U;
    wire kt;
    wire T,K,L;
    reg U1,U2,U3,U4,U5,U6,U7,U8,U9;
   
    parameter Ts=0.0002;
    always @ (kt or T or K or L)
    begin
   U1=12*T*kt*Ts;//10
   U2=3*T*Ts*Ts*kt*(kt+1);
   U3=6*T;
   U4=K*L;
   U5=K*L*L;
   U6=U1/U4;
   U7=U2/U5;
   U8=U3/K;
   U9=U6+U7+U8;
   U=U9/10;
end
endmodule




module te_pid_ctrl;
    reg kt;
    reg T,K,L;
    wire U;
    PID_ctrlplus CGX(kt,T,K,L,U);
    reg clk;
    initial
    begin
    clk<=0;
    kt<=50;
end
    always
    begin
    #1000
    clk<=~clk;
end
always @ (posedge clk)
    begin
   T<=2000;
   K<=5;
   L<=2;
   #20
    if(kt<100)
    kt=kt+1;
    else
   kt<=50;
end
endmodule

小梅哥 发表于 2014-5-6 13:09:01

这个是在网上下载的,基于Verilog。希望能对你有所帮助

小梅哥 发表于 2014-5-6 13:09:27

//############################################################################
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//   (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);
         
inputMODE;
input[ 4:0] IN_A, IN_B, IN_C, IN_D;
input[ 4:0] IN_X1, IN_X2;
input[ 4:0] SHIFT;
output OUT;


wire signedA, B, C, D;
wire signedX1, 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 temp2=X2*X2;
wire signed temp4=temp2*temp2;

wire signed tp2=X1*X1;
wire signed tp4=tp2*tp2;

//need to plus one bit to avoid subtraction overflow

wire signed temp41=temp4-tp4;
wire signed temp21=temp2-tp2;
wire signed 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 temp4A = (A<<<4)/4;//use shift??
wire signed temp4B = (B<<<4)/4;
wire signed temp4C = (C<<<4)/4;
wire signed temp4D = (D<<<4)/4;
            
wire signed temp2A = (A<<<4)/2;
wire signed temp2B = (B<<<4)/2;
wire signed temp2C = (C<<<4)/2;
wire signed temp2D = (D<<<4)/2;

wire signed temp33A = 3*A;
wire signed temp33B = 3*B;
wire signed temp33C = 3*C;
wire signed temp33D = 3*D;

wire signed temp22A = 2*A;
wire signed temp22B = 2*B;
wire signed temp22C = 2*C;
wire signed temp22D = 2*D;

//----------------------------Multiplexer Part-----------------------------//

wire signed FIRST=({SHIFT,MODE}==3'b000)?temp4A:
                                        ({SHIFT,MODE}==3'b010)?temp4B:
                                    ({SHIFT,MODE}==3'b100)?temp4C:
                                    ({SHIFT,MODE}==3'b110)?temp4D:
                                                ({SHIFT,MODE}==3'b001)?{temp33A,4'b0000}:
                                                ({SHIFT,MODE}==3'b011)?{temp33B,4'b0000}:
                                                ({SHIFT,MODE}==3'b101)?{temp33C,4'b0000}:
                                                                                                  {temp33D,4'b0000};                                       
                                               
                          
wire signed SECOND=({SHIFT,MODE}==3'b000)?temp2C:
                         ({SHIFT,MODE}==3'b010)?temp2D:
                         ({SHIFT,MODE}==3'b100)?temp2A:
                         ({SHIFT,MODE}==3'b110)?temp2B:
                         ({SHIFT,MODE}==3'b001)?{temp22B,temp22B,4'b0000}:
                         ({SHIFT,MODE}==3'b011)?{temp22C,temp22C,4'b0000}:
                         ({SHIFT,MODE}==3'b101)?{temp22D,temp22D,4'b0000}:
                                                                                {temp22A,temp22A,4'b0000};

wire signed THIRD=({SHIFT,MODE}==3'b000)?D:
                                    ({SHIFT,MODE}==3'b010)?A:
                                    ({SHIFT,MODE}==3'b100)?B:
                                    ({SHIFT,MODE}==3'b110)?C:
                              ({SHIFT,MODE}==3'b001)?C:
                        ({SHIFT,MODE}==3'b011)?D:
                              ({SHIFT,MODE}==3'b101)?A:
                                                                                B;
                                                                                                       
wire signed EL1=(MODE)?{{11{temp2}},temp2}:temp41;
wire signed EL2=(MODE)?{{6{X2}},X2}:temp21;
wire signed EL3=(MODE)?5'b00001:temp11;
                                                                                                                          
//1.Over 4 bit to shift
//----------------------------Calculate Part-----------------------------//
wire signed t1 = ({{25{FIRST}},FIRST}*{{{11{EL1}},EL1},4'b0000})>>>4;
wire signed t2 = ({{25{SECOND}},SECOND}*{{{21{EL2}},EL2},4'b0000})>>>4;
wire signed t3 = ({{{27{THIRD}},THIRD},4'b0000}*{{{26{EL3}},EL3},4'b0000})>>>4;
                                             
wire signed tt10 = t1+t2;

assignOUT=tt10+t3;

endmodule

页: [1]
查看完整版本: 有人能提供《基于FPGA的PID控制器的设计》的相关程序吗?感激不尽!