详细说明:PID如何通过VHDL语言来实现,前来看看那这个文件吧

详细说明:PID如何通过VHDL语言来实现,前来看看那这个文件吧,第1张

当采用FPGA产生PWM波形时,只需FPGA内部资源就可以实现,数字比较器的一端接设定值输出,另一端接线性递增计数器输出。当线性计数器的计数值小于设定值时输出低电平,当计数器大于设定值时输出高电平,这样[fuzzy_inference.rar] -vhdl模糊PID控制器模糊推理,推理结果:直接用经验值输出。[A_real-time_adaptive_PID_controller_step_motor.rar] - 传统PID控制器通常难以满足多变量、非线性、强耦合的步进电机动态响应和精确调速要求,结合传统PID控制和模糊控制及遗传算法(GA)整定PID参数的优点,设计基于模糊遗传算法的实时自适应步进电动机PID控制器,充分发挥传统和智能控制策略各自的优势。仿真结果表明,该实时自适应步进电动机PID[Fuzzy_PID_Control_of_Stepping_Motor.rar] - 摘要:由于步进电动机调速系统具有非线性等特点,使得利用简单模糊控制与传统PID控制精度不高,因此文中提出利用模糊PID控制器实现对步进电动机调速系统进行控制的方法,并设计了模糊PID控制器。文中首先建立了步进电动机的数学模型,并根据数学模型推导了其传递函数 然后介绍了模糊PID控制器结构,以[pid_controler_latest.tar.gz] - PID控制器的verilog实现,做闭环控制器的人可以参考[fuzzy_inference.rar] -vhdl模糊PID控制器模糊推理,推理结果:直接用经验值输出。[FPGA-Based_PID_Controller_Implementation.rar] - this paper describes implementation of PID controller on FPGA platform usingvhdl.[tec_control_pgfa.rar] - 使用fpga基于积分分离的pid算法进行温控的程序,经实验证明很稳定[PIDcontrolbook2.rar] - 微分器:利用数字锁相环进行位同步信号提取的关键模块

举个简单点的例子,如下。

设计一个4bit的计数器,在记到最大值时输出一个信号

module counter_16 ( input clk, input rst_n, input cnt_in ,output reg cnt_out )

reg [3:0] cnt

always @ (posedge clk or negedge rst_n) begin

if (~rst_n)  cnt <= 4'b0

else if (cnt_in) cnt <= cnt +1'b1

else cnt <= cnt

end

always @ (posedge clk or negedge rst_n) begin

if (~rst_n) cnt_out <= 1'b0

else if (cnt_in &&cnt == 4'b1111) cnt_out <= 1'b1

else cnt_out <= 1'b0

end

endmodule

这实际上设计了一个16进制计数器其中的一位,你可以例化多个相同模块,将低位的cnt_out连接到高位的cnt_in,级联成一个任意位数的16进制计数器。

给你写一个例子,下面是一个设计文件和一个对应的测试程序,希望能起到抛砖引玉的和用:

/*

File Name : test.v

Author: www.flxc.net

Data : 2010-10-14 20:20:52

Description : This module is to shift the 32 bit input data with clock edges.

*/

`timescale 1ns/1ns

`define period 10

module test(

clk,

rst_n,

data_i,

data_o

)

input clk

input rst_n

input [31:0] data_i

output [31:0] data_o

reg [31:0] data_o

always@(posedge clk or negedge rst_n)

beg

if(!rst_n)

data_o <= 32'b0

else

data_o <= data_i >>1

end

endmodule

module test_tb

reg clk

reg rst_n

reg [31:0] data_i

wire [31:0] data_o

initial

begin

clk=1'b1

rst_n=1'b1

data_i=32'b1010_1111_1000_1111_1111_0000_0001_0000

#(`period/3)

rst_n=1'b0

#(`period/3)

rst_n=1'b1

#100000000

$stop

end

always #(`period/2) clk=~clk

endmodule


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11260581.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存