[myhdl-list] Re: Tristate logic (newbie question)
Brought to you by:
jandecaluwe
From: P. M. <jos...@pt...> - 2005-08-31 14:31:08
|
################################################################# # brouter.py EXAMPLE code ################################################################# from __future__ import generators from myhdl import Signal, Simulation, delay, traceSignals, intbv, toVerilog def brouter( clk, clk2m, mclk, cs_z, liu_thz, rd_z, dados, teste, rs232_tx, rs232_rx, addr): """ brouter um exemplo simples em myhdl input clk; CLK_CPU input clk2m; CLK_2048MHz output mclk; CLK_LIU_MCLK input cs_z; CS_FPGA_Z output liu_thz; LIU_TH_Z input rd_z; RD_Z inout [7:0] dados; DADOS output teste; pino de test output rs232_rx; RX uC porta serie 2 input rs232_tx; TX uC porta serie 2 input [19:0] addr; ADDR """ # teste.next = clk.val # mclk.next = clk2m.val # liu_thz.next = intbv(0)[1:] # rs232_rx.next = rs232_tx.val def brouterProcess(): while 1: yield cs_z, rd_z if (cs_z == 0) and (rd_z == 0): dados.next = intbv(0xA5)[8:] else: dados.next = intbv(None)[8:] #high impedance assign return brouterProcess() clk= Signal(bool(0)) clk2m= Signal(bool(1)) mclk = Signal(bool(0)) cs_z = Signal(bool(1)) liu_thz = Signal(bool(1)) rd_z = Signal(bool(1)) dados = Signal(intbv(0)[8:]) teste = Signal(bool(0)) rs232_tx = Signal(bool(1)) rs232_rx = Signal(bool(0)) addr = Signal(intbv(0)[20:]) dados.next = intbv(val=None,_nrbits=8) dados.next = intbv(None)[8:] if dados.val._nrbits == 0: print "len: 0\n" else: print "len: %d \n" % (dados.val._nrbits) br_inst= toVerilog(brouter, clk, clk2m, mclk, cs_z, liu_thz, rd_z, dados, teste, rs232_tx, rs232_rx, addr) ################################################################# # GENERATED CODE ################################################################# module br_inst ( clk, clk2m, mclk, cs_z, liu_thz, rd_z, dados, teste, rs232_tx, rs232_rx, addr ); input clk; input clk2m; input mclk; input cs_z; input liu_thz; input rd_z; output [7:0] dados; reg [7:0] dados; input teste; input rs232_tx; input rs232_rx; input [19:0] addr; always @(cs_z or rd_z) begin: _MYHDL1_BLOCK if (((cs_z == 0) && (rd_z == 0))) begin dados <= 8'ha5; end else begin dados <= 8'hZ; end end endmodule ############################ CUT ME ############################# # _intbv.py.patch ############################ CUT ME ############################# jmatos - ~/work/hdl/myhdl-0.4.1/myhdl $ diff -u --new-file _intbv.py /usr/lib/python2.3/site-packages/myhdl/_intbv.py --- _intbv.py 2004-12-29 13:37:59.000000000 +0000 +++ /usr/lib/python2.3/site-packages/myhdl/_intbv.py 2005-08-31 13:54:36.000000000 +0000 @@ -71,14 +71,13 @@ min = property(_get_min, None) def _checkBounds(self): - if self._max is not None: - if self._val >= self._max: - raise ValueError("intbv value %s >= maximum %s" % - (self._val, self._max)) - if self._min is not None: - if self._val < self._min: - raise ValueError("intbv value %s < minimum %s" % - (self._val, self._min)) + if self._val is not None: + if self._max is not None: + if self._val >= self._max: + raise ValueError("intbv value %s >= maximum %s" % (self._val, self._max)) + if self._min is not None: + if self._val < self._min: + raise ValueError("intbv value %s < minimum %s" % (self._val, self._min)) # hash @@ -113,7 +112,10 @@ def __getitem__(self, key): if isinstance(key, int): i = key - res = intbv((self._val >> i) & 0x1, _nrbits=1) + if self._val is None: + res= intbv(None,_nrbits=1) + else: + res = intbv((self._val >> i) & 0x1, _nrbits=1) return res elif isinstance(key, slice): i, j = key.start, key.stop @@ -127,7 +129,10 @@ if i <= j: raise ValueError, "intbv[i:j] requires i > j\n" \ " i, j == %s, %s" % (i, j) - res = intbv((self._val & (1L << i)-1) >> j, _nrbits=i-j) + if self._val is None: + res= intbv(None,_nrbits=i-j) + else: + res = intbv((self._val & (1L << i)-1) >> j, _nrbits=i-j) return res else: raise TypeError("intbv item/slice indices should be integers") ############ CUT ME ############################################### ############ CUT ME ############################################### # _convert.py.patch ############ CUT ME ############################################### jmatos - ~/work/hdl/myhdl-0.4.1/myhdl $ diff -u _toVerilog/_convert.py /usr/lib/python2.3/site-packages/myhdl/_toVerilog/_convert.py --- _toVerilog/_convert.py 2004-12-24 13:35:02.000000000 +0000 +++ /usr/lib/python2.3/site-packages/myhdl/_toVerilog/_convert.py 2005-08-31 13:58:31.000000000 +0000 @@ -654,7 +654,10 @@ node.expr.node.obj is intbv: c = self.getVal(node) self.write("%s'h" % c._nrbits) - self.write("%x" % c._val) + if c._val is not None: + self.write("%x" % c._val) + else: + self.write("Z") return self.visit(node.expr) self.write("[") ############ CUT ME ############################################### |