Engee 文档
Notebook

从模型生成Verilog代码

此示例使用以下演示中的模型<https://engee.com/helpcenter/stable/ru/interactive-scripts/base_simulation/PID_fixed.html >,并且考虑到其中使用了定点数据类型,我们可以负担得起用Verilog语言从中生成代码。 我们将从PID控制器块生成代码。
image_2.png

现在我们将从这个模型中生成Verilog语言的代码。 为此,我们将在代码生成器的程序控制函数中设置属性 target="verilog".

Verilog是一种硬件描述语言(HDL),用于设计和建模数字系统,如FPGA和ASIC电路。 它允许您在寄存器和逻辑级别描述数字电路的结构和行为,这使其成为硬件工程师的基本工具。 Verilog支持并行过程的仿真,这对于具有大量同时元件的电路至关重要。
Verilog的主要应用如下。

  1. FPGA和ASIC设计:Verilog允许您描述复杂的数字系统,然后可以在Fpga或集成电路上合成为物理电路。

  2. 仿真和验证:Verilog提供仿真功能,允许您在硬件上实现电路之前测试和调试电路。

  3. 开发自动化:合成器将Verilog代码转换为优化的逻辑电路,从而简化了创建和测试硬件组件的过程。

Verilog用于需要高速数据处理和可靠并行执行的项目。

In [ ]:
engee.generate_code("$(@__DIR__)/pid_fixed.engee", "$(@__DIR__)/verilog"; subsystem_name="SubSystem", target="verilog")
[ Info: Generated code and artifacts: /user/my_projects/Demo/Work/verilog/verilog

现在让我们分析一下结果。

image.png

正如我们所看到的,代码已经成功生成,可以在进一步的开发中应用,代码本身如下所示。

module pid_fixed_SubSystem(
  input         clock,
                reset,
  input  [15:0] io_setpoint,
                io_feedback,
  output [15:0] io_command
);

  reg  [15:0] UnitDelay_state;
  wire [15:0] _AddAccum_T = io_setpoint - io_feedback;
  wire [28:0] _Gain_2_new_T_1 = {{13{_AddAccum_T[15]}}, _AddAccum_T} * 29'hA4;
  wire [29:0] _Gain_new_T_1 = {{14{_AddAccum_T[15]}}, _AddAccum_T} * 30'h6000;
  wire [15:0] _Add_1Accum_T = {_Gain_2_new_T_1[28:14], 1'h0} + UnitDelay_state;
  always @(posedge clock) begin
    if (reset)
      UnitDelay_state <= 16'h0;
    else
      UnitDelay_state <= _Add_1Accum_T;
  end // always @(posedge)
  assign io_command = _Gain_new_T_1[29:14] + {_Add_1Accum_T[15], _Add_1Accum_T[15:1]};
endmodule

结论

在这个例子中,我们研究了在Engee中生成代码的可能性,并向您展示了如何将此工具用于您的项目。