🍒 Cherry Syn チュートリアル 第6章

ポート入出力の属性

🔒 ラッチ入出力

process process1(clkin uint#1 clk, rstin uint#1 rst, out uint#8 latch x)
{
    ...
    x = 100;
    while (1);
}

ポート入出力は、記述されたタイミングで直接入出力されます。
latch 属性を付けると、入力の場合は1クロック前の値がラッチされて入力され、出力の場合はラッチされて1クロック後に出力されます。
入出力がバタつくと困る場合は、ラッチを使うと安定します。

🔀 トライステート出力

process process1(clkin uint#1 clk, rstin uint#1 rst, out uint#8 tristate x)
{
    ...
    x = 100;
    while (1);
}

tristate 属性を付けると、出力が発生したタイミングで値が出力され、それ以外のタイミングではハイ・インピーダンスになります。
latch でも tristate でもない場合、その他のタイミングでの出力値は未定(でたらめ)になります。

🔽 プルアップ・プルダウン

process process1(clkin uint#1 clk, rstin uint#1 rst, in uint#8 pulldown x)
{
    ... = x;
    while (1);
}

入力ポートに pulluppulldown 属性を付けることで、回路上での電位を安定させることができます。

📶 入出力のイネーブル信号

入出力が発生したタイミングを検出したい場合は、en 属性を使います。

process process1(clkin uint#1 clk, rstin uint#1 rst, out uint#8 en x)
{
    x = 100;
    while (1);
}

この記述を高位合成すると、以下のような Verilog が生成されます:

module PROCESS1 (
    input wire  CLK,
    input wire  RST,
    output wire [7:0] X,
    output wire       X_EN);

X_EN は、X に出力が発生したタイミングで1になり、それ以外は0になります。

🔗 トップレベルでのイネーブル信号の接続

process process2(clkin uint#1 clk, rstin uint#1 rst, in uint#1 x_en, in uint#8 x)
{
    ...
}

toplevel logicboy(in uint#1 clk, in uint#1 rst, ...)
{
    com uint#8 en x;

    process1(clk, rst, x);
    process2(clk, rst, x en, x, ...);
}

トップレベルで com 信号を宣言する際にも en を付けます。
実際の回路では、x に対して 8ビットの信号線と 1ビットのイネーブル信号が生成されます。

x en はイネーブル信号(1ビット)、x はデータ信号(8ビット)を表します。
process2 はこれら両方を参照します。

同様に、入力ポートに対しても、入力が発生したタイミングで1になるイネーブル信号を生成することができます。

それでは皆さん、また次回お会いしましょう!