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

Subversion Repositories openmsp430

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /openmsp430/trunk/core/bench
    from Rev 151 to Rev 154
    Reverse comparison

Rev 151 → Rev 154

/verilog/dbg_uart_tasks.v
61,6 → 61,7
parameter BRK3_STAT = (8'h40 | 8'h15);
parameter BRK3_ADDR0 = (8'h00 | 8'h16);
parameter BRK3_ADDR1 = (8'h00 | 8'h17);
parameter CPU_NR = (8'h00 | 8'h18);
 
// Read / Write commands
parameter DBG_WR = 8'h80;
/verilog/tb_openMSP430.v
155,7 → 155,7
reg scan_enable;
reg scan_mode;
 
// Debug interface
// Debug interface: UART
reg dbg_en;
wire dbg_freeze;
wire dbg_uart_txd;
168,6 → 168,26
reg dbg_uart_rx_busy;
reg dbg_uart_tx_busy;
 
// Debug interface: I2C
wire dbg_scl;
wire dbg_sda;
wire dbg_scl_slave;
wire dbg_scl_master;
reg dbg_scl_master_sel;
reg dbg_scl_master_dly;
reg dbg_scl_master_pre;
reg dbg_scl_master_meta;
wire dbg_sda_slave_out;
wire dbg_sda_slave_in;
wire dbg_sda_master_out;
reg dbg_sda_master_out_sel;
reg dbg_sda_master_out_dly;
reg dbg_sda_master_out_pre;
reg dbg_sda_master_out_meta;
wire dbg_sda_master_in;
reg [15:0] dbg_i2c_buf;
reg [8*32-1:0] dbg_i2c_string;
 
// Core testbench debuging signals
wire [8*32-1:0] i_state;
wire [8*32-1:0] e_state;
191,6 → 211,7
 
// Debug interface tasks
`include "dbg_uart_tasks.v"
`include "dbg_i2c_tasks.v"
 
// Simple uart tasks
//`include "uart_tasks.v"
247,37 → 268,46
 
initial
begin
error = 0;
stimulus_done = 1;
irq = 14'h0000;
nmi = 1'b0;
wkup = 14'h0000;
cpu_en = 1'b1;
dbg_en = 1'b0;
dbg_uart_rxd_sel = 1'b0;
dbg_uart_rxd_dly = 1'b1;
dbg_uart_rxd_pre = 1'b1;
dbg_uart_rxd_meta= 1'b0;
dbg_uart_buf = 16'h0000;
dbg_uart_rx_busy = 1'b0;
dbg_uart_tx_busy = 1'b0;
p1_din = 8'h00;
p2_din = 8'h00;
p3_din = 8'h00;
p4_din = 8'h00;
p5_din = 8'h00;
p6_din = 8'h00;
inclk = 1'b0;
taclk = 1'b0;
ta_cci0a = 1'b0;
ta_cci0b = 1'b0;
ta_cci1a = 1'b0;
ta_cci1b = 1'b0;
ta_cci2a = 1'b0;
ta_cci2b = 1'b0;
uart_rxd = 1'b1;
scan_enable = 1'b0;
scan_mode = 1'b0;
error = 0;
stimulus_done = 1;
irq = 14'h0000;
nmi = 1'b0;
wkup = 14'h0000;
cpu_en = 1'b1;
dbg_en = 1'b0;
dbg_uart_rxd_sel = 1'b0;
dbg_uart_rxd_dly = 1'b1;
dbg_uart_rxd_pre = 1'b1;
dbg_uart_rxd_meta = 1'b0;
dbg_uart_buf = 16'h0000;
dbg_uart_rx_busy = 1'b0;
dbg_uart_tx_busy = 1'b0;
dbg_scl_master_sel = 1'b0;
dbg_scl_master_dly = 1'b1;
dbg_scl_master_pre = 1'b1;
dbg_scl_master_meta = 1'b0;
dbg_sda_master_out_sel = 1'b0;
dbg_sda_master_out_dly = 1'b1;
dbg_sda_master_out_pre = 1'b1;
dbg_sda_master_out_meta = 1'b0;
dbg_i2c_string = "";
p1_din = 8'h00;
p2_din = 8'h00;
p3_din = 8'h00;
p4_din = 8'h00;
p5_din = 8'h00;
p6_din = 8'h00;
inclk = 1'b0;
taclk = 1'b0;
ta_cci0a = 1'b0;
ta_cci0b = 1'b0;
ta_cci1a = 1'b0;
ta_cci1b = 1'b0;
ta_cci2a = 1'b0;
ta_cci2b = 1'b0;
uart_rxd = 1'b1;
scan_enable = 1'b0;
scan_mode = 1'b0;
end
 
