Engee 文档
Notebook

二进制逻辑

在本示例中,我们将研究二进制逻辑在解决逻辑问题中的应用,使用 Julia 编程语言编写的方程,以及在 Verilog 代码生成和验证该代码的模型中的实现。该示例及其实现的更多详情,请访问以下链接:https://engee.com/community/ru/catalogs/projects/binarnaia-logika。

本演示的目的是在一个简单的例子中展示生成器和代码优化的可能性。

二元方程描述

让我们指定系统的状态,在本例中将有三种: 𝐴、𝐵 和 𝐶。在这种情况下,状态 𝐴将随机确定:如果一个随机值为 𝑋 大于 0.5,则 𝐴 为真,否则为假。

我们的逻辑由以下等式定义: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 ,也会得到同样的效果。在最终生成的代码中,任何以该代码块结尾的模型解决方案分支都将被舍弃。

示例中使用的块