概要
ビジュアルプログラミングで組み合わせ回路を組み立てて、シュミレーションして、verilogを生成します。
高位合成です。
実装編
ビジュアルプログラミングした組み合わせ回路
生成されたverilog
module x(input In0, input In1, output Out0);
assign Out0 = (In1 ^ In0);
endmodule
成果物
Toggle Buttonをクリックして、シュミレーションできます。
verilogを生成します。
サンプルコード
function make(s) {
var i;
var j;
var res = "";
var ins = [];
var outs = [];
var divs = [];
var ass = [];
var json = JSON.parse(s);
var koko = document.getElementById("koko");
for (i = 0; i < json.devices.length; i++)
{
if (json.devices[i].type == "In")
{
ins.push({
id: json.devices[i].id,
label: json.devices[i].label
});
}
}
for (i = 0; i < json.devices.length; i++)
{
if (json.devices[i].type == "Out")
{
outs.push({
id: json.devices[i].id,
label: json.devices[i].label
});
}
}
for (i = 0; i < json.devices.length; i++)
{
if (json.devices[i].type == "XOR" || json.devices[i].type == "NAND")
{
divs.push({
id: json.devices[i].id,
type: json.devices[i].type
});
}
}
res += "module x(";
if (ins.length == 2)
{
res += "input " + ins[0].label + ", ";
res += "input " + ins[1].label + ", ";
}
if (outs.length == 1)
{
res += "output " + outs[0].label + ");\n";
}
if (divs.length == 1)
{
res += "\tassign ";
for (i = 0; i < json.connectors.length; i++)
{
if (json.connectors[i].to == divs[0].id + ".out0")
{
for (j = 0; j < json.devices.length; j++)
{
if (json.devices[j].id + ".in0" == json.connectors[i].from)
{
res += json.devices[j].label + " = (";
}
}
}
}
for (i = 0; i < json.connectors.length; i++)
{
if (json.connectors[i].from == divs[0].id + ".in0")
{
for (j = 0; j < json.devices.length; j++)
{
if (json.devices[j].id + ".out0" == json.connectors[i].to)
{
res += json.devices[j].label + " ";
}
}
}
}
if (divs[0].type == "XOR")
{
res += " ^ ";
}
if (divs[0].type == "AND")
{
res += " & ";
}
if (divs[0].type == "OR")
{
res += " | ";
}
if (divs[0].type == "NAND")
{
res += " ~& ";
}
if (divs[0].type == "NOR")
{
res += " ~| ";
}
if (divs[0].type == "NOT")
{
res += " ~ ";
}
if (divs[0].type == "XNOR")
{
res += " ~^ ";
}
for (i = 0; i < json.connectors.length; i++)
{
if (json.connectors[i].from == divs[0].id + ".in1")
{
for (j = 0; j < json.devices.length; j++)
{
if (json.devices[j].id + ".out0" == json.connectors[i].to)
{
res += json.devices[j].label + ");\n";
}
}
}
}
}
res += "endmodule";
koko.value = res;
}
以上。