324,47 → 354,52
openMSP430 dut (
 
// OUTPUTs
.aclk (aclk), // ASIC ONLY: ACLK
.aclk_en (aclk_en), // FPGA ONLY: ACLK enable
.dbg_freeze (dbg_freeze), // Freeze peripherals
.dbg_uart_txd (dbg_uart_txd), // Debug interface: UART TXD
.dco_enable (dco_enable), // ASIC ONLY: Fast oscillator enable
.dco_wkup (dco_wkup), // ASIC ONLY: Fast oscillator wake-up (asynchronous)
.dmem_addr (dmem_addr), // Data Memory address
.dmem_cen (dmem_cen), // Data Memory chip enable (low active)
.dmem_din (dmem_din), // Data Memory data input
.dmem_wen (dmem_wen), // Data Memory write enable (low active)
.irq_acc (irq_acc), // Interrupt request accepted (one-hot signal)
.lfxt_enable (lfxt_enable), // ASIC ONLY: Low frequency oscillator enable
.lfxt_wkup (lfxt_wkup), // ASIC ONLY: Low frequency oscillator wake-up (asynchronous)
.mclk (mclk), // Main system clock
.per_addr (per_addr), // Peripheral address
.per_din (per_din), // Peripheral data input
.per_we (per_we), // Peripheral write enable (high active)
.per_en (per_en), // Peripheral enable (high active)
.pmem_addr (pmem_addr), // Program Memory address
.pmem_cen (pmem_cen), // Program Memory chip enable (low active)
.pmem_din (pmem_din), // Program Memory data input (optional)
.pmem_wen (pmem_wen), // Program Memory write enable (low active) (optional)
.puc_rst (puc_rst), // Main system reset
.smclk (smclk), // ASIC ONLY: SMCLK
.smclk_en (smclk_en), // FPGA ONLY: SMCLK enable
.aclk (aclk), // ASIC ONLY: ACLK
.aclk_en (aclk_en), // FPGA ONLY: ACLK enable
.dbg_freeze (dbg_freeze), // Freeze peripherals
.dbg_i2c_sda_out (dbg_sda_slave_out), // Debug interface: I2C SDA OUT
.dbg_uart_txd (dbg_uart_txd), // Debug interface: UART TXD
.dco_enable (dco_enable), // ASIC ONLY: Fast oscillator enable
.dco_wkup (dco_wkup), // ASIC ONLY: Fast oscillator wake-up (asynchronous)
.dmem_addr (dmem_addr), // Data Memory address
.dmem_cen (dmem_cen), // Data Memory chip enable (low active)
.dmem_din (dmem_din), // Data Memory data input
.dmem_wen (dmem_wen), // Data Memory write enable (low active)
.irq_acc (irq_acc), // Interrupt request accepted (one-hot signal)
.lfxt_enable (lfxt_enable), // ASIC ONLY: Low frequency oscillator enable
.lfxt_wkup (lfxt_wkup), // ASIC ONLY: Low frequency oscillator wake-up (asynchronous)
.mclk (mclk), // Main system clock
.per_addr (per_addr), // Peripheral address
.per_din (per_din), // Peripheral data input
.per_we (per_we), // Peripheral write enable (high active)
.per_en (per_en), // Peripheral enable (high active)
.pmem_addr (pmem_addr), // Program Memory address
.pmem_cen (pmem_cen), // Program Memory chip enable (low active)
.pmem_din (pmem_din), // Program Memory data input (optional)
.pmem_wen (pmem_wen), // Program Memory write enable (low active) (optional)
.puc_rst (puc_rst), // Main system reset
.smclk (smclk), // ASIC ONLY: SMCLK
.smclk_en (smclk_en), // FPGA ONLY: SMCLK enable
 
// INPUTs
.cpu_en (cpu_en), // Enable CPU code execution (asynchronous)
.dbg_en (dbg_en), // Debug interface enable (asynchronous)
.dbg_uart_rxd (dbg_uart_rxd), // Debug interface: UART RXD (asynchronous)
.dco_clk (dco_clk), // Fast oscillator (fast clock)
.dmem_dout (dmem_dout), // Data Memory data output
.irq (irq_in), // Maskable interrupts
.lfxt_clk (lfxt_clk), // Low frequency oscillator (typ 32kHz)
.nmi (nmi), // Non-maskable interrupt (asynchronous)
.per_dout (per_dout), // Peripheral data output
.pmem_dout (pmem_dout), // Program Memory data output
.reset_n (reset_n), // Reset Pin (low active, asynchronous)
.scan_enable (scan_enable), // ASIC ONLY: Scan enable (active during scan shifting)
.scan_mode (scan_mode), // ASIC ONLY: Scan mode
.wkup (|wkup_in) // ASIC ONLY: System Wake-up (asynchronous)
.cpu_en (cpu_en), // Enable CPU code execution (asynchronous)
.dbg_en (dbg_en), // Debug interface enable (asynchronous)
.dbg_i2c_addr (I2C_ADDR), // Debug interface: I2C Address
.dbg_i2c_broadcast (I2C_BROADCAST), // Debug interface: I2C Broadcast Address (for multicore systems)
.dbg_i2c_scl (dbg_scl_slave), // Debug interface: I2C SCL
.dbg_i2c_sda_in (dbg_sda_slave_in), // Debug interface: I2C SDA IN
.dbg_uart_rxd (dbg_uart_rxd), // Debug interface: UART RXD (asynchronous)
.dco_clk (dco_clk), // Fast oscillator (fast clock)
.dmem_dout (dmem_dout), // Data Memory data output
.irq (irq_in), // Maskable interrupts
.lfxt_clk (lfxt_clk), // Low frequency oscillator (typ 32kHz)
.nmi (nmi), // Non-maskable interrupt (asynchronous)
.per_dout (per_dout), // Peripheral data output
.pmem_dout (pmem_dout), // Program Memory data output
.reset_n (reset_n), // Reset Pin (low active, asynchronous)
.scan_enable (scan_enable), // ASIC ONLY: Scan enable (active during scan shifting)
.scan_mode (scan_mode), // ASIC ONLY: Scan mode
.wkup (|wkup_in) // ASIC ONLY: System Wake-up (asynchronous)
);
 
