OpenCores
URL https://opencores.org/ocsvn/ssbcc/ssbcc/trunk

Subversion Repositories ssbcc

[/] [ssbcc/] [trunk/] [core/] [9x8/] [peripherals/] [open_drain.py] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 sinclairrf
################################################################################
2
#
3
# Copyright 2012-2013, Sinclair R.F., Inc.
4
#
5
################################################################################
6
 
7
from ssbccPeripheral import SSBCCperipheral
8
from ssbccUtil import SSBCCException;
9
 
10
class open_drain(SSBCCperipheral):
11
  """
12
  Implement an open-drain I/O suitable for direct connection to a pin.  This
13
  can, for example, be used as an I/O port for an I2C device.\n
14
  Usage:
15
    PERIPHERAL open_drain inport=I_name \\
16
                          outport=O_name \\
17
                          iosignal=io_name \\
18
                          [width=n]\n
19
  Where:
20
    inport=I_name
21
      is the inport symbol to read the pin
22
    outport=O_name
23
      is the outport symbol to write to the pin
24
      Note:  A "0" value activates the open drain while a "1" value releases the
25
             open drain.
26
    iosignal=io_name
27
      is the tri-state pin for the open-drain I/O buffer
28
      Note:  The initial value of the pin is "open."
29
    width=n
30
      is the optional width of the port
31
      Note:  The default is one bit\n
32
  The following OUTPORTs are provided by this peripheral:
33
    O_name
34
      this is the new output for the open drain I/O\n
35
  The following INPORTs are provided by this peripheral:
36
    I_name
37
      this reads the current value of the open drain I/O\n
38
  Example:  Configure two 1-bit ports implementing an I2C bus:\n
39
    Add the following to the architecture file:\n
40
    PORTCOMMENT I2C bus
41
    PERIPHERAL open_drain inport=I_SCL outport=O_SCL iosignal=io_scl
42
    PERIPHERAL open_drain inport=I_SDA outport=O_SDA iosignal=io_sda\n
43
    The following assembly will transmit the start condition for an I2C bus by
44
    pulling SDA low and then pulling SCL low.\n
45
    ; Set SDA low
46
 
47
    ; delay one fourth of a 400 kHz cycle (based on a 100 MHz clock)
48
    ${int(100.e6/400.e3/3)-1} :delay .jumpc(delay,1-) drop
49
    ; Set SCL low
50
 
51
    See the I2C examples for a complete demonstration of using the open_drain
52
    peripheral.
53
  """
54
 
55
  def __init__(self,peripheralFile,config,param_list,loc):
56
    # Use the externally provided file name for the peripheral
57
    self.peripheralFile = peripheralFile;
58
    # Parse the parameters.
59
    for param_tuple in param_list:
60
      param = param_tuple[0];
61
      param_arg = param_tuple[1];
62
      if param == 'inport':
63
        self.AddAttr(config,param,param_arg,r'I_\w+$',loc);
64
      elif param == 'iosignal':
65
        self.AddAttr(config,param,param_arg,r'io_\w+$',loc);
66
      elif param == 'outport':
67
        self.AddAttr(config,param,param_arg,r'O_\w+$',loc);
68
      elif param == 'width':
69
        self.AddAttr(config,param,param_arg,r'[1-9]\d*$',loc,int);
70
      else:
71
        raise SSBCCException('Unrecognized parameter at %s:  "%s"' % (loc,param,));
72
    # Ensure the required parameters are set.
73
    if not hasattr(self,'inport'):
74
      raise SSBCCException('Missing "inport=I_name" at %s' % loc);
75
    if not hasattr(self,'iosignal'):
76
      raise SSBCCException('Missing "iosignal=io_name" at %s' % loc);
77
    if not hasattr(self,'outport'):
78
      raise SSBCCException('Missing "outport=O_name" at %s' % loc);
79
    # Set defaults for non-specified values.
80
    if not hasattr(self,'width'):
81
      self.width = 1;
82
    # Ensure the specified values are reasonable.
83
    maxWidth = config.Get('data_width');
84
    if (self.width < 1) or (maxWidth < self.width):
85
      raise SSBCCException('width must be between 1 and %d inclusive at %s' % (maxWidth,loc,));
86
    # Create the internal signal name and initialization.
87
    self.sname = 's__%s' % self.iosignal;
88
    sname_init = '%d\'b%s' % (self.width, '1'*self.width, );
89
    # Add the I/O port, internal signals, and the INPORT and OUTPORT symbols for this peripheral.
90
    config.AddIO(self.iosignal,self.width,'inout',loc);
91
    config.AddSignalWithInit(self.sname,self.width,None,loc);
92
    config.AddInport((self.inport,
93
                     (self.iosignal,self.width,'data',),
94
                    ),
95
                    loc);
96
    config.AddOutport((self.outport,False,
97
                      (self.sname,self.width,'data',sname_init,),
98
                     ),
99
                     loc);
100
 
101
  def GenVerilog(self,fp,config):
102
    body_1 = """//
103
// PERIPHERAL open_drain:  @NAME@
104
//
105
assign @IO_NAME@ = (@S_NAME@ == 1'b0) ? 1'b0 : 1'bz;
106
"""
107
    body_big = """//
108
// PERIPHERAL open_drain:  @NAME@
109
//
110
generate
111
genvar ix;
112
for (ix=0; ix<@WIDTH@; ix = ix+1) begin : gen_@NAME@
113
  assign @IO_NAME@[ix] = (@S_NAME@[ix] == 1'b0) ? 1'b0 : 1'bz;
114
end
115
endgenerate
116
"""
117
    if self.width == 1:
118
      body = body_1;
119
    else:
120
      body = body_big;
121
    for subs in (
122
                  (r'\bix\b',           'ix__@NAME@',),
123
                  (r'@IO_NAME@',        self.iosignal,),
124
                  (r'@NAME@',           self.iosignal,),
125
                  (r'@S_NAME@',         self.sname,),
126
                  (r'@WIDTH@',          str(self.width),),
127
                ):
128
      body = re.sub(subs[0],subs[1],body);
129
    body = self.GenVerilogFinal(config,body);
130
    fp.write(body);

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.