Struct rust_hdl_widgets::tristate::TristateBuffer
source · pub struct TristateBuffer<D: Synth> {
pub bus: Signal<InOut, D>,
pub write_enable: Signal<In, Bit>,
pub write_data: Signal<In, D>,
pub read_data: Signal<Out, D>,
}
Expand description
Tristate Buffer
Most FPGAs do not support internal tristate logic. Instead, the compilers turn tristate logic into a combination of a pair of signals (one in, one out) and an enable line. However, the real world definitely needs tristate logic, and there are usually dedicated buffers on the FPGA that can drive a tristate line using a pin that is appropriately configured.
Most FPGA toolchains can infer the tristate buffer when it’s at the edge of the design. So when you need a tristate buffer, you can use this struct. Note that it is generic over the signals being tristated. So you can include a set of different tristate buffers with a single entity.
// An example of a simple tristate 8-bit bus
#[derive(LogicInterface, Default)]
struct EightBitBus {
bus: Signal<InOut, Bits<8>>,
}
Fields§
§bus: Signal<InOut, D>
The tristated signals come out of this pin. This should be a top level signal in your design.
write_enable: Signal<In, Bit>
When asserted (true), the bus will attempt to drive write_data
to the pins.
write_data: Signal<In, D>
The data to write to the bus. Ignored when write_enable
is not active (high).
read_data: Signal<Out, D>
The read back from the bus. When write_enable
is false, then this signal represents
the external signals driving the FPGA pins. For FPGA, this is likely equal to write_data
when write_enable
is true.
Trait Implementations§
source§impl<D: Synth> Block for TristateBuffer<D>
impl<D: Synth> Block for TristateBuffer<D>
source§fn connect_all(&mut self)
fn connect_all(&mut self)
source§fn update_all(&mut self)
fn update_all(&mut self)
source§fn has_changed(&self) -> bool
fn has_changed(&self) -> bool
true
if anything in the circuit has changed (outputs or internal state)