//
575,6 → 610,48
 
 
//
// I2C serial debug interface
//----------------------------------
 
// I2C Bus
//.........................
pullup dbg_scl_inst (dbg_scl);
pullup dbg_sda_inst (dbg_sda);
 
// I2C Slave (openMSP430)
//.........................
io_cell scl_slave_inst (
.pad (dbg_scl), // I/O pad
.data_in (dbg_scl_slave), // Input
.data_out_en (1'b0), // Output enable
.data_out (1'b0) // Output
);
io_cell sda_slave_inst (
.pad (dbg_sda), // I/O pad
.data_in (dbg_sda_slave_in), // Input
.data_out_en (!dbg_sda_slave_out), // Output enable
.data_out (1'b0) // Output
);
 
// I2C Master (Debugger)
//.........................
io_cell scl_master_inst (
.pad (dbg_scl), // I/O pad
.data_in (), // Input
.data_out_en (!dbg_scl_master), // Output enable
.data_out (1'b0) // Output
);
io_cell sda_master_inst (
.pad (dbg_sda), // I/O pad
.data_in (dbg_sda_master_in), // Input
.data_out_en (!dbg_sda_master_out), // Output enable
.data_out (1'b0) // Output
);
 
 
//
// Debug utility signals
//----------------------------------------
msp_debug msp_debug_0 (
/verilog/dbg_i2c_tasks.v
0,0 → 1,355
//----------------------------------------------------------------------------
// Copyright (C) 2001 Authors
//
// This source file may be used and distributed without restriction provided
// that this copyright statement is not removed from the file and that any
// derivative work contains the original copyright notice and the associated
// disclaimer.
//
// This source file is free software; you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published
// by the Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This source is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
// License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this source; if not, write to the Free Software Foundation,
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
//
//----------------------------------------------------------------------------
//
// *File Name: dbg_i2c_tasks.v
//
// *Module Description:
// openMSP430 debug interface I2C tasks
//
// *Author(s):
// - Olivier Girard, olgirard@gmail.com
//
//----------------------------------------------------------------------------
// $Rev: 17 $
// $LastChangedBy: olivier.girard $
// $LastChangedDate: 2009-08-04 23:15:39 +0200 (Tue, 04 Aug 2009) $
//----------------------------------------------------------------------------
 
//----------------------------------------------------------------------------
// I2C COMMUNICATION CONFIGURATION
//----------------------------------------------------------------------------
 
// Data rate
parameter I2C_FREQ = 2000000;
integer I2C_PERIOD = 1000000000/I2C_FREQ;
 
// Address
parameter I2C_ADDR = 7'h45;
parameter I2C_BROADCAST = 7'h67;
 
 
//----------------------------------------------------------------------------
// Generate START / STOP conditions
//----------------------------------------------------------------------------
task dbg_i2c_start;
begin
dbg_i2c_string = "Start";
dbg_sda_master_out_pre = 1'b0;
#(I2C_PERIOD/2);
dbg_scl_master_pre = 1'b0;
#(I2C_PERIOD/4);
dbg_i2c_string = "";
end
endtask
 
task dbg_i2c_stop;
begin
dbg_i2c_string = "Stop";
dbg_sda_master_out_pre = 1'b0;
#(I2C_PERIOD/4);
dbg_scl_master_pre = 1'b1;
#(I2C_PERIOD/4);
dbg_sda_master_out_pre = 1'b1;
#(I2C_PERIOD/2);
dbg_i2c_string = "";
end
endtask
 
//----------------------------------------------------------------------------
// Send a byte on the I2C bus
//----------------------------------------------------------------------------
task dbg_i2c_send;
input [7:0] txbuf;
reg [9:0] txbuf_full;
integer txcnt;
begin
#(1);
txbuf_full = txbuf;
for (txcnt = 0; txcnt < 8; txcnt = txcnt + 1)
begin
$sformat(dbg_i2c_string, "TX_%-d", txcnt);
dbg_sda_master_out_pre = txbuf_full[7-txcnt];
#(I2C_PERIOD/4);
dbg_scl_master_pre = 1'b1;
#(I2C_PERIOD/2);
dbg_scl_master_pre = 1'b0;
#(I2C_PERIOD/4);
end
dbg_sda_master_out_pre = 1'b1;
dbg_i2c_string = "";
end
endtask
 
//----------------------------------------------------------------------------
// Read ACK / NACK
//----------------------------------------------------------------------------
task dbg_i2c_ack_rd;
begin
dbg_i2c_string = "ACK (rd)";
#(I2C_PERIOD/4);
dbg_scl_master_pre = 1'b1;
#(I2C_PERIOD/2);
dbg_scl_master_pre = 1'b0;
#(I2C_PERIOD/4);
dbg_i2c_string = "";
end
endtask
 
 
//----------------------------------------------------------------------------
// Read a byte from the I2C bus
//----------------------------------------------------------------------------
task dbg_i2c_receive;
output [7:0] rxbuf;
reg [9:0] rxbuf_full;
integer rxcnt;
begin
#(1);
rxbuf_full = 0;
for (rxcnt = 0; rxcnt < 8; rxcnt = rxcnt + 1)
begin
$sformat(dbg_i2c_string, "RX_%-d", rxcnt);
#(I2C_PERIOD/4);
dbg_scl_master_pre = 1'b1;
#(I2C_PERIOD/4);
rxbuf_full[7-rxcnt] = dbg_sda;
#(I2C_PERIOD/4);
dbg_scl_master_pre = 1'b0;
#(I2C_PERIOD/4);
end
dbg_i2c_string = "";
rxbuf = rxbuf_full;
end
endtask
 
 
//----------------------------------------------------------------------------
// Write ACK
//----------------------------------------------------------------------------
task dbg_i2c_ack_wr;
begin
dbg_i2c_string = "ACK (wr)";
dbg_sda_master_out_pre = 1'b0;
#(I2C_PERIOD/4);
dbg_scl_master_pre = 1'b1;
#(I2C_PERIOD/2);
dbg_scl_master_pre = 1'b0;
#(I2C_PERIOD/4);
dbg_sda_master_out_pre = 1'b1;
dbg_i2c_string = "";
end
endtask
//----------------------------------------------------------------------------
// Write NACK
//----------------------------------------------------------------------------
task dbg_i2c_nack_wr;
begin
dbg_i2c_string = "NACK (wr)";
dbg_sda_master_out_pre = 1'b1;
#(I2C_PERIOD/4);
dbg_scl_master_pre = 1'b1;
#(I2C_PERIOD/2);
dbg_scl_master_pre = 1'b0;
#(I2C_PERIOD/4);
dbg_sda_master_out_pre = 1'b1;
dbg_i2c_string = "";
end
endtask
 
//----------------------------------------------------------------------------
// Start Burst
//----------------------------------------------------------------------------
task dbg_i2c_burst_start;
input read;
begin
dbg_i2c_start; // START
dbg_i2c_send({I2C_ADDR, read}); // Device Address + Write access
dbg_i2c_ack_rd;
end
endtask
 
 
//----------------------------------------------------------------------------
// Read 16 bits
//----------------------------------------------------------------------------
task dbg_i2c_rx16;
input is_last;
reg [7:0] rxbuf_lo;
reg [7:0] rxbuf_hi;
begin
rxbuf_lo = 8'h00;
rxbuf_hi = 8'h00;
 
dbg_i2c_receive(rxbuf_lo); // Data (low)
dbg_i2c_ack_wr;
dbg_i2c_receive(rxbuf_hi); // Data (high)
if (is_last)
begin
dbg_i2c_nack_wr;
dbg_i2c_stop; // STOP
end
else
begin
dbg_i2c_ack_wr;
end
 
dbg_i2c_buf = {rxbuf_hi, rxbuf_lo};
end
endtask
 
//----------------------------------------------------------------------------
// Transmit 16 bits
//----------------------------------------------------------------------------
task dbg_i2c_tx16;
input [15:0] dbg_data;
input is_last;
begin
dbg_i2c_send(dbg_data[7:0]); // write LSB
dbg_i2c_ack_rd;
dbg_i2c_send(dbg_data[15:8]); // write MSB
dbg_i2c_ack_rd;
if (is_last)
dbg_i2c_stop; // STOP CONDITION
end
endtask
 
//----------------------------------------------------------------------------
// Read 8 bits
//----------------------------------------------------------------------------
task dbg_i2c_rx8;
input is_last;
reg [7:0] rxbuf;
begin
rxbuf = 8'h00;
 
dbg_i2c_receive(rxbuf); // Data (low)
if (is_last)
begin
dbg_i2c_nack_wr;
dbg_i2c_stop; // STOP
end
else
begin
dbg_i2c_ack_wr;
end
 
dbg_i2c_buf = {8'h00, rxbuf};
end
endtask
 
//----------------------------------------------------------------------------
// Transmit 8 bits
//----------------------------------------------------------------------------
task dbg_i2c_tx8;
input [7:0] dbg_data;
input is_last;
begin
dbg_i2c_send(dbg_data); // write LSB
dbg_i2c_ack_rd;
if (is_last)
dbg_i2c_stop; // STOP CONDITION
end
endtask
 
//----------------------------------------------------------------------------
// Write to Debug register
//----------------------------------------------------------------------------
task dbg_i2c_wr;
input [7:0] dbg_reg;
input [15:0] dbg_data;
begin
dbg_i2c_start; // START
dbg_i2c_tx8({I2C_ADDR, 1'b0}, 0); // Device Address + Write access
dbg_i2c_tx8(DBG_WR | dbg_reg, 0); // Command
 
if (~dbg_reg[6])
dbg_i2c_tx16(dbg_data, 1);
else
dbg_i2c_tx8 (dbg_data[7:0], 1);
end
endtask
 
//----------------------------------------------------------------------------
// Read Debug register
//----------------------------------------------------------------------------
task dbg_i2c_rd;
input [7:0] dbg_reg;
reg [7:0] rxbuf_lo;
reg [7:0] rxbuf_hi;
begin
rxbuf_lo = 8'h00;
rxbuf_hi = 8'h00;
 
dbg_i2c_start; // START
dbg_i2c_tx8({I2C_ADDR, 1'b0}, 0); // Device Address + Write access
dbg_i2c_tx8(DBG_RD | dbg_reg, 1); // Command
 
dbg_i2c_start; // START
dbg_i2c_tx8({I2C_ADDR, 1'b1}, 0); // Device Address + Read access
 
if (~dbg_reg[6])
dbg_i2c_rx16(1);
else
dbg_i2c_rx8(1);
end
endtask
 
//----------------------------------------------------------------------------
// Build random delay insertion on SCL_MASTER and SDA_MASTER_OUT in order to
// simulate synchronization mechanism
//----------------------------------------------------------------------------
 
always @(posedge mclk or posedge dbg_rst)
if (dbg_rst)
begin
dbg_sda_master_out_sel <= 1'b0;
dbg_sda_master_out_dly <= 1'b1;
 
dbg_scl_master_sel <= 1'b0;
dbg_scl_master_dly <= 1'b1;
end
else if (dbg_en)
begin
dbg_sda_master_out_sel <= dbg_sda_master_out_meta ? $random : 1'b0;
dbg_sda_master_out_dly <= dbg_sda_master_out_pre;
 
dbg_scl_master_sel <= dbg_scl_master_meta ? $random : 1'b0;
dbg_scl_master_dly <= dbg_scl_master_pre;
end
 
assign dbg_sda_master_out = dbg_sda_master_out_sel ? dbg_sda_master_out_dly : dbg_sda_master_out_pre;
 
assign dbg_scl_master = dbg_scl_master_sel ? dbg_scl_master_dly : dbg_scl_master_pre;
 
verilog/dbg_i2c_tasks.v Property changes : Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: verilog/io_cell.v =================================================================== --- verilog/io_cell.v (nonexistent) +++ verilog/io_cell.v (revision 154) @@ -0,0 +1,79 @@ +//---------------------------------------------------------------------------- +// Copyright (C) 2009 , Olivier Girard +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of the authors nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +// OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE +// +//---------------------------------------------------------------------------- +// +// *File Name: io_cell.v +// +// *Module Description: +// I/O cell model +// +// *Author(s): +// - Olivier Girard, olgirard@gmail.com +// +//---------------------------------------------------------------------------- +// $Rev: 103 $ +// $LastChangedBy: olivier.girard $ +// $LastChangedDate: 2011-03-05 15:44:48 +0100 (Sat, 05 Mar 2011) $ +//---------------------------------------------------------------------------- + +module io_cell ( + +// INOUTs + pad, // I/O Pad + +// OUTPUTs + data_in, // Input value + +// INPUTs + data_out_en, // Output enable + data_out // Output value +); + +// INOUTs +//========= +inout pad; // I/O Pad + +// OUTPUTs +//========= +output data_in; // Input value + +// INPUTs +//========= +input data_out_en; // Output enable +input data_out; // Output value + + +//============================================================================= +// 1) I/O CELL +//============================================================================= + +assign data_in = pad; +assign pad = data_out_en ? data_out : 1'bz; + + +endmodule // io_cell
verilog/io_cell.v Property changes : Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property

powered by: WebSVN 2.1.0

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