集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1098|回复: 3

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

[复制链接]
wuyuhua 发表于 2014-5-5 11:21:15 | 显示全部楼层 |阅读模式
有人能提供《基于FPGA的PID控制器的设计》的程序吗?感激不尽!  
小梅哥 发表于 2014-5-6 13:12:38 | 显示全部楼层
再给你来一个版本的,因为本人没有用过,所以也没做实际的验证,如果你验证后证明可行,请回复,以方便大家。
  1. module PID_ctrlplus (kt,T,K,L,U);
  2.     input  kt,T,K,L;
  3.     output U;
  4.     reg  [15:0] U;
  5.     wire [15:0] kt;
  6.     wire [15:0] T,K,L;
  7.     reg [15:0] U1,U2,U3,U4,U5,U6,U7,U8,U9;
  8.    
  9.     parameter Ts=0.0002;
  10.     always @ (kt or T or K or L)
  11.     begin
  12.      U1=12*T*kt*Ts;//10
  13.      U2=3*T*Ts*Ts*kt*(kt+1);
  14.      U3=6*T;
  15.      U4=K*L;
  16.      U5=K*L*L;
  17.      U6=U1/U4;
  18.      U7=U2/U5;
  19.      U8=U3/K;
  20.      U9=U6+U7+U8;
  21.      U=U9/10;
  22. end
  23. endmodule




  24. module te_pid_ctrl;
  25.     reg [15:0] kt;
  26.     reg [15:0] T,K,L;
  27.     wire[15:0] U;
  28.     PID_ctrlplus CGX(kt,T,K,L,U);
  29.     reg clk;
  30.     initial
  31.     begin
  32.     clk<=0;
  33.     kt<=50;
  34. end
  35.     always
  36.     begin
  37.     #1000
  38.     clk<=~clk;
  39. end
  40. always @ (posedge clk)
  41.     begin
  42.      T<=2000;
  43.      K<=5;
  44.      L<=2;
  45.      #20
  46.     if(kt<100)
  47.     kt=kt+1;
  48.     else
  49.    kt<=50;
  50. end
  51. endmodule
复制代码
回复 支持 0 反对 1

使用道具 举报

