二进制逻辑¶
在本示例中,我们将研究二进制逻辑在解决逻辑问题中的应用,使用 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)")
二进制逻辑建模和代码生成¶
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)")
现在,让我们根据模型生成代码并分析结果。
In [ ]:
engee.generate_code(
"$(@__DIR__)/Logical_Operator.engee",
"$(@__DIR__)/V_Code",
subsystem_name="Logical"
)
输出结果¶
In [ ]:
open("$(@__DIR__)/V_Code/Logical_Operator_Logical.v", "r") do file
for line in eachline(file)
println(line)
end
end
我们可以看到,代码优化器已经删除了除输出值之外的所有逻辑。这是因为我们明确设置了常量参数。因此,代码中的所有值都是静态的,所以从 FPGA 资源的角度来看,从这些值生成代码并不是最佳解决方案。如果我们使用块Terminator
,也会得到同样的效果。在最终生成的代码中,任何以该代码块结尾的模型解决方案分支都将被舍弃。