在电力电子变流器设备中,常常需要计算发电量,由于电力电子变流器设备一般是高频变流设备,所以发电量的计算几乎时实时功率的积分,此时就会用到一个积分模块。发电量计算的公式如下:Q=∫P。
FPGA由于其并行处理的运算方式,使其在电力电子领域的应用越来越广泛,有专家断言,DSP能做的事情,FPGA都可以做。
此外,MATLAB2016bb在图形化设计算法自动生成代码上做了大量优化,使算法开发的时间大大缩小,下面共享一个基于MATLAB2016b图形化设计自动生成Verilog语言的积分模块及其应用。
1 在MATLAB2016b中吗,模块的封装如下图所示。
接口定义如下:
Integration_Input_b20——需要积分的量,比如在电力电子变流设备中的有功功率P,单位位W,是一个20位宽的有符号数,范围[-2^(19),(2^19-1)];
Integration_En——积分使能信号,仅该位置1模块方进行积分运算。
UpLimit_b32 和 LowLimit_b32——积分上限与下限限制,位宽位32的有符号数。
Pulse_4096Hz——该脉冲频率是积分频率,即1s时间内积分4096次,则可以满足时时积分要求。
Point01kWH_b32——发电量单位:0.01度(1度=1kW*H)。
Point1kWH_b30——发电量单位:0.1度(1度=1kW*H)。
Ws_for0p01kWH_Cycle_b20——该位主要观察在0.01度的周期内来回显示时时电量,每0.01度就刷新一次。
2 在MATLAB2016b中吗,模块并行图形化设计如下图所示。
3 在MATLAB2016b中自动生成可应用的Verilog语言代码如下:
// ------------------------------------------------------------- // // File Name: F:\TongJingRen\Energy Production Calculation by TongJingRen\Simulation_Model_Base_Platform20180211\Energy_Production_Calculation_by_TongJingRen.v // Created: 2018-02-27 11:32:09 // // Generated by MATLAB 9.1 and HDL Coder 3.9 // // // -- ------------------------------------------------------------- // -- Rate and Clocking Details // -- ------------------------------------------------------------- // Model base rate: 6.4e-07 // Target subsystem base rate: 6.4e-07 // // ------------------------------------------------------------- // ------------------------------------------------------------- // // Module: Energy_Production_Calculation_by_TongJingRen // Source Path: Simulation_Model_Base_Platform20180211/Energy Production Calculation by TongJingRen // Hierarchy Level: 0 // // ------------------------------------------------------------- `timescale 1 ns / 1 ns module Energy_Production_Calculation_by_TongJingRen ( g_clk, Rst_n, Integration_Input_b20, Integration_En, UpLimit_b32, LowLimit_b32, Pulse_4096Hz, Point01kWH_b32, Point1kWH_b30, Ws_for0p01kWH_Cycle_b20 ); input g_clk; input Rst_n; input signed [19:0] Integration_Input_b20; // sfix20 input Integration_En; input signed [31:0] UpLimit_b32; // int32 input signed [31:0] LowLimit_b32; // int32 input Pulse_4096Hz; output signed [31:0] Point01kWH_b32; // int32 output signed [29:0] Point1kWH_b30; // sfix30 output signed [19:0] Ws_for0p01kWH_Cycle_b20; // sfix20 wire OR4_out1; wire switch_compare_1; wire signed [19:0] Switch43_out1; // sfix20 reg signed [31:0] Unit_Delay1_out1; // int32 wire signed [31:0] Switch28_out1; // int32 wire signed [31:0] Switch1_out1; // int32 wire Relational_Operator2_relop1; wire signed [31:0] Switch4_out1; // int32 wire signed [31:0] Add8_1; // sfix32 wire signed [31:0] Add8_out1; // int32 wire RO13_relop1; wire signed [31:0] Switch41_out1; // int32 wire RO14_relop1; wire signed [31:0] Switch42_out1; // int32 wire [19:0] Bit_Slice9_out1; // ufix20 wire signed [19:0] Data_Type_S6_out1; // sfix20 wire CT1_out1; wire signed [19:0] Switch2_out1; // sfix20 reg signed [19:0] Unit_Delay4_out1; // sfix20 reg signed [31:0] Unit_Delay3_out1; // int32 wire signed [31:0] Add1_out1; // int32 wire signed [31:0] Switch3_out1; // int32 wire signed [40:0] Divide_out1; // sfix41 wire [29:0] Bit_Slice1_out1; // ufix30 wire signed [29:0] Data_Type_S1_out1; // sfix30 assign OR4_out1 = Integration_En & Pulse_4096Hz; assign switch_compare_1 = OR4_out1 > 1'b0; assign Switch43_out1 = (switch_compare_1 == 1'b0 ? 20'sb00000000000000000000 : Integration_Input_b20); assign Switch1_out1 = (Integration_En == 1'b0 ? Unit_Delay1_out1 : Switch28_out1); always @(posedge g_clk) begin : Unit_Delay1_process if (Rst_n == 1'b0) begin Unit_Delay1_out1 <= 32'sb00000000000000000000000000000000; end else begin Unit_Delay1_out1 <= Switch1_out1; end end assign Switch4_out1 = (Relational_Operator2_relop1 == 1'b0 ? Unit_Delay1_out1 : 32'sb00000000000000000000000000000000); assign Add8_1 = {{12{Switch43_out1[19]}}, Switch43_out1}; assign Add8_out1 = Add8_1 + Switch4_out1; assign RO13_relop1 = Add8_out1 > UpLimit_b32; assign Switch41_out1 = (RO13_relop1 == 1'b0 ? Add8_out1 : UpLimit_b32); assign RO14_relop1 = Switch41_out1 < LowLimit_b32; assign Switch42_out1 = (RO14_relop1 == 1'b0 ? Switch41_out1 : LowLimit_b32); assign Switch28_out1 = (Integration_En == 1'b0 ? 32'sb00000000000000000000000000000000 : Switch42_out1); assign Bit_Slice9_out1 = Switch28_out1[31:12]; assign Data_Type_S6_out1 = Bit_Slice9_out1; assign CT1_out1 = Data_Type_S6_out1 >= 20'sb00001000110010100000; assign Switch2_out1 = (CT1_out1 == 1'b0 ? Data_Type_S6_out1 : 20'sb00001000110010100000); always @(posedge g_clk) begin : Unit_Delay4_process if (Rst_n == 1'b0) begin Unit_Delay4_out1 <= 20'sb00000000000000000000; end else begin Unit_Delay4_out1 <= Switch2_out1; end end assign Relational_Operator2_relop1 = Unit_Delay4_out1 >= 20'sb00001000110010100000; assign Add1_out1 = 32'sb00000000000000000000000000000001 + Unit_Delay3_out1; assign Switch3_out1 = (Relational_Operator2_relop1 == 1'b0 ? Unit_Delay3_out1 : Add1_out1); always @(posedge g_clk) begin : Unit_Delay3_process if (Rst_n == 1'b0) begin Unit_Delay3_out1 <= 32'sb00000000000000000000000000000000; end else begin Unit_Delay3_out1 <= Switch3_out1; end end assign Point01kWH_b32 = Unit_Delay3_out1; assign Divide_out1 = Unit_Delay3_out1 * 9'sb011001101; assign Bit_Slice1_out1 = Divide_out1[40:11]; assign Data_Type_S1_out1 = Bit_Slice1_out1; assign Point1kWH_b30 = Data_Type_S1_out1; assign Ws_for0p01kWH_Cycle_b20 = Data_Type_S6_out1; endmodule // Energy_Production_Calculation_by_TongJingRen