小梅哥 发表于 2014-5-6 13:09:01 | 显示全部楼层
这个是在网上下载的,基于Verilog。希望能对你有所帮助
小梅哥 发表于 2014-5-6 13:09:27 | 显示全部楼层
  1. //############################################################################
  2. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3. //   (C) Copyright Laboratory System Integration and Silicon Implementation
  4. //   All Right Reserved
  5. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  6. //
  7. //   ICLAB 2011 Spring
  8. //   Lab02      : PID
  9. //   Author     : Ju-Hung Hsiao (ju0909@si2lab.org)
  10. //
  11. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  12. //
  13. //   File Name   : PID.v
  14. //   Module Name : PID
  15. //   Release version : V1.0 (Release Date: 2011-03)
  16. //
  17. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  18. //############################################################################


  19. module PID(//input
  20.            MODE,
  21.            IN_A,
  22.            IN_B,
  23.            IN_C,
  24.            IN_D,
  25.            IN_X1,
  26.            IN_X2,
  27.            SHIFT,
  28.            //output
  29.            OUT);
  30.            
  31. input  MODE;
  32. input  [ 4:0] IN_A, IN_B, IN_C, IN_D;
  33. input  [ 4:0] IN_X1, IN_X2;
  34. input  [ 4:0] SHIFT;
  35. output [31:0] OUT;


  36. wire signed  [4:0]  A, B, C, D;
  37. wire signed  [4:0]  X1, X2;

  38. assign A = IN_A;
  39. assign B = IN_B;
  40. assign C = IN_C;
  41. assign D = IN_D;
  42. assign X1 = IN_X1;
  43. assign X2 = IN_X2;

  44. //----------------------------Basic Coefficient-----------------------------//
  45. wire signed [9:0] temp2=X2*X2;
  46. wire signed [19:0] temp4=temp2*temp2;

  47. wire signed [9:0] tp2=X1*X1;
  48. wire signed [19:0] tp4=tp2*tp2;

  49. //need to plus one bit to avoid subtraction overflow

  50. wire signed [20:0] temp41=temp4-tp4;
  51. wire signed [10:0]  temp21=temp2-tp2;
  52. wire signed [5:0]  temp11=X2-X1;

  53. //1.ten instead of eight bit to be more convinient use later
  54. //2.division and multiply with small number will be mapped to shift and add automatically
  55. wire signed [10:0] temp4A = (A<<<4)/4;//use shift??
  56. wire signed [10:0] temp4B = (B<<<4)/4;
  57. wire signed [10:0] temp4C = (C<<<4)/4;
  58. wire signed [10:0] temp4D = (D<<<4)/4;
  59.             
  60. wire signed [10:0] temp2A = (A<<<4)/2;
  61. wire signed [10:0] temp2B = (B<<<4)/2;
  62. wire signed [10:0] temp2C = (C<<<4)/2;
  63. wire signed [10:0] temp2D = (D<<<4)/2;

  64. wire signed [6:0] temp33A = 3*A;
  65. wire signed [6:0] temp33B = 3*B;
  66. wire signed [6:0] temp33C = 3*C;
  67. wire signed [6:0] temp33D = 3*D;

  68. wire signed [5:0] temp22A = 2*A;
  69. wire signed [5:0] temp22B = 2*B;
  70. wire signed [5:0] temp22C = 2*C;
  71. wire signed [5:0] temp22D = 2*D;

  72. //----------------------------Multiplexer Part-----------------------------//

  73. wire signed [10:0] FIRST=({SHIFT[1:0],MODE}==3'b000)?temp4A:
  74.                                         ({SHIFT[1:0],MODE}==3'b010)?temp4B:
  75.                                     ({SHIFT[1:0],MODE}==3'b100)?temp4C:
  76.                                     ({SHIFT[1:0],MODE}==3'b110)?temp4D:
  77.                                                 ({SHIFT[1:0],MODE}==3'b001)?{temp33A,4'b0000}:
  78.                                                 ({SHIFT[1:0],MODE}==3'b011)?{temp33B,4'b0000}:
  79.                                                 ({SHIFT[1:0],MODE}==3'b101)?{temp33C,4'b0000}:
  80.                                                                                                     {temp33D,4'b0000};                                       
  81.                                                
  82.                           
  83. wire signed [10:0] SECOND=({SHIFT[1:0],MODE}==3'b000)?temp2C:
  84.                          ({SHIFT[1:0],MODE}==3'b010)?temp2D:
  85.                          ({SHIFT[1:0],MODE}==3'b100)?temp2A:
  86.                          ({SHIFT[1:0],MODE}==3'b110)?temp2B:
  87.                          ({SHIFT[1:0],MODE}==3'b001)?{temp22B[5],temp22B,4'b0000}:
  88.                          ({SHIFT[1:0],MODE}==3'b011)?{temp22C[5],temp22C,4'b0000}:
  89.                          ({SHIFT[1:0],MODE}==3'b101)?{temp22D[5],temp22D,4'b0000}:
  90.                                                                                   {temp22A[5],temp22A,4'b0000};

  91. wire signed [4:0] THIRD=({SHIFT[1:0],MODE}==3'b000)?D:
  92.                                     ({SHIFT[1:0],MODE}==3'b010)?A:
  93.                                     ({SHIFT[1:0],MODE}==3'b100)?B:
  94.                                     ({SHIFT[1:0],MODE}==3'b110)?C:
  95.                                 ({SHIFT[1:0],MODE}==3'b001)?C:
  96.                         ({SHIFT[1:0],MODE}==3'b011)?D:
  97.                                 ({SHIFT[1:0],MODE}==3'b101)?A:
  98.                                                                                 B;
  99.                                                                                                        
  100. wire signed [20:0] EL1  =(MODE)?{{11{temp2[9]}},temp2}:temp41;
  101. wire signed [10:0] EL2  =(MODE)?{{6{X2[4]}},X2}:temp21;
  102. wire signed [5:0]  EL3  =(MODE)?5'b00001:temp11;
  103.                                                                                                                             
  104. //1.Over 4 bit to shift
  105. //----------------------------Calculate Part-----------------------------//
  106. wire signed [31:0] t1 = ({{25{FIRST[10]}},FIRST}*{{{11{EL1[20]}},EL1},4'b0000})>>>4;
  107. wire signed [31:0] t2 = ({{25{SECOND[10]}},SECOND}*{{{21{EL2[10]}},EL2},4'b0000})>>>4;
  108. wire signed [31:0] t3 = ({{{27{THIRD[4]}},THIRD},4'b0000}*{{{26{EL3[5]}},EL3},4'b0000})>>>4;
  109.                                                
  110. wire signed [31:0] tt10 = t1+t2;

  111. assign  OUT=tt10+t3;

  112. endmodule

复制代码
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-6-21 20:43 , Processed in 0.125851 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表