예제 #1
0
def parallel_example(dut):
    vi = [-32768, -1000, 0, 1000, 32767, -32768, -1000, 0, 1000, 32767]
    vq = [-32768, -1000, 0, 1000, 32767, 32767, 1000, 0, -1000, -32768]

    dut.data_en_i <= 0

    reset_n = dut.rst_i

    cocotb.fork(Clock(dut.clk_i, 10, 'ns').start())
    yield reset_dut(reset_n, dut.clk_i, 500)

    dut._log.debug("After reset")
    yield FallingEdge(dut.clk_i)
    yield FallingEdge(dut.clk_i)

    for i in range(len(vi)):
        dut.data_en_i <= 1
        dut.data_i_i <= vi[i]
        dut.data_q_i <= vq[i]
        print(f"{i} {vi[i]} {vq[i]}")
        yield FallingEdge(dut.clk_i)
        dut.data_en_i <= 0
        yield FallingEdge(dut.clk_i)
        res = vq[i] * vq[i] + vi[i] * vi[i]
        print(f"{res} {int(dut.data_o.value.signed_integer)}")
        assert res == int(dut.data_o.value.signed_integer)
    dut.data_en_i <= 0
예제 #2
0
    async def _run_reset(self):
        while True:
            await RisingEdge(self.user_clk)
            await RisingEdge(self.user_clk)

            if self.user_reset is not None:
                self.user_reset <= 1

            if self.sys_reset is not None:
                if not self.sys_reset.value:
                    await RisingEdge(self.sys_reset)
                await First(FallingEdge(self.sys_reset), Timer(100, 'ns'))
                await First(FallingEdge(self.sys_reset), RisingEdge(self.user_clk))
                if not self.sys_reset.value:
                    continue
            else:
                await Timer(100, 'ns')
                await RisingEdge(self.user_clk)

            if self.user_reset is not None:
                self.user_reset <= 0

            if self.sys_reset is not None:
                await FallingEdge(self.sys_reset)
            else:
                return
예제 #3
0
    def _receive_data(self):

        while True:
            # Wait for a high TVALID, if not already high
            if not self.bus.TVALID.value:
                yield RisingEdge(self.bus.TVALID)

            # Wait either for the required number of clock cycles or for a low
            # TVALID. By AXI4-Stream standard, the master should not de-assert
            # TVALID until at least one transfer has been performed but, if it
            # does it anyways, just re-start the wait.
            if callable(self.tready_delay):
                tready_high_delay = ClockCycles(self.clock,
                                                self.tready_delay(self.bus))
            else:
                tready_high_delay = ClockCycles(self.clock, self.tready_delay)

            trigger = yield [tready_high_delay, FallingEdge(self.bus.TVALID)]

            if trigger is tready_high_delay:
                self.bus.TREADY <= 1

                if callable(self.consecutive_transfers):
                    num_cycles = self.consecutive_transfers(self.bus)
                else:
                    num_cycles = self.consecutive_transfers

                if num_cycles != 0:
                    yield [ClockCycles(self.clock, num_cycles),
                           FallingEdge(self.bus.TVALID)]
                else:
                    yield FallingEdge(self.bus.TVALID)

                self.bus.TREADY <= 0
예제 #4
0
 def rcv(self):
     """ Monitor RX and add byte received to rx_buf list """
     self._log.debug("launching rcv monitor")
     onebaud = Timer(self._period + 300, units="ns")  #XXX
     frx = FallingEdge(self.rx)
     rrx = RisingEdge(self.rx)
     while True:
         yield frx
         # wait start bit
         yield [onebaud, frx, rrx]
         readingvalue = ""
         for i in range(self.datasize):
             readingvalue = "{:1d}".format(
                 self.rx.value.integer) + readingvalue
             yield [onebaud, frx, rrx]
         # read last bit
         #wait stop bit
         yield [onebaud, frx, rrx]
         readingvalue = "0b" + readingvalue
         self.rx_buf.append(int(readingvalue, 2))
         if (int(readingvalue, 2) == 0x0D):
             self._log.info("Read char \\r (value 0x0D)")
         else:
             self._log.info("Read char {} (value {:02X})".format(
                 chr(int(readingvalue, 2)), int(readingvalue, 2)))