pub struct SyncSender<T: Synth> {
    pub sig_in: Signal<In, T>,
    pub clock: Signal<In, Clock>,
    pub sig_cross: Signal<Out, T>,
    pub flag_out: Signal<Out, Bit>,
    pub ack_in: Signal<In, Bit>,
    pub busy: Signal<Out, Bit>,
    pub send: Signal<In, Bit>,
    /* private fields */
}
Expand description

When you need to send many bits between two clock domains, it is risky to use a vector of BitSynchronizer structs. That is because, you cannot guarantee at any given moment that all of the bits of your multi-bit signal will cross into the new clock domain at once. So to synchronize a multi-bit signal, use a SyncSender and SyncReceiver pair. These widgets will use a set of handshake signals to move a value from one clock domain to another safely. Note that while the state machine is executing, the synchronizer will indicate it is busy. Crossing clock domains with greater ease is best done with an [AsynchronousFIFO].

Fields§

§sig_in: Signal<In, T>

The input signal to synchronize across clock domains

§clock: Signal<In, Clock>

The input signals are assumed to be synchronous to this clock

§sig_cross: Signal<Out, T>

These are the wires used to send signals to the SyncReceiver.

§flag_out: Signal<Out, Bit>

A protocol flag signal indicating that data is ready to be transferred to the second clock doamin.

§ack_in: Signal<In, Bit>

A protocol flag signal indicating that the data has been transferred to the second clock domain.

§busy: Signal<Out, Bit>

A signal indicating that the SyncSender is busy transferring data to the second clock domain.

§send: Signal<In, Bit>

A protocol signal - raise this high for one cycle to latch [sig_in].

Trait Implementations§

source§

impl<T: Synth> Block for SyncSender<T>

source§

fn connect_all(&mut self)

Connects the internal signals of the circuit - used to initialize the circuit
source§

fn update_all(&mut self)

Propogate changes from inputs to outputs within the circuit
source§

fn has_changed(&self) -> bool

Returns true if anything in the circuit has changed (outputs or internal state)
source§

fn accept(&self, name: &str, probe: &mut dyn Probe)

The visitor pattern - allows a circuit to be probed by a Probe struct.
source§

impl<T: Default + Synth> Default for SyncSender<T>

source§

fn default() -> SyncSender<T>

Returns the “default value” for a type. Read more
source§

impl<T: Synth> Logic for SyncSender<T>

source§

fn update(&mut self)

source§

fn connect(&mut self)

source§

fn hdl(&self) -> Verilog

source§

fn timing(&self) -> Vec<TimingInfo, Global>

Auto Trait Implementations§

§

impl<T> RefUnwindSafe for SyncSender<T>where T: RefUnwindSafe,

§

impl<T> Send for SyncSender<T>where T: Send,

§

impl<T> Sync for SyncSender<T>where T: Sync,

§

impl<T> Unpin for SyncSender<T>where T: Unpin,

§

impl<T> UnwindSafe for SyncSender<T>where T: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> Pointable for T

§

const ALIGN: usize = mem::align_of::<T>()

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.