UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

AR# 11658

5.1i XST - 複数のレジスタ付きトライステート出力を IOB に挿入する方法

説明

キーワード : XST, IOB, 3-state, 3state, tristate, tri, state, tri-state, enable, keep, merge, duplicate, register, multiple, bus, トライステート, イネーブル, 結合, 複製, レジスタ, 複数, バス

重要度 : 標準

概要 :
フリップフロップのバスをデバイスの IOB に配置する必要があります。 これらのフリップフロップの出力はトライステートにし、トライステート バッファのイネーブル信号はレジスタを介する必要があります。

レジスタを介するイネーブル信号にバス 1 つが使用されると、1 つを除くすべてのイネーブル フリップフロップが最適化により削除されてしまいます。 最後のフリップフロップの出力ロードが 1 でなくなってしまったため、IOB 内に配置することができません。 どうすればよいですか。

ソリューション

イネーブル信号用にフリップフロップのバスを作成するのではなく、フリップフロップを 1 つ作成して IOB 属性を設定します。 次に合成プロパティのレジスタ/ラッチを IOB に挿入するオプションをアクティブにします。これによりフリップフロップが複製され、IOB 内に配置されます。

合成プロパティをアクティブにして、フリップフロップを自動的に IOB に挿入するには、次の手順に従ってください。

1. Project Navigator のプロセス ウィンドウで [Synthesize] をハイライトします。
2. [Synthesis] を右クリックし、[プロパティ] をクリックします。
3. [Xilinx Specific Options] タブをクリックします。
4. [Pack I/O Registers into IOBs] を [Auto] (デフォルト) または [Yes] にします。

次のコードは、レジスタにより出力がトライステートになっている 8 ビット幅のバスを示しています。

メモ : トライステート バッファのイネーブル ラインはアクティブ Low である必要があります。

VHDL :

library ieee;
use ieee.std_logic_1164.all;

entity tri_iob is
port(CLK, SEL : in std_logic;
DI : in std_logic_vector (7 downto 0);
DO : out std_logic_vector (7 downto 0));
end tri_iob;

architecture arch_tri_iob of tri_iob is
signal tmp1: std_logic_vector(7 downto 0);
signal tmp2: std_logic;
signal inp_ffs: std_logic_vector(7 downto 0);

attribute IOB : string;
attribute IOB of tmp2 : signal is "true";

begin
process (CLK)
begin
if (CLK'event and CLK='1') then
inp_ffs<=DI;
tmp1<=inp_ffs;
end if;
end process;

process (CLK)
begin
if (CLK'event and CLK='1') then
tmp2<=SEL;
end if;
end process;

DO <= tmp1 when tmp2='0' else (others=>'Z');

end arch_tri_iob;


Verilog :

module tri_iob (clk, sel, di, do);

input clk, sel;
input [7:0] di;
output [7:0] do;

reg [7:0] tmp1, inp_ffs;
reg tmp2;

//synthesis attribute IOB tmp2 "true"

always @(posedge clk) begin
inp_ffs <= di;
tmp1 <= inp_ffs;
end

always @(posedge clk) tmp2 <= sel;

assign do = tmp2 ? 8'bz : tmp1;

endmodule
AR# 11658
日付 04/20/2007
ステータス アーカイブ
種類 一般
このページをブックマークに追加