Engee 文档
Notebook

二进制逻辑

在这个例子中,我们探讨了使用Julia编程语言编写的方程及其在生成Verilog代码并验证此代码的模型中的实现来解决逻辑问题的二进制逻辑的应用。 示例本身及其实现在以下链接中进行了更详细的分析:https://engee.com/community/ru/catalogs/projects/binarnaia-logika ...

本演示的目的是使用一个简单的示例来展示生成器和代码优化的功能。

二元方程的描述

让我们设置我们的系统的状态,在这种情况下将是三个:
𝐴,𝐵和𝐶. 与此同时,条件
𝐴将随机确定:如果随机值为
𝑋大于0.5,则𝐴为true,否则为false。

我们的逻辑由以下等式定义:Z=((A和B)或(C和B))

In [ ]:
A = rand() > 0.5
println("A = $(A)")
B = false
C = true
println("B = $(B)")
println("C = $(C)")

Z = ((A && B) || (C && B))
println("Z = $(Z)")
A = false
B = false
C = true
Z = false

二进制逻辑建模和代码生成

In [ ]:
# Подключение вспомогательной функции запуска модели.
function run_model( name_model)
    
    Path = (@__DIR__) * "/" * name_model * ".engee"
    
    if name_model in [m.name for m in engee.get_all_models()] # Проверка условия загрузки модели в ядро
        model = engee.open( name_model ) # Открыть модель
        model_output = engee.run( model, verbose=true ); # Запустить модель
    else
        model = engee.load( Path, force=true ) # Загрузить модель
        model_output = engee.run( model, verbose=true ); # Запустить модель
        engee.close( name_model, force=true ); # Закрыть модель
    end
    sleep(0.1)
    return model_output
end

run_model("Logical_Operator") # Запуск модели.
Z_model = collect(Z_model).value[end]
println()
println("Z_model = $(Z_model)")
Building...
Progress 0%
Progress 100%
Progress 100%

Z_model = false

现在让我们从模型中生成代码并分析结果。

In [ ]:
engee.generate_code(
"$(@__DIR__)/Logical_Operator.engee",
"$(@__DIR__)/V_Code",
subsystem_name="Logical"
)
// Generated by CIRCT firtool-1.62.1
module Logical_Operator_Logical(
  input  clock,
         reset,
  output io_Out1
);

  assign io_Out1 = 1'h0;
endmodule

[ Info: Generated code and artifacts: /user/my_projects/Demo/Work/logical_operator/V_Code

结论

In [ ]:
open("$(@__DIR__)/V_Code/Logical_Operator_Logical.v", "r") do file
    for line in eachline(file)
        println(line)
    end
end
// Generated by CIRCT firtool-1.62.1
module Logical_Operator_Logical(
  input  clock,
         reset,
  output io_Out1
);

  assign io_Out1 = 1'h0;
endmodule

正如我们所看到的,代码优化器已经删除了除了输出值之外的所有逻辑。 这是因为我们已经明确地设置了常量的参数。 因此,代码内部的所有值都是静态的,因此从它们生成代码就FPGA消耗的资源而言不是最佳解决方案。 如果我们使用该块,我们将获得相同的效果 Terminator. 以该块结尾的模型解决方案的任何分支都将从最终生成的代码中丢弃。