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

Subversion Repositories can

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 58 to Rev 59
    Reverse comparison

Rev 58 → Rev 59

/trunk/bench/verilog/can_testbench.v
50,6 → 50,9
// CVS Revision History
//
// $Log: not supported by cvs2svn $
// Revision 1.29 2003/03/05 15:33:37 mohor
// tx_o is now tristated signal. tx_oen and tx_o combined together.
//
// Revision 1.28 2003/03/05 15:00:49 mohor
// Top level signal names changed.
//
160,20 → 163,34
parameter BRP = 2*(`CAN_TIMING0_BRP + 1);
 
 
`ifdef CAN_WISHBONE_IF
reg wb_clk_i;
reg wb_rst_i;
reg [7:0] wb_dat_i;
wire [7:0] wb_dat_o;
reg wb_cyc_i;
reg wb_stb_i;
reg wb_we_i;
reg [7:0] wb_adr_i;
wire wb_ack_o;
reg wb_free;
`else
reg rst_i;
reg ale_i;
reg rd_i; // active low
reg wr_i; // active low
wire [7:0] port_0;
wire [7:0] port_0_i;
reg [7:0] port_0_o;
reg port_0_en;
reg port_free;
`endif
 
reg wb_clk_i;
reg wb_rst_i;
reg [7:0] wb_dat_i;
wire [7:0] wb_dat_o;
reg wb_cyc_i;
reg wb_stb_i;
 
reg wb_we_i;
reg [7:0] wb_adr_i;
reg cs_can;
reg clk;
reg rx;
wire tx;
wire wb_ack_o;
wire irq;
wire clkout;
 
183,7 → 200,6
reg [7:0] tmp_data;
reg delayed_tx;
reg tx_bypassed;
reg wb_free;
reg extended_mode;
 
 
191,6 → 207,7
// Instantiate can_top module
can_top i_can_top
(
`ifdef CAN_WISHBONE_IF
.wb_clk_i(wb_clk_i),
.wb_rst_i(wb_rst_i),
.wb_dat_i(wb_dat_i),
200,6 → 217,14
.wb_we_i(wb_we_i),
.wb_adr_i(wb_adr_i),
.wb_ack_o(wb_ack_o),
`else
.rst_i(rst_i),
.ale_i(ale_i),
.rd_i(rd_i), // active low
.wr_i(wr_i), // active low
.port_0_i(port_0),
`endif
.cs_can(cs_can),
.clk_i(clk),
.rx_i(rx_and_tx),
.tx_o(tx),
208,15 → 233,23
);
 
 
`ifdef CAN_WISHBONE_IF
// Generate wishbone clock signal 10 MHz
initial
begin
wb_clk_i=0;
forever #50 wb_clk_i = ~wb_clk_i;
end
`endif
 
// Generate wishbone clock signal 10 MHz
initial
begin
wb_clk_i=0;
forever #50 wb_clk_i = ~wb_clk_i;
end
 
`ifdef CAN_WISHBONE_IF
`else
assign port_0_i = port_0;
assign port_0 = port_0_en? port_0_o : 8'hz;
`endif
 
 
// Generate clock signal 24 MHz
initial
begin
228,19 → 261,33
initial
begin
start_tb = 0;
wb_dat_i = 'hz;
wb_cyc_i = 0;
wb_stb_i = 0;
wb_we_i = 'hz;
wb_adr_i = 'hz;
wb_free = 1;
cs_can = 0;
rx = 1;
wb_rst_i = 1;
extended_mode = 0;
#200 wb_rst_i = 0;
// #200 initialize_fifo;
#200 start_tb = 1;
tx_bypassed = 0;
 
`ifdef CAN_WISHBONE_IF
wb_dat_i = 'hz;
wb_cyc_i = 0;
wb_stb_i = 0;
wb_we_i = 'hz;
wb_adr_i = 'hz;
wb_free = 1;
wb_rst_i = 1;
#200 wb_rst_i = 0;
#200 start_tb = 1;
`else
rst_i = 1'b0;
ale_i = 1'b0;
rd_i = 1'b1; // active low
wr_i = 1'b1; // active low
port_0_o = 8'h0;
port_0_en = 0;
port_free = 1;
rst_i = 1;
#200 rst_i = 0;
#200 start_tb = 1;
`endif
end
 
 
1554,25 → 1601,52
task read_register;
input [7:0] reg_addr;
 
begin
wait (wb_free);
wb_free = 0;
@ (posedge wb_clk_i);
#1;
wb_adr_i = reg_addr;
wb_cyc_i = 1;
wb_stb_i = 1;
wb_we_i = 0;
wait (wb_ack_o);
$display("(%0t) Reading register [%0d] = 0x%0x", $time, wb_adr_i, wb_dat_o);
@ (posedge wb_clk_i);
#1;
wb_adr_i = 'hz;
wb_cyc_i = 0;
wb_stb_i = 0;
wb_we_i = 'hz;
wb_free = 1;
end
`ifdef CAN_WISHBONE_IF
begin
wait (wb_free);
wb_free = 0;
@ (posedge wb_clk_i);
#1;
cs_can = 1;
wb_adr_i = reg_addr;
wb_cyc_i = 1;
wb_stb_i = 1;
wb_we_i = 0;
wait (wb_ack_o);
$display("(%0t) Reading register [%0d] = 0x%0x", $time, wb_adr_i, wb_dat_o);
@ (posedge wb_clk_i);
#1;
wb_adr_i = 'hz;
wb_cyc_i = 0;
wb_stb_i = 0;
wb_we_i = 'hz;
cs_can = 0;
wb_free = 1;
end
`else
begin
wait (port_free);
port_free = 0;
@ (posedge clk);
#1;
cs_can = 1;
ale_i = 1;
port_0_en = 1;
port_0_o = reg_addr;
@ (posedge clk);
#1;
ale_i = 0;
#90; // 73 - 103 ns
port_0_en = 0;
rd_i = 0; // active low
#158;
$display("(%0t) Reading register [%0d] = 0x%0x", $time, can_testbench.i_can_top.addr_latched, port_0_i);
#1;
rd_i = 1; // active low
cs_can = 0;
port_free = 1;
end
`endif
endtask
 
 
1580,26 → 1654,52
input [7:0] reg_addr;
input [7:0] reg_data;
 
begin
wait (wb_free);
wb_free = 0;
@ (posedge wb_clk_i);
#1;
wb_adr_i = reg_addr;
wb_dat_i = reg_data;
wb_cyc_i = 1;
wb_stb_i = 1;
wb_we_i = 1;
wait (wb_ack_o);
@ (posedge wb_clk_i);
#1;
wb_adr_i = 'hz;
wb_dat_i = 'hz;
wb_cyc_i = 0;
wb_stb_i = 0;
wb_we_i = 'hz;
wb_free = 1;
end
`ifdef CAN_WISHBONE_IF
begin
wait (wb_free);
wb_free = 0;
@ (posedge wb_clk_i);
#1;
cs_can = 1;
wb_adr_i = reg_addr;
wb_dat_i = reg_data;
wb_cyc_i = 1;
wb_stb_i = 1;
wb_we_i = 1;
wait (wb_ack_o);
@ (posedge wb_clk_i);
#1;
wb_adr_i = 'hz;
wb_dat_i = 'hz;
wb_cyc_i = 0;
wb_stb_i = 0;
wb_we_i = 'hz;
cs_can = 0;
wb_free = 1;
end
`else
begin
wait (port_free);
port_free = 0;
@ (posedge clk);
#1;
cs_can = 1;
ale_i = 1;
port_0_en = 1;
port_0_o = reg_addr;
@ (posedge clk);
#1;
ale_i = 0;
#90; // 73 - 103 ns
port_0_o = reg_data;
wr_i = 0; // active low
#158;
wr_i = 1; // active low
port_0_en = 0;
cs_can = 0;
port_free = 1;
end
`endif
endtask
 
 
/trunk/rtl/verilog/can_defines.v
50,6 → 50,9
// CVS Revision History
//
// $Log: not supported by cvs2svn $
// Revision 1.5 2003/03/05 15:03:20 mohor
// Xilinx RAM added.
//
// Revision 1.4 2003/03/01 22:52:47 mohor
// Actel APA ram supported.
//
67,6 → 70,10
//
 
 
// Uncomment following line if you want to use WISHBONE interface. Otherwise
// 8051 interface is used.
// `define CAN_WISHBONE_IF
 
// Uncomment following line if you want to use CAN in Actel APA devices (embedded memory used)
// `define ACTEL_APA_RAM
 
/trunk/rtl/verilog/can_top.v
50,6 → 50,9
// CVS Revision History
//
// $Log: not supported by cvs2svn $
// Revision 1.24 2003/03/10 17:24:40 mohor
// wire declaration added.
//
// Revision 1.23 2003/03/05 15:33:13 mohor
// tx_o is now tristated signal. tx_oen and tx_o combined together.
//
136,15 → 139,24
 
module can_top
(
wb_clk_i,
wb_rst_i,
wb_dat_i,
wb_dat_o,
wb_cyc_i,
wb_stb_i,
wb_we_i,
wb_adr_i,
wb_ack_o,
`ifdef CAN_WISHBONE_IF
wb_clk_i,
wb_rst_i,
wb_dat_i,
wb_dat_o,
wb_cyc_i,
wb_stb_i,
wb_we_i,
wb_adr_i,
wb_ack_o,
`else
rst_i,
ale_i,
rd_i, // active low
wr_i, // active low
port_0_i,
`endif
cs_can,
clk_i,
rx_i,
tx_o,
154,15 → 166,40
 
parameter Tp = 1;
 
input wb_clk_i;
input wb_rst_i;
input [7:0] wb_dat_i;
output [7:0] wb_dat_o;
input wb_cyc_i;
input wb_stb_i;
input wb_we_i;
input [7:0] wb_adr_i;
output wb_ack_o;
`ifdef CAN_WISHBONE_IF
input wb_clk_i;
input wb_rst_i;
input [7:0] wb_dat_i;
output [7:0] wb_dat_o;
input wb_cyc_i;
input wb_stb_i;
input wb_we_i;
input [7:0] wb_adr_i;
output wb_ack_o;
 
reg wb_ack_o;
reg cs_sync1;
reg cs_sync2;
reg cs_sync3;
reg cs_ack1;
reg cs_ack2;
reg cs_ack3;
reg cs_sync_rst1;
reg cs_sync_rst2;
`else
input rst_i;
input ale_i;
input rd_i; // active low
input wr_i; // active low
inout [7:0] port_0_i;
reg [7:0] addr_latched;
reg wr_i_q;
reg rd_i_q;
`endif
 
input cs_can;
input clk_i;
input rx_i;
output tx_o;
169,20 → 206,9
output irq_o;
output clkout_o;
 
reg [7:0] wb_dat_o;
reg wb_ack_o;
reg data_out_fifo_selected;
 
reg cs_sync1;
reg cs_sync2;
reg cs_sync3;
 
reg cs_ack1;
reg cs_ack2;
reg cs_ack3;
reg cs_sync_rst1;
reg cs_sync_rst2;
 
wire [7:0] data_out_fifo;
wire [7:0] data_out_regs;
 
303,6 → 329,11
wire tx_out;
wire tx_oen;
 
wire rst;
wire we;
wire [7:0] addr;
wire [7:0] data_in;
reg [7:0] data_out;
 
 
/* Connecting can_registers module */
309,11 → 340,11
can_registers i_can_registers
(
.clk(clk_i),
.rst(wb_rst_i),
.rst(rst),
.cs(cs),
.we(wb_we_i),
.addr(wb_adr_i),
.data_in(wb_dat_i),
.we(we),
.addr(addr),
.data_in(data_in),
.data_out(data_out_regs),
.irq(irq_o),
 
432,7 → 463,7
can_btl i_can_btl
(
.clk(clk_i),
.rst(wb_rst_i),
.rst(rst),
.rx(rx_i),
 
/* Mode register */
471,7 → 502,7
can_bsp i_can_bsp
(
.clk(clk_i),
.rst(wb_rst_i),
.rst(rst),
/* From btl module */
.sample_point(sample_point),
480,8 → 511,8
.tx_point(tx_point),
.hard_sync(hard_sync),
 
.addr(wb_adr_i),
.data_in(wb_dat_i),
.addr(addr),
.data_in(data_in),
.data_out(data_out_fifo),
.fifo_selected(data_out_fifo_selected),
 
584,9 → 615,9
 
 
// Multiplexing wb_dat_o from registers and rx fifo
always @ (extended_mode or wb_adr_i or reset_mode)
always @ (extended_mode or addr or reset_mode)
begin
if (extended_mode & (~reset_mode) & ((wb_adr_i >= 8'd16) && (wb_adr_i <= 8'd28)) | (~extended_mode) & ((wb_adr_i >= 8'd20) && (wb_adr_i <= 8'd29)))
if (extended_mode & (~reset_mode) & ((addr >= 8'd16) && (addr <= 8'd28)) | (~extended_mode) & ((addr >= 8'd20) && (addr <= 8'd29)))
data_out_fifo_selected <= 1'b1;
else
data_out_fifo_selected <= 1'b0;
595,56 → 626,103
 
always @ (posedge clk_i)
begin
if (wb_cyc_i & (~wb_we_i))
// if (wb_cyc_i & (~wb_we_i))
if (cs & (~we))
begin
if (data_out_fifo_selected)
wb_dat_o <=#Tp data_out_fifo;
data_out <=#Tp data_out_fifo;
else
wb_dat_o <=#Tp data_out_regs;
data_out <=#Tp data_out_regs;
end
end
 
 
 
// Combining wb_cyc_i and wb_stb_i signals to cs signal. Than synchronizing to clk_i clock domain.
always @ (posedge clk_i or posedge wb_rst_i)
begin
if (wb_rst_i)
begin
cs_sync1 <= 1'b0;
cs_sync2 <= 1'b0;
cs_sync3 <= 1'b0;
cs_sync_rst1 <= 1'b0;
cs_sync_rst2 <= 1'b0;
end
else
begin
cs_sync1 <=#Tp wb_cyc_i & wb_stb_i & (~cs_sync_rst2);
cs_sync2 <=#Tp cs_sync1 & (~cs_sync_rst2);
cs_sync3 <=#Tp cs_sync2 & (~cs_sync_rst2);
cs_sync_rst1 <=#Tp cs_ack3;
cs_sync_rst2 <=#Tp cs_sync_rst1;
end
end
`ifdef CAN_WISHBONE_IF
// Combining wb_cyc_i and wb_stb_i signals to cs signal. Than synchronizing to clk_i clock domain.
always @ (posedge clk_i or posedge rst)
begin
if (rst)
begin
cs_sync1 <= 1'b0;
cs_sync2 <= 1'b0;
cs_sync3 <= 1'b0;
cs_sync_rst1 <= 1'b0;
cs_sync_rst2 <= 1'b0;
end
else
begin
cs_sync1 <=#Tp wb_cyc_i & wb_stb_i & (~cs_sync_rst2) & cs_can;
cs_sync2 <=#Tp cs_sync1 & (~cs_sync_rst2);
cs_sync3 <=#Tp cs_sync2 & (~cs_sync_rst2);
cs_sync_rst1 <=#Tp cs_ack3;
cs_sync_rst2 <=#Tp cs_sync_rst1;
end
end
assign cs = cs_sync2 & (~cs_sync3);
always @ (posedge wb_clk_i)
begin
cs_ack1 <=#Tp cs_sync3;
cs_ack2 <=#Tp cs_ack1;
cs_ack3 <=#Tp cs_ack2;
end
// Generating acknowledge signal
always @ (posedge wb_clk_i)
begin
wb_ack_o <=#Tp (cs_ack2 & (~cs_ack3));
end
 
 
assign cs = cs_sync2 & (~cs_sync3);
assign rst = wb_rst_i;
assign we = wb_we_i;
assign addr = wb_adr_i;
assign data_in = wb_dat_i;
assign wb_dat_o = data_out;
 
 
always @ (posedge wb_clk_i)
begin
cs_ack1 <=#Tp cs_sync3;
cs_ack2 <=#Tp cs_ack1;
cs_ack3 <=#Tp cs_ack2;
end
`else
// Latching address
always @ (posedge clk_i or posedge rst)
begin
if (rst)
addr_latched <= 8'h0;
else if (ale_i)
addr_latched <=#Tp port_0_i;
end
 
 
// Generating delayed wr_i and rd_i signals
always @ (posedge clk_i or posedge rst)
begin
if (rst)
begin
wr_i_q <= 1'b0;
rd_i_q <= 1'b0;
end
else
begin
wr_i_q <=#Tp wr_i;
rd_i_q <=#Tp rd_i;
end
end
 
// Generating acknowledge signal
always @ (posedge wb_clk_i)
begin
wb_ack_o <=#Tp (cs_ack2 & (~cs_ack3));
end
 
assign cs = ((~wr_i) & wr_i_q) | ((~rd_i) & rd_i_q) & cs_can;
 
 
assign rst = rst_i;
assign we = ~wr_i;
assign addr = addr_latched;
assign data_in = port_0_i;
assign port_0_i = (cs_can & (~rd_i))? data_out : 8'hz;
 
`endif
 
endmodule

powered by: WebSVN 2.1.0

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