1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
use crate::core::prelude::*;
use crate::hls::bus::{FIFOReadResponder, SoCPortResponder};
use crate::hls::fifo::SyncFIFO;
use crate::hls::mosi_port::MOSIPort;
#[derive(LogicBlock, Default)]
pub struct MOSIFIFOPort<const W: usize, const N: usize, const NP1: usize, const BLOCK: u32> {
pub bus: SoCPortResponder<W>,
port: MOSIPort<W>,
fifo: SyncFIFO<Bits<W>, N, NP1, BLOCK>,
pub fifo_bus: FIFOReadResponder<Bits<W>>,
}
impl<const W: usize, const N: usize, const NP1: usize, const BLOCK: u32> Logic
for MOSIFIFOPort<W, N, NP1, BLOCK>
{
#[hdl_gen]
fn update(&mut self) {
SoCPortResponder::<W>::link(&mut self.bus, &mut self.port.bus);
self.fifo.clock.next = self.bus.clock.val();
self.fifo.bus_write.data.next = self.port.port_out.val();
self.fifo.bus_write.write.next = self.port.strobe_out.val();
self.port.ready.next = !self.fifo.bus_write.full.val();
FIFOReadResponder::<Bits<W>>::link(&mut self.fifo_bus, &mut self.fifo.bus_read);
}
}
#[test]
fn test_mosi_fifo_port_is_synthesizable() {
let mut dev = MOSIFIFOPort::<16, 4, 5, 1>::default();
dev.bus.link_connect_dest();
dev.fifo_bus.link_connect_dest();
dev.connect_all();
let vlog = generate_verilog(&dev);
yosys_validate("mosi_fifo_port", &vlog).unwrap();
}