Advertisement
Guest User

Untitled

a guest
Aug 8th, 2016
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.21 KB | None | 0 0
  1. #!/bin/python3
  2.  
  3. from migen import *
  4. from migen.fhdl import verilog
  5.  
  6.  
  7. L = [
  8.     ("start_bit",1, DIR_M_TO_S),
  9.     ("transmit_bit", 1, DIR_M_TO_S),
  10.     ("cmd_id", 6, DIR_M_TO_S),
  11.     ("arg", 32, DIR_M_TO_S),
  12.     ("stb", 1, DIR_M_TO_S),
  13.     ("crc7", 7, DIR_S_TO_M),
  14.     ("ack", 1, DIR_S_TO_M)
  15. ]
  16.  
  17. crc7_table = [
  18.     0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77,
  19.     0x19, 0x10, 0x0b, 0x02, 0x3d, 0x34, 0x2f, 0x26, 0x51, 0x58, 0x43, 0x4a, 0x75, 0x7c, 0x67, 0x6e,
  20.     0x32, 0x3b, 0x20, 0x29, 0x16, 0x1f, 0x04, 0x0d, 0x7a, 0x73, 0x68, 0x61, 0x5e, 0x57, 0x4c, 0x45,
  21.     0x2b, 0x22, 0x39, 0x30, 0x0f, 0x06, 0x1d, 0x14, 0x63, 0x6a, 0x71, 0x78, 0x47, 0x4e, 0x55, 0x5c,
  22.     0x64, 0x6d, 0x76, 0x7f, 0x40, 0x49, 0x52, 0x5b, 0x2c, 0x25, 0x3e, 0x37, 0x08, 0x01, 0x1a, 0x13,
  23.     0x7d, 0x74, 0x6f, 0x66, 0x59, 0x50, 0x4b, 0x42, 0x35, 0x3c, 0x27, 0x2e, 0x11, 0x18, 0x03, 0x0a,
  24.     0x56, 0x5f, 0x44, 0x4d, 0x72, 0x7b, 0x60, 0x69, 0x1e, 0x17, 0x0c, 0x05, 0x3a, 0x33, 0x28, 0x21,
  25.     0x4f, 0x46, 0x5d, 0x54, 0x6b, 0x62, 0x79, 0x70, 0x07, 0x0e, 0x15, 0x1c, 0x23, 0x2a, 0x31, 0x38,
  26.     0x41, 0x48, 0x53, 0x5a, 0x65, 0x6c, 0x77, 0x7e, 0x09, 0x00, 0x1b, 0x12, 0x2d, 0x24, 0x3f, 0x36,
  27.     0x58, 0x51, 0x4a, 0x43, 0x7c, 0x75, 0x6e, 0x67, 0x10, 0x19, 0x02, 0x0b, 0x34, 0x3d, 0x26, 0x2f,
  28.     0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c, 0x3b, 0x32, 0x29, 0x20, 0x1f, 0x16, 0x0d, 0x04,
  29.     0x6a, 0x63, 0x78, 0x71, 0x4e, 0x47, 0x5c, 0x55, 0x22, 0x2b, 0x30, 0x39, 0x06, 0x0f, 0x14, 0x1d,
  30.     0x25, 0x2c, 0x37, 0x3e, 0x01, 0x08, 0x13, 0x1a, 0x6d, 0x64, 0x7f, 0x76, 0x49, 0x40, 0x5b, 0x52,
  31.     0x3c, 0x35, 0x2e, 0x27, 0x18, 0x11, 0x0a, 0x03, 0x74, 0x7d, 0x66, 0x6f, 0x50, 0x59, 0x42, 0x4b,
  32.     0x17, 0x1e, 0x05, 0x0c, 0x33, 0x3a, 0x21, 0x28, 0x5f, 0x56, 0x4d, 0x44, 0x7b, 0x72, 0x69, 0x60,
  33.     0x0e, 0x07, 0x1c, 0x15, 0x2a, 0x23, 0x38, 0x31, 0x46, 0x4f, 0x54, 0x5d, 0x62, 0x6b, 0x70, 0x79
  34. ]
  35.  
  36. """
  37. crc_t crc_update(crc_t crc, const void *data, size_t data_len)
  38. {
  39.    const unsigned char *d = (const unsigned char *)data;
  40.    unsigned int tbl_idx;
  41.  
  42.    while (data_len--) {
  43.        tbl_idx = ((crc << 1) ^ *d);
  44.        crc = (crc_table[tbl_idx]) & 0x7f;
  45.  
  46.        d++;
  47.    }
  48.    return crc & 0x7f;
  49. }
  50. """
  51.  
  52. class CRC7(Module):
  53.     def __init__(self):
  54.         self.slave = slave = Record(L)
  55.         self.total = total = Cat(slave.arg, slave.cmd_id, slave.transmit_bit, slave.start_bit)
  56.         started = Signal()
  57.         self.bt_cnt = bt_cnt = Signal(3)
  58.         self.crc = crc = Signal(7)
  59.         self.comb += slave.crc7.eq(crc)
  60.         self.sync += [
  61.             If(~started & slave.stb,
  62.                         crc.eq(0),
  63.                         bt_cnt.eq(0),
  64.                         started.eq(1),
  65.                         slave.ack.eq(0)
  66.             ),
  67.  
  68.             If(started,
  69.                bt_cnt.eq(bt_cnt+1)
  70.             ),
  71.  
  72.             If(bt_cnt == 5,
  73.                slave.ack.eq(1),
  74.                started.eq(0)
  75.             )
  76.         ]
  77.  
  78.         self.data = data = Signal(8)
  79.         cases_data = {}
  80.         for i in range(5):
  81.             cases_data[i + 1] = data.eq(total[(4-i)*8 : (4-i) * 8 + 8])
  82.         self.comb += Case(bt_cnt, cases_data)
  83.  
  84.         tbl_idx = Signal(8)
  85.         self.comb += tbl_idx.eq(Cat(0,crc) ^ data)
  86.  
  87.         crccase = {}
  88.         for i in range (256):
  89.             crccase[i] = If(bt_cnt < 6, crc.eq(crc7_table[i]))
  90.         self.sync += Case(tbl_idx, crccase)
  91.  
  92.  
  93.  
  94. def counter_test(dut):
  95.     #master = Record(L)
  96.     #yield master.connect(dut.slave)
  97.  
  98.     yield dut.slave.start_bit.eq(0)
  99.     yield dut.slave.transmit_bit.eq(0)
  100.     yield dut.slave.cmd_id.eq(55)
  101.     yield dut.slave.arg.eq(0x120)
  102.     yield dut.slave.stb.eq(1)
  103.     yield
  104.     yield dut.slave.stb.eq(0)
  105.     for i in range(20):
  106.         print(format((yield dut.total), '06x'))
  107.         print((yield dut.bt_cnt))
  108.         print(format((yield dut.data), '02x'))
  109.         print(format((yield dut.crc), '02x'))
  110.         print((yield dut.slave.ack))
  111.         print("\n")
  112.         yield
  113.  
  114.  
  115.  
  116.  
  117.  
  118. if __name__ == "__main__":
  119.     dut = CRC7()
  120.     run_simulation(dut, counter_test(dut), vcd_name="basic1.vcd")
  121.  
  122.  
  123.  
  124.  
  125. #print(verilog.convert(CRC7()))
  126. #print(layout_len(L))
  127. #print(layout_partial(L, "cmd_id"))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement