CPU-FPGA間のバス接続 #
CPUからFPGAのレジスタを読み書きする場合を考える。
外部接続バス #
CPUの外部バスタイミングは下記の通り(RA6M3のデータシートから抜粋)。
Parameter | Symbol | Min | Max | Unit |
---|---|---|---|---|
Address delay | tAD | - | 12.5 | ns |
CS delay | tCSD | - | 12.5 | ns |
RDn delay | tRSD | - | 12.5 | ns |
Read data setup time | tRDS | 12.5 | - | ns |
Read data hold time | tRDH | 0 | - | ns |
WRn delay | tWRD | - | 12.5 | ns |
Write data delay | tWDD | - | 12.5 | ns |
Write data hold time | tWDH | 0 | - | ns |
見ての通り、CPUから出力される信号はクロックの立ち上がりと同期しているので、FPGA側の設計は簡単です。wrがhighになっているときにdataをclkでラッチしてあげれば良い。このタイミングだと2回ラッチすることになるが、問題にならないことが多いだろう。
|
|
タイミング制約は下記の通り。正確にはdata_outも制約する必要があるが、十分余裕があるので通常不要だろう。
#**************************************************************
# Create Clock
#**************************************************************
create_clock -name {clk} -period 16.666 -waveform { 0.000 8.333 } [get_ports clk]
create_clock -name {vclk} -period 16.666 -waveform { 0.000 8.333 }
#**************************************************************
# Set Input Delay
#**************************************************************
set_input_delay -add_delay -max -clock [get_clocks {vclk}] 12.500 [get_ports {address[*]}]
set_input_delay -add_delay -max -clock [get_clocks {vclk}] 12.500 [get_ports {ce}]
set_input_delay -add_delay -max -clock [get_clocks {vclk}] 12.500 [get_ports {data_in[*]}]
set_input_delay -add_delay -max -clock [get_clocks {vclk}] 12.500 [get_ports {rd}]
set_input_delay -add_delay -max -clock [get_clocks {vclk}] 12.500 [get_ports {wr}]
set_input_delay -add_delay -min -clock [get_clocks {vclk}] 0 [get_ports {address[*]}]
set_input_delay -add_delay -min -clock [get_clocks {vclk}] 0 [get_ports {ce}]
set_input_delay -add_delay -min -clock [get_clocks {vclk}] 0 [get_ports {data_in[*]}]
set_input_delay -add_delay -min -clock [get_clocks {vclk}] 0 [get_ports {rd}]
set_input_delay -add_delay -min -clock [get_clocks {vclk}] 0 [get_ports {wr}]
#**************************************************************
# Set False Path
#**************************************************************
set_false_path -from [get_ports {reset}]
set_false_path -to [get_ports {data_out[*]}]