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

Subversion Repositories fsl2serial

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 3 to Rev 4
    Reverse comparison

Rev 3 → Rev 4

/fsl2serial/trunk/fsl2serial_v1_00_a/hdl/verilog/serial_ctrl.v
0,0 → 1,157
// This module controls the serial modules.
//
// Alex Marschner
// 2007.02.20
 
`timescale 1 ns / 100 ps
 
module serial_ctrl (
fsl_data_i, fsl_senddata_i, fsl_cts_o,
fsl_data_o, fsl_rxdata_o, fsl_cts_i,
rs232_tx_data_o, rs232_rx_data_i, rs232_rts_i, rs232_cts_o,
clock, reset
);
 
parameter CLOCK_FREQ_MHZ = 50;
parameter BAUD_RATE = 115200;
 
input wire [7:0] fsl_data_i;
input wire fsl_senddata_i;
output reg fsl_cts_o;
output reg [7:0] fsl_data_o;
output reg fsl_rxdata_o;
input wire fsl_cts_i;
output wire rs232_tx_data_o;
input wire rs232_rx_data_i; // serial == 1 wire :)
input wire rs232_rts_i;
output reg rs232_cts_o;
 
input wire clock, reset;
 
wire [7:0] rs232_rx_data;
wire rs232_tx_ready;
reg rs232_rts;
wire rs232_rx_have_data;
 
///////////////////////////////////////////////////////////////////////////
// Serial In Module
serial_in
#(
.clk_freq(CLOCK_FREQ_MHZ * 1000000),
.data_rate(BAUD_RATE),
.delay_size(14)
) serial_in0 (
.clk(clock),
.rst(reset),
.serial_i(rs232_rx_data_i), // serial input line
.data_o(rs232_rx_data), // parallel data received
.have_data_o(rs232_rx_have_data) // data_exists line
);
///////////////////////////////////////////////////////////////////////////
// Serial Out Module
serial_out
#(
.clk_freq(CLOCK_FREQ_MHZ * 1000000),
.data_rate(BAUD_RATE))
serial_out0(
.clk(clock),
.rst(reset),
.data_size_i(8),
.data_i(fsl_data_i), // data to send out serially
.start_i(fsl_senddata_i), // start sending trigger
.serial_o(rs232_tx_data_o), // serial output line
.ready_o(rs232_tx_ready) // serial out !busy
);
 
always @ (posedge clock) begin
if(reset) begin
fsl_cts_o <= 1'b0;
fsl_data_o <= 8'h00;
fsl_rxdata_o <= 1'b0;
rs232_cts_o <= 1'b0;
rs232_rts <= 1'b0;
end
else begin
rs232_cts_o <= 1'b1; // always accept data from outside
fsl_cts_o <= rs232_tx_ready;
fsl_data_o <= rs232_rx_data;
rs232_rts <= rs232_rts_i; // incoming data?
fsl_rxdata_o <= fsl_cts_i ? rs232_rx_have_data : fsl_rxdata_o; // we have data
end
end
 
endmodule
 
///////////////////////////////////////////////////////////////////////////////
 
module serial_ctrl_tb ( );
 
reg [7:0] fsl_data_i;
reg fsl_senddata_i;
wire fsl_cts_o;
wire [7:0] fsl_data_o;
wire fsl_rxdata_o;
reg fsl_cts_i;
wire rs232_tx_data_o;
reg rs232_rx_data_i;
reg rs232_rts_i;
wire rs232_cts_o;
reg clock, reset;
 
serial_ctrl serial_ctrl_0(
.fsl_data_i (fsl_data_i),
.fsl_senddata_i (fsl_senddata_i),
.fsl_cts_o (fsl_cts_o),
.fsl_data_o (fsl_data_o),
.fsl_rxdata_o (fsl_rxdata_o),
.fsl_cts_i (fsl_cts_i),
.rs232_tx_data_o (rs232_tx_data_o),
.rs232_rx_data_i (rs232_rx_data_i),
.rs232_rts_i (rs232_rts_i),
.rs232_cts_o (rs232_cts_o),
.clock (clock),
.reset (reset)
);
 
initial begin
clock <= 1'b0;
reset <= 1'b1;
fsl_data_i <= 8'h00;
fsl_senddata_i <= 1'b0;
fsl_cts_i <= 1'b0;
rs232_rx_data_i <= 1'b1;
rs232_rts_i <= 1'b0;
 
#1000 reset <= 1'b0;
 
#1000 fsl_data_i <= 8'hAB;
fsl_senddata_i <= 1'b1;
#60 fsl_senddata_i <= 1'b0;
 
#4166400 rs232_rx_data_i <= 1'b0; // start bit
#416640 rs232_rx_data_i <= 1'b1;
#416640 rs232_rx_data_i <= 1'b1;
#416640 rs232_rx_data_i <= 1'b0;
#416640 rs232_rx_data_i <= 1'b1;
#416640 rs232_rx_data_i <= 1'b0;
#416640 rs232_rx_data_i <= 1'b1;
#416640 rs232_rx_data_i <= 1'b0;
#416640 rs232_rx_data_i <= 1'b1;
#416640 rs232_rx_data_i <= 1'b1; // stop bit
 
// test logic goes here . . .
 
end
 
 
always @ (posedge clock) begin
// fsl_senddata_i <= 1'b0;
end
 
always begin
#20 clock <= ~clock;
end
 
endmodule
 
/fsl2serial/trunk/fsl2serial_v1_00_a/hdl/verilog/serial_in.v
0,0 → 1,111
// Todd Fleming 2005
 
`timescale 1 ns / 100 ps
 
module serial_in(
clk,
rst,
serial_i,
data_o,
have_data_o,
frame_error_o,
serial_samping_o);
input clk, rst, serial_i;
output[7:0] data_o;
output have_data_o, frame_error_o, serial_samping_o;
 
parameter clk_freq = 100000000;
parameter data_rate = 115200;
parameter bit_length = clk_freq / data_rate;
parameter delay_size = 12; // Must be large enough to store bit_length
parameter use_parity = 0;
parameter parity_is_odd = 1;
reg[7:0] data_o;
reg parity;
reg have_data_o, frame_error_o, serial_samping_o;
reg temp, buffered_serial;
reg[2:0] state;
reg[delay_size-1:0] delay;
reg[3:0] bits_received;
parameter state_wait_for_start = 3'd0;
parameter state_wait_for_bit = 3'd1;
parameter state_wait_for_stop = 3'd2;
parameter state_wait_for_parity = 3'd3;
parameter state_frame_error = 3'd4;
always @(posedge clk) begin
temp <= serial_i;
buffered_serial <= temp;
serial_samping_o <= 1'd0;
if(rst) begin
data_o <= 8'd0;
have_data_o <= 1'd0;
frame_error_o <= 1'd0;
state <= state_wait_for_start;
end else begin
case(state)
state_wait_for_start: begin
have_data_o <= 1'b0;
frame_error_o <= 1'b0;
if(!buffered_serial) begin
serial_samping_o <= 1'd1;
state <= state_wait_for_bit;
delay <= bit_length + bit_length / 2;
bits_received <= 0;
end
end
state_wait_for_bit: begin
if(delay == 1) begin
serial_samping_o <= 1'd1;
data_o <= {buffered_serial, data_o[7:1]};
delay <= bit_length;
bits_received <= bits_received + 1;
if(bits_received == 7)
if(use_parity)
state <= state_wait_for_parity;
else
state <= state_wait_for_stop;
end else
delay <= delay - 1;
end
state_wait_for_parity: begin
if(delay == 1) begin
serial_samping_o <= 1'd1;
parity <= buffered_serial;
delay <= bit_length;
state <= state_wait_for_stop;
end else
delay <= delay - 1;
end
state_wait_for_stop: begin
if(delay == 1) begin
serial_samping_o <= 1'd1;
if(buffered_serial) begin
if(!use_parity || ((^data_o) ^ parity) == parity_is_odd)
have_data_o <= 1'b1;
frame_error_o <= 1'b0;
state <= state_wait_for_start;
end else begin
have_data_o <= 1'b0;
frame_error_o <= 1'b1;
state <= state_frame_error;
end
end else
delay <= delay - 1;
end
state_frame_error: begin
if(buffered_serial)
state <= state_wait_for_start;
end
endcase
end
end
endmodule // serial_in
/fsl2serial/trunk/fsl2serial_v1_00_a/hdl/verilog/fsl2serial.v
0,0 → 1,249
// This top level module ties together the FSL control and Serial control
// modules to make an active, two way serial to FSL / FSL to serial bridge.
//
// Alex Marschner
// 2007.02.20
 
`timescale 1 ns / 100 ps
 
module fsl2serial( clock, reset, // clock and reset
rs232_tx_data_o, //
rs232_rx_data_i,
rs232_rts_i,
rs232_cts_o,
 
FSL_S_CLK, FSL_S_DATA, FSL_S_CONTROL, FSL_S_EXISTS, FSL_S_READ,
FSL_M_CLK, FSL_M_DATA, FSL_M_CONTROL, FSL_M_FULL, FSL_M_WRITE
);
 
parameter EXT_RESET_ACTIVE_HI = 0;
parameter CLOCK_FREQ_MHZ = 50;
parameter BAUD_RATE = 115200;
 
input wire clock, reset;
output wire rs232_tx_data_o;
input wire rs232_rx_data_i;
input wire rs232_rts_i;
output wire rs232_cts_o;
 
input wire [0:31] FSL_S_DATA;
input wire FSL_S_CONTROL;
input wire FSL_S_EXISTS;
input wire FSL_M_FULL;
 
output wire [0:31] FSL_M_DATA;
output wire FSL_M_CONTROL;
output wire FSL_M_WRITE;
output wire FSL_S_READ;
 
output wire FSL_M_CLK;
output wire FSL_S_CLK;
 
wire ser2fsl_cts, fsl2ser_cts;
wire fsl2ser_start, ser2fsl_dataexists;
wire [7:0] ser2fsl_data;
wire [7:0] fsl2ser_data;
wire reset_correct_polarity;
 
assign reset_correct_polarity = EXT_RESET_ACTIVE_HI ? reset : ~reset;
 
assign FSL_M_DATA[0:23] = 24'b0; // only use last byte since we are dealing with serial characters
 
fsl_ctrl fsl_ctrl0(
.FSL_S_CLK (FSL_S_CLK),
.FSL_S_DATA (FSL_S_DATA[24:31]),
.FSL_S_CONTROL (FSL_S_CONTROL),
.FSL_S_EXISTS (FSL_S_EXISTS),
.FSL_S_READ (FSL_S_READ),
.FSL_M_CLK (FSL_M_CLK),
.FSL_M_DATA (FSL_M_DATA[24:31]),
.FSL_M_CONTROL (FSL_M_CONTROL),
.FSL_M_FULL (FSL_M_FULL),
.FSL_M_WRITE (FSL_M_WRITE),
.rs232_tx_ready (ser2fsl_cts),
.rs232_tx_data (fsl2ser_data),
.rs232_tx_start (fsl2ser_start),
.rs232_rx_ready (fsl2ser_cts),
.rs232_rx_data (ser2fsl_data),
.rs232_rx_exists (ser2fsl_dataexists),
.clock (clock),
.reset (reset_correct_polarity)
);
 
serial_ctrl #(
.CLOCK_FREQ_MHZ(CLOCK_FREQ_MHZ),
.BAUD_RATE(BAUD_RATE)
) serial_ctrl0 (
.fsl_data_i (fsl2ser_data),
.fsl_senddata_i (fsl2ser_start),
.fsl_cts_o (ser2fsl_cts),
.fsl_data_o (ser2fsl_data),
.fsl_rxdata_o (ser2fsl_dataexists),
.fsl_cts_i (fsl2ser_cts),
.rs232_tx_data_o (rs232_tx_data_o),
.rs232_rx_data_i (rs232_rx_data_i),
.rs232_rts_i (rs232_rts_i),
.rs232_cts_o (rs232_cts_o),
.clock (clock),
.reset (reset_correct_polarity)
);
 
/*
//-----------------------------------------------------------------
//
// ICON/ILA core wire declarations
//
//-----------------------------------------------------------------
wire [35:0] control0;
wire [31:0] trig0;
 
assign trig0 = {FSL_S_DATA[24:31],FSL_S_READ,FSL_S_EXISTS,
fsl2ser_data,fsl2ser_start,ser2fsl_cts,
rs232_tx_data_o, rs232_cts_o, reset_correct_polarity, 9'b0};
 
//-----------------------------------------------------------------
//
// ICON core instance
//
//-----------------------------------------------------------------
icon i_icon
(
.control0(control0)
);
 
//-----------------------------------------------------------------
//
// ILA core instance
//
//-----------------------------------------------------------------
ila i_ila
(
.control(control0),
.clk(clock),
.trig0(trig0)
);
 
endmodule
 
 
//-------------------------------------------------------------------
//
// ICON core module declaration
//
//-------------------------------------------------------------------
module icon
(
control0
);
output [35:0] control0;
endmodule
 
//-------------------------------------------------------------------
//
// ILA core module declaration
//
//-------------------------------------------------------------------
module ila
(
control,
clk,
trig0
);
input [35:0] control;
input clk;
input [31:0] trig0;*/
endmodule
 
///////////////////////////////////////////////////////////////////////////////
 
// TBD:
// [x] test the FSL 2 Serial direction
// [ ] test the Serial 2 FSL direction
 
module fsl2serial_tb ( );
 
reg clock, reset_n;
wire rs232_tx_data_o;
reg rs232_rx_data_i;
reg rs232_rts_i;
wire rs232_cts_o;
 
reg [0:31] FSL_S_DATA;
reg FSL_S_CONTROL;
wire [0:31] FSL_M_DATA;
wire FSL_M_CONTROL;
wire FSL_S_CLK, FSL_M_CLK;
wire FSL_M_WRITE, FSL_S_READ;
reg FSL_M_FULL, FSL_S_EXISTS;
 
initial begin
clock <= 1'b0;
reset_n <= 1'b0;
rs232_rx_data_i <= 1'b1;
rs232_rts_i <= 1'b0;
FSL_S_DATA <= 32'h00000000;
FSL_S_CONTROL <= 1'b0;
FSL_M_FULL <= 1'b0;
FSL_S_EXISTS <= 1'b0;
 
#1000 reset_n <= 1'b1;
#1000 FSL_S_DATA <= 8'hA0;
FSL_S_EXISTS <= 1'b1;
while(~&FSL_S_READ) #1 FSL_S_EXISTS <= 1'b1;
while( &FSL_S_READ) #1 FSL_S_EXISTS <= 1'b1;
FSL_S_EXISTS <= 1'b0;
 
#1000 FSL_S_DATA <= FSL_S_DATA + 1;
FSL_S_EXISTS <= 1'b1;
while(~&FSL_S_READ) #1 FSL_S_EXISTS <= 1'b1;
while( &FSL_S_READ) #1 FSL_S_EXISTS <= 1'b1;
FSL_S_EXISTS <= 1'b0;
#1000 FSL_S_DATA <= FSL_S_DATA + 1;
FSL_S_EXISTS <= 1'b1;
while(~&FSL_S_READ) #1 FSL_S_EXISTS <= 1'b1;
while( &FSL_S_READ) #1 FSL_S_EXISTS <= 1'b1;
FSL_S_EXISTS <= 1'b0;
#2070750 rs232_rx_data_i <= 1'b0; // start bit
#207075 rs232_rx_data_i <= 1'b1;
#207075 rs232_rx_data_i <= 1'b1;
#207075 rs232_rx_data_i <= 1'b0;
#207075 rs232_rx_data_i <= 1'b1;
#207075 rs232_rx_data_i <= 1'b0;
#207075 rs232_rx_data_i <= 1'b1;
#207075 rs232_rx_data_i <= 1'b0;
#207075 rs232_rx_data_i <= 1'b1;
#207075 rs232_rx_data_i <= 1'b1; // stop bit
 
 
end
 
always begin
#10 clock <= ~clock; // 50MHz
end
 
fsl2serial bridge(
.clock (clock),
.reset (reset_n),
.rs232_tx_data_o (rs232_tx_data_o),
.rs232_rx_data_i (rs232_rx_data_i),
.rs232_rts_i (rs232_rts_i),
.rs232_cts_o (rs232_cts_o),
.FSL_S_CLK (FSL_S_CLK),
.FSL_S_DATA (FSL_S_DATA),
.FSL_S_CONTROL (FSL_S_CONTROL),
.FSL_S_EXISTS (FSL_S_EXISTS),
.FSL_S_READ (FSL_S_READ),
.FSL_M_CLK (FSL_M_CLK),
.FSL_M_DATA (FSL_M_DATA),
.FSL_M_CONTROL (FSL_M_CONTROL),
.FSL_M_FULL (FSL_M_FULL),
.FSL_M_WRITE (FSL_M_WRITE)
);
 
endmodule
 
/fsl2serial/trunk/fsl2serial_v1_00_a/hdl/verilog/serial_out.v
0,0 → 1,162
// Todd Fleming 2005
 
`timescale 1 ns / 100 ps
 
module serial_out(
clk,
rst,
data_size_i,
data_i,
start_i,
serial_o,
ready_o,
bit_sync_o);
parameter clk_freq = 100000000;
parameter data_rate = 115200;
parameter bit_length = clk_freq / data_rate;
parameter delay_size = 32; // Must be large enough to store bit_length
parameter max_data_size = 8;
parameter data_size_size = 4; // Must be large enough to store max_data_size
parameter use_start = 1;
parameter use_stop = 1;
parameter use_parity = 0;
parameter stop_value = 1;
parameter parity_is_odd = 1;
input clk, rst;
input[data_size_size-1:0] data_size_i;
input[max_data_size-1:0] data_i;
input start_i;
output serial_o;
output ready_o;
output bit_sync_o;
reg[2:0] state;
reg[data_size_size-1:0] data_size;
reg[max_data_size-1:0] data;
reg[delay_size-1:0] delay;
reg[max_data_size-1:0] num_sent;
reg serial_o;
reg bit_sync_o;
parameter state_wait_for_start = 3'd0;
parameter state_send_start = 3'd1;
parameter state_send_bit = 3'd2;
parameter state_send_parity = 3'd3;
parameter state_send_stop = 3'd4;
assign ready_o =
(state == state_wait_for_start || state == state_send_stop && delay == 1) && !start_i;
always @(posedge clk) begin
bit_sync_o <= 0;
if(rst) begin
state <= state_wait_for_start;
end else begin
delay <= delay - 1;
case(state)
state_wait_for_start: begin
serial_o <= stop_value;
if(start_i) begin
data_size <= data_size_i;
data <= data_i;
num_sent <= 0;
if(use_start) begin
serial_o <= ~stop_value;
delay <= bit_length - 1;
state <= state_send_start;
end else begin
serial_o <= data_i[0];
delay <= bit_length - 1;
state <= state_send_bit;
end
end
end
state_send_start: begin
serial_o <= ~stop_value;
if(delay == 1) begin
delay <= bit_length;
state <= state_send_bit;
end
end
state_send_bit: begin
serial_o <= data[0];
if(delay == bit_length - 2)
bit_sync_o <= 1;
if(delay == 1) begin
delay <= bit_length;
data <= data >> 1;
num_sent <= num_sent + 1;
if(num_sent == data_size - 1)
if(use_parity)
state <= state_send_parity;
else if(use_stop)
state <= state_send_stop;
else
state <= state_wait_for_start;
end
end
state_send_parity: begin
serial_o <= (^data[0]) ^ parity_is_odd;
if(delay == 1) begin
delay <= bit_length;
state <= state_send_stop;
end
end
state_send_stop: begin
serial_o <= stop_value;
if(delay == 1) begin
delay <= bit_length;
state <= state_wait_for_start;
end
end
endcase
end
end
endmodule // serial_out
 
///////////////////////////////////////////////////////////////////////////////
 
module serial_out_tb ( );
 
reg clock, reset;
reg [7:0] fsl_data_i;
reg fsl_senddata_i;
wire rs232_tx_data_o;
wire rs232_tx_ready;
 
initial begin
clock <= 1'b0;
reset <= 1'b1;
fsl_data_i <= 8'h00;
fsl_senddata_i <= 1'b0;
 
#1000 reset <= 1'b0;
#1000 fsl_data_i <= 8'h0A;
fsl_senddata_i <= 1'b1;
#60 fsl_senddata_i <= 1'b0;
end
 
always begin
#10 clock <= ~clock;
end
 
// Serial Out Module
serial_out
#(
.clk_freq(50000000),
.data_rate(115200))
serial_out0(
.clk(clock),
.rst(reset),
.data_size_i(8),
.data_i(fsl_data_i), // data to send out serially
.start_i(fsl_senddata_i), // start sending trigger
.serial_o(rs232_tx_data_o), // serial output line
.ready_o(rs232_tx_ready) // serial out !busy
);
 
endmodule
/fsl2serial/trunk/fsl2serial_v1_00_a/hdl/verilog/fsl_ctrl.v
0,0 → 1,149
// This module sends the correct control signals to the slave FSL port in
// order to get the data out.
//
// Alex Marschner
// 2007.02.20
 
`timescale 1 ns / 100 ps
 
module fsl_ctrl (
FSL_S_CLK, FSL_S_DATA, FSL_S_CONTROL, FSL_S_EXISTS, FSL_S_READ,
FSL_M_CLK, FSL_M_DATA, FSL_M_CONTROL, FSL_M_FULL, FSL_M_WRITE,
rs232_tx_ready, rs232_tx_data, rs232_tx_start,
rs232_rx_ready, rs232_rx_data, rs232_rx_exists,
clock, reset
);
 
output wire FSL_S_CLK;
input wire [0:7] FSL_S_DATA;
input wire FSL_S_CONTROL;
input wire FSL_S_EXISTS;
output reg FSL_S_READ;
 
output wire FSL_M_CLK;
output reg [0:7] FSL_M_DATA;
output reg FSL_M_CONTROL;
input wire FSL_M_FULL;
output reg FSL_M_WRITE;
 
output reg rs232_rx_ready;
input wire [7:0] rs232_rx_data;
input wire rs232_rx_exists;
 
input wire rs232_tx_ready;
output wire [7:0] rs232_tx_data;
output wire rs232_tx_start;
 
input wire clock, reset;
 
assign FSL_S_CLK = clock;
//assign FSL_M_CLK = clock;
 
assign rs232_tx_data = FSL_S_DATA;
assign rs232_tx_start = FSL_S_READ;
 
always @ (posedge clock) begin
if(reset) begin
FSL_S_READ <= 1'b0;
FSL_M_DATA <= 8'h00;
FSL_M_CONTROL <= 1'b0;
FSL_M_WRITE <= 1'b0;
rs232_rx_ready <= 1'b0;
end
else begin
FSL_S_READ <= (FSL_S_EXISTS & (~FSL_S_READ) & rs232_tx_ready) ? 1'b1 : 1'b0;
FSL_M_DATA <= rs232_rx_data;
FSL_M_CONTROL <= 1'b0;
FSL_M_WRITE <= (!FSL_M_FULL & (~FSL_M_WRITE) & rs232_rx_exists) ? 1'b1 : 1'b0;
rs232_rx_ready <= 1'b1; // always ready to get data from outside
end
end
 
endmodule
 
///////////////////////////////////////////////////////////////////////////////
 
module fsl_ctrl_tb ( );
 
reg clock, reset;
wire FSL_S_CLK, FSL_S_READ;
reg [0:7] FSL_S_DATA;
reg FSL_S_CONTROL;
reg FSL_S_EXISTS;
reg rs232_tx_ready;
wire [7:0] rs232_tx_data;
wire rs232_tx_start;
reg [7:0] registered_out;
 
 
fsl_ctrl fsl_ctrl_0(
.FSL_S_CLK (FSL_S_CLK),
.FSL_S_DATA (FSL_S_DATA),
.FSL_S_CONTROL (FSL_S_CONTROL),
.FSL_S_EXISTS (FSL_S_EXISTS),
.FSL_S_READ (FSL_S_READ),
.rs232_tx_ready (rs232_tx_ready),
.rs232_tx_data (rs232_tx_data),
.rs232_tx_start (rs232_tx_start),
.clock (clock),
.reset (reset)
);
 
initial begin
clock <= 1'b0;
reset <= 1'b1;
FSL_S_DATA <= 8'h00;
FSL_S_CONTROL <= 1'b0;
FSL_S_EXISTS <= 1'b0;
rs232_tx_ready <= 1'b0;
 
#1000 reset <= 1'b0;
#20 rs232_tx_ready <= 1'b1;
 
#1000 FSL_S_DATA <= 8'hA0;
FSL_S_EXISTS <= 1'b1;
while(~&FSL_S_READ) #1 FSL_S_EXISTS <= 1'b1;
while( &FSL_S_READ) #1 FSL_S_EXISTS <= 1'b1;
FSL_S_EXISTS <= 1'b0;
 
#1000 FSL_S_DATA <= FSL_S_DATA + 1;
FSL_S_EXISTS <= 1'b1;
while(~&FSL_S_READ) #1 FSL_S_EXISTS <= 1'b1;
while( &FSL_S_READ) #1 FSL_S_EXISTS <= 1'b1;
FSL_S_EXISTS <= 1'b0;
#1000 FSL_S_DATA <= FSL_S_DATA + 1;
FSL_S_EXISTS <= 1'b1;
while(~&FSL_S_READ) #1 FSL_S_EXISTS <= 1'b1;
while( &FSL_S_READ) #1 FSL_S_EXISTS <= 1'b1;
FSL_S_EXISTS <= 1'b0;
#1000 while(1) FSL_S_EXISTS <= 1'b0;
end
 
always @ (posedge clock) begin
if(reset) registered_out <= 8'b0;
else registered_out <= rs232_tx_start ? rs232_tx_data : registered_out;
end
 
always @ (posedge clock) begin
if(reset) rs232_tx_ready <= 1'b0;
else begin
if(rs232_tx_start) begin
rs232_tx_ready <= 1'b0;
#4000 rs232_tx_ready <= 1'b1;
end
end
end
 
always @ (posedge clock) begin
FSL_S_EXISTS <= (FSL_S_EXISTS && FSL_S_READ) ? 1'b0 : FSL_S_EXISTS;
FSL_S_DATA <= (FSL_S_EXISTS && FSL_S_READ) ? (FSL_S_DATA+1) : FSL_S_DATA;
end
 
always begin
#20 clock <= ~clock;
end
 
endmodule
 
/fsl2serial/trunk/fsl2serial_v1_00_a/docs/fsl2serial.ucf
0,0 → 1,7
#### Module FSL2Serial Constraints ####
 
NET "rs232_tx_data_o_pin" LOC = "AE7" | IOSTANDARD = LVCMOS25 | DRIVE = 8 | SLEW = SLOW;
NET "rs232_rx_data_i_pin" LOC = "AJ8" | IOSTANDARD = LVCMOS25 | DRIVE = 8 | SLEW = SLOW;
NET "rs232_rts_i_pin" LOC = "AK8" | IOSTANDARD = LVCMOS25 | DRIVE = 8 | SLEW = SLOW;
NET "rs232_cts_o_pin" LOC = "AE8" | IOSTANDARD = LVCMOS25 | DRIVE = 8 | SLEW = SLOW;
 
/fsl2serial/trunk/fsl2serial_v1_00_a/docs/README.txt
0,0 → 1,48
In order to use the FSL2Serial module in XPS, follow these steps:
 
1) Place the entire containing folder, fsl2serial_v1_00_a, into your pcores directory.
2) Start XPS (or restart - this may be necessary).
 
3) Click on the "IP Catalog" tab, expand "Project Repository", and insert the FSL2Serial module.
4) Right click on the module name in the "System Assembly View", and select "Configure IP."
- make sure you indicate the correct system reset polarity (usually board reset polarity)
- set your clock speed in MHz (eg, 100). The range is 0-200.
- set your baud rate. Default is 115200, normal people use 9600
5) Insert the following information into the following places:
- pcores/fsl2serial_v1_00_a/docs/fsl2serial.ucf --> data/system.ucf
- pcores/fsl2serial_v1_00_a/docs/fsl2serial.mhs --> system.mhs
 
Note: if XPS is open and you make this change using some other editor,
XPS will override your changes!!
 
6) In the "Ports" view, expand fsl2serial and connect the clock, rst, and rs232 pins.
 
 
Adding the FSL busses:
 
1) In the "IP Catalog" tab, expand "Bus", and add TWO instances of the fsl_v20 bus.
2) For each of these instances,
 
- right click, select "Configure IP"
- uncheck the box that says "External Reset Active High" (if appropriate)
- click "Ok"
 
- in the "Ports" view, expand the bus
- connect the FSL_Clk and FSL_Rst to the system clock and reset
 
3) Back in the "Bus Interface" view:
- attach the Master port of your processor and the Slave port of FSL2serial to one FSL bus.
- attach the Slave port of your processor and the Master port of FSL2serial to the other.
 
 
You should now be ready to write programs that use the FSL2Serial link as serial output.
Sample code is available in the fsl2serial_v1_00_a/code/ directory.
 
 
2007.03.12
Alex Marschner
 
 
 
 
 
/fsl2serial/trunk/fsl2serial_v1_00_a/docs/fsl2serial.mhs
0,0 → 1,4
PORT rs232_tx_data_o_pin = rs232_tx_data_o, DIR = O
PORT rs232_rx_data_i_pin = rs232_rx_data_i, DIR = I
PORT rs232_rts_i_pin = rs232_rts_i, DIR = I
PORT rs232_cts_o_pin = rs232_cts_o, DIR = O
/fsl2serial/trunk/fsl2serial_v1_00_a/data/fsl2serial_v2_1_0.pao
0,0 → 1,11
##############################################################################
## Filename: /home/amarschn/projects/OpenFire_OPB/openfire_2/pcores/fsl2serial_v1_00_a/data/fsl2serial_v2_1_0.pao
## Description: Peripheral Analysis Order
## Date: Thu Feb 22 14:37:13 2007 (by Create and Import Peripheral Wizard)
##############################################################################
 
lib fsl2serial_v1_00_a fsl2serial verilog
lib fsl2serial_v1_00_a fsl_ctrl verilog
lib fsl2serial_v1_00_a serial_ctrl verilog
lib fsl2serial_v1_00_a serial_in verilog
lib fsl2serial_v1_00_a serial_out verilog
/fsl2serial/trunk/fsl2serial_v1_00_a/data/fsl2serial_v2_1_0.mpd
0,0 → 1,47
###################################################################
##
## Name : fsl2serial
## Desc : Microprocessor Peripheral Description
## : Automatically generated by PsfUtility
##
###################################################################
 
BEGIN fsl2serial
 
## Peripheral Options
OPTION IPTYPE = PERIPHERAL
OPTION IMP_NETLIST = TRUE
OPTION HDL = VERILOG
OPTION CORE_STATE = ACTIVE
OPTION IP_GROUP = MICROBLAZE:PPC:USER
 
## Parameters / Generics
PARAMETER EXT_RESET_ACTIVE_HI = 0, DT = INTEGER, RANGE = (0:1), DESC = Reset signal is active high:
PARAMETER CLOCK_FREQ_MHZ = 50, DT = INTEGER, RANGE = (0:200), DESC = Processor speed in MHz:
PARAMETER BAUD_RATE = 115200, DT = INTEGER, VALUES = (2400=2400, 9600=9600, 115200=115200), DESC = Serial communication speed:
 
## Bus Interfaces
BUS_INTERFACE BUS = SFSL, BUS_TYPE = SLAVE, BUS_STD = FSL
BUS_INTERFACE BUS = MFSL, BUS_TYPE = MASTER, BUS_STD = FSL
 
## Generics for VHDL or Parameters for Verilog
 
## Ports
PORT clock = "", DIR = I, SIGIS = CLK
PORT reset = "", DIR = I, SIGIS = RST
PORT rs232_tx_data_o = "", DIR = O
PORT rs232_rx_data_i = "", DIR = I
PORT rs232_rts_i = "", DIR = I
PORT rs232_cts_o = "", DIR = O
PORT FSL_S_DATA = FSL_S_Data, DIR = I, VEC = [0:31], BUS = SFSL
PORT FSL_S_CONTROL = FSL_S_Control, DIR = I, BUS = SFSL
PORT FSL_S_EXISTS = FSL_S_Exists, DIR = I, BUS = SFSL
PORT FSL_M_FULL = FSL_M_Full, DIR = I, BUS = MFSL
PORT FSL_M_DATA = FSL_M_Data, DIR = O, VEC = [0:31], BUS = MFSL
PORT FSL_M_CONTROL = FSL_M_Control, DIR = O, BUS = MFSL
PORT FSL_M_WRITE = FSL_M_Write, DIR = O, BUS = MFSL
PORT FSL_S_READ = FSL_S_Read, DIR = O, BUS = SFSL
PORT FSL_M_CLK = FSL_M_Clk, DIR = O, BUS = MFSL
PORT FSL_S_CLK = FSL_S_Clk, DIR = O, BUS = SFSL
 
END
/fsl2serial/trunk/fsl2serial_v1_00_a/code/fsl_interface.c
0,0 → 1,97
// This is the source file implementing the FSL interface developed for use with the FSL2Serial
// module. Data can also be sent over this link, but the assumption is that text will be sent.
//
// This requires the Xilinx FSL interface code, which can generally be found in fsl.h,
// mb_interface.h, and xbasic_types.h
//
// Alex Marschner
// 2007.03.12
 
#include "fsl_interface.h"
 
// Put a string of data through the specified FSL port.
void fsl0print(const char* s)
{
while(*s)
{
putfsl(*s, FSL0);
++s;
}
return;
}
 
// Put a string of data through the specified FSL port.
void fsl0nprint(const char* s)
{
while(*s)
{
nputfsl(*s, FSL0);
++s;
}
return;
}
 
// Print a single character to the specified FSL port. (BLOCKING)
void fsl0put(const char s)
{
putfsl(s, FSL0);
return;
}
 
// Print a single character to the specified FSL port. (NONBLOCKING)
void fsl0nput(const char s)
{
nputfsl(s, FSL0);
return;
}
 
// Get a single character from the specified FSL port. (BLOCKING)
char fsl0get(char * s)
{
char inchar;
getfsl(inchar, FSL0);
if(s!=NULL) (*s) = inchar;
 
return inchar;
}
 
// Get a single character from the specified FSL port. (NONBLOCKING)
char fsl0nget(char * s)
{
char inchar;
ngetfsl(inchar, FSL0);
if(s!=NULL) (*s) = inchar;
 
return inchar;
}
 
// Print the hexadecimal representation of a 32-bit integer to the specified FSL port.
void fsl0hex(const unsigned int val)
{
char hexstring[10];
unsigned int shiftval = val;
char maskval;
int ctr;
 
for(ctr=9; ctr>1; ctr--)
{
maskval = shiftval & 0x0000000F;
 
if(maskval < 10)
hexstring[ctr] = maskval + 0x30;
else
hexstring[ctr] = maskval + (0x41-0xA);
 
shiftval = shiftval >> 4;
}
 
hexstring[0] = '0';
hexstring[1] = 'x';
 
fsl0print(hexstring);
return;
}
 
/fsl2serial/trunk/fsl2serial_v1_00_a/code/fsl_interface.h
0,0 → 1,47
// This is a header file describing the FSL interface developed for use with the FSL2Serial
// module. Data can also be sent over this link, but the assumption is that text will be sent.
//
// This requires the Xilinx FSL interface code, which can generally be found in fsl.h,
// mb_interface.h, and xbasic_types.h
//
// These functions cannot take the FSL ID as a parameter because the fsl functions used are
// actually macros for asm inline commands.
//
// Alex Marschner
// 2007.03.12
 
#ifndef FSL_INTERFACE_H
#define FSL_INTERFACE_H
 
#include "fsl.h" // getfsl(val, id), putfsl(val, id), (blocking)
// ngetfsl(val, id), nputfsl(val,id) (non blocking)
 
#define BOOL int
#define TRUE 1
#define FALSE 0
 
#define FSL_BLOCKING 1
#define FSL_NONBLOCKING 0
 
#define FSL0 0
 
// Put a string of data through the specified FSL port.
void fsl0print(const char* s);
void fsl0nprint(const char* s);
 
// Print a single character to the specified FSL port.
void fsl0put(const char s);
void fsl0nput(const char s);
 
// Get a single character from the specified FSL port.
char fsl0get(char * s);
char fsl0nget(char * s);
 
// Print the hexadecimal representation of a 32-bit integer to the specified FSL port.
void fsl0hex(const unsigned int val);
 
// Print the decimal representation of a 32-bit unsigned int to the specified FSL port.
//void fsldec(const unsigned int val, const unsigned int id);
 
#endif
 
/fsl2serial/trunk/fsl2serial_v1_00_a/code/makefile
0,0 → 1,10
HDRDIR_1=-I/project/software/Xilinx/EDK8.2/sw/XilinxProcessorIPLib/drivers/common_v1_00_a/src/
HDRDIR_2=-I/project/software/Xilinx/EDK8.2/sw/lib/bsp/standalone_v1_00_a/src/microblaze/
 
all:
mb-gcc -Wall -o ../executable.elf fsl_interface.c openfire_src.c $(HDRDIR_1) $(HDRDIR_2)
 
clean:
rm -rf *~
rm -rf *.o
rm -rf ../executable.elf
fsl2serial/trunk Property changes : Added: svn:mergeinfo ## -0,0 +0,0 ## Index: fsl2serial/web_uploads =================================================================== --- fsl2serial/web_uploads (nonexistent) +++ fsl2serial/web_uploads (revision 4)
fsl2serial/web_uploads Property changes : Added: svn:mergeinfo ## -0,0 +0,0 ## Index: fsl2serial/branches =================================================================== --- fsl2serial/branches (nonexistent) +++ fsl2serial/branches (revision 4)
fsl2serial/branches Property changes : Added: svn:mergeinfo ## -0,0 +0,0 ## Index: fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/hdl/verilog/serial_ctrl.v =================================================================== --- fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/hdl/verilog/serial_ctrl.v (nonexistent) +++ fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/hdl/verilog/serial_ctrl.v (revision 4) @@ -0,0 +1,157 @@ +// This module controls the serial modules. +// +// Alex Marschner +// 2007.02.20 + +`timescale 1 ns / 100 ps + +module serial_ctrl ( + fsl_data_i, fsl_senddata_i, fsl_cts_o, + fsl_data_o, fsl_rxdata_o, fsl_cts_i, + rs232_tx_data_o, rs232_rx_data_i, rs232_rts_i, rs232_cts_o, + clock, reset +); + +parameter CLOCK_FREQ_MHZ = 50; +parameter BAUD_RATE = 115200; + +input wire [7:0] fsl_data_i; +input wire fsl_senddata_i; +output reg fsl_cts_o; +output reg [7:0] fsl_data_o; +output reg fsl_rxdata_o; +input wire fsl_cts_i; +output wire rs232_tx_data_o; +input wire rs232_rx_data_i; // serial == 1 wire :) +input wire rs232_rts_i; +output reg rs232_cts_o; + +input wire clock, reset; + +wire [7:0] rs232_rx_data; +wire rs232_tx_ready; +reg rs232_rts; +wire rs232_rx_have_data; + + /////////////////////////////////////////////////////////////////////////// + // Serial In Module + serial_in + #( + .clk_freq(CLOCK_FREQ_MHZ * 1000000), + .data_rate(BAUD_RATE), + .delay_size(14) + ) serial_in0 ( + .clk(clock), + .rst(reset), + .serial_i(rs232_rx_data_i), // serial input line + .data_o(rs232_rx_data), // parallel data received + .have_data_o(rs232_rx_have_data) // data_exists line + ); + + /////////////////////////////////////////////////////////////////////////// + // Serial Out Module + serial_out + #( + .clk_freq(CLOCK_FREQ_MHZ * 1000000), + .data_rate(BAUD_RATE)) + serial_out0( + .clk(clock), + .rst(reset), + .data_size_i(8), + .data_i(fsl_data_i), // data to send out serially + .start_i(fsl_senddata_i), // start sending trigger + .serial_o(rs232_tx_data_o), // serial output line + .ready_o(rs232_tx_ready) // serial out !busy + ); + + always @ (posedge clock) begin + if(reset) begin + fsl_cts_o <= 1'b0; + fsl_data_o <= 8'h00; + fsl_rxdata_o <= 1'b0; + rs232_cts_o <= 1'b0; + rs232_rts <= 1'b0; + end + else begin + rs232_cts_o <= 1'b1; // always accept data from outside + fsl_cts_o <= rs232_tx_ready; + fsl_data_o <= rs232_rx_data; + rs232_rts <= rs232_rts_i; // incoming data? + fsl_rxdata_o <= fsl_cts_i ? rs232_rx_have_data : fsl_rxdata_o; // we have data + end + end + +endmodule + +/////////////////////////////////////////////////////////////////////////////// + +module serial_ctrl_tb ( ); + +reg [7:0] fsl_data_i; +reg fsl_senddata_i; +wire fsl_cts_o; +wire [7:0] fsl_data_o; +wire fsl_rxdata_o; +reg fsl_cts_i; +wire rs232_tx_data_o; +reg rs232_rx_data_i; +reg rs232_rts_i; +wire rs232_cts_o; +reg clock, reset; + +serial_ctrl serial_ctrl_0( + .fsl_data_i (fsl_data_i), + .fsl_senddata_i (fsl_senddata_i), + .fsl_cts_o (fsl_cts_o), + .fsl_data_o (fsl_data_o), + .fsl_rxdata_o (fsl_rxdata_o), + .fsl_cts_i (fsl_cts_i), + .rs232_tx_data_o (rs232_tx_data_o), + .rs232_rx_data_i (rs232_rx_data_i), + .rs232_rts_i (rs232_rts_i), + .rs232_cts_o (rs232_cts_o), + .clock (clock), + .reset (reset) +); + +initial begin + clock <= 1'b0; + reset <= 1'b1; + fsl_data_i <= 8'h00; + fsl_senddata_i <= 1'b0; + fsl_cts_i <= 1'b0; + rs232_rx_data_i <= 1'b1; + rs232_rts_i <= 1'b0; + + #1000 reset <= 1'b0; + + #1000 fsl_data_i <= 8'hAB; + fsl_senddata_i <= 1'b1; + #60 fsl_senddata_i <= 1'b0; + + #4166400 rs232_rx_data_i <= 1'b0; // start bit + #416640 rs232_rx_data_i <= 1'b1; + #416640 rs232_rx_data_i <= 1'b1; + #416640 rs232_rx_data_i <= 1'b0; + #416640 rs232_rx_data_i <= 1'b1; + #416640 rs232_rx_data_i <= 1'b0; + #416640 rs232_rx_data_i <= 1'b1; + #416640 rs232_rx_data_i <= 1'b0; + #416640 rs232_rx_data_i <= 1'b1; + #416640 rs232_rx_data_i <= 1'b1; // stop bit + + // test logic goes here . . . + +end + + +always @ (posedge clock) begin +// fsl_senddata_i <= 1'b0; +end + +always begin + #20 clock <= ~clock; +end + +endmodule + Index: fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/hdl/verilog/serial_in.v =================================================================== --- fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/hdl/verilog/serial_in.v (nonexistent) +++ fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/hdl/verilog/serial_in.v (revision 4) @@ -0,0 +1,111 @@ +// Todd Fleming 2005 + +`timescale 1 ns / 100 ps + +module serial_in( + clk, + rst, + serial_i, + data_o, + have_data_o, + frame_error_o, + serial_samping_o); + + input clk, rst, serial_i; + output[7:0] data_o; + output have_data_o, frame_error_o, serial_samping_o; + + parameter clk_freq = 100000000; + parameter data_rate = 115200; + parameter bit_length = clk_freq / data_rate; + parameter delay_size = 12; // Must be large enough to store bit_length + parameter use_parity = 0; + parameter parity_is_odd = 1; + + reg[7:0] data_o; + reg parity; + reg have_data_o, frame_error_o, serial_samping_o; + reg temp, buffered_serial; + reg[2:0] state; + reg[delay_size-1:0] delay; + reg[3:0] bits_received; + + parameter state_wait_for_start = 3'd0; + parameter state_wait_for_bit = 3'd1; + parameter state_wait_for_stop = 3'd2; + parameter state_wait_for_parity = 3'd3; + parameter state_frame_error = 3'd4; + + always @(posedge clk) begin + temp <= serial_i; + buffered_serial <= temp; + serial_samping_o <= 1'd0; + + if(rst) begin + data_o <= 8'd0; + have_data_o <= 1'd0; + frame_error_o <= 1'd0; + state <= state_wait_for_start; + end else begin + case(state) + state_wait_for_start: begin + have_data_o <= 1'b0; + frame_error_o <= 1'b0; + if(!buffered_serial) begin + serial_samping_o <= 1'd1; + state <= state_wait_for_bit; + delay <= bit_length + bit_length / 2; + bits_received <= 0; + end + end + + state_wait_for_bit: begin + if(delay == 1) begin + serial_samping_o <= 1'd1; + data_o <= {buffered_serial, data_o[7:1]}; + delay <= bit_length; + bits_received <= bits_received + 1; + if(bits_received == 7) + if(use_parity) + state <= state_wait_for_parity; + else + state <= state_wait_for_stop; + end else + delay <= delay - 1; + end + + state_wait_for_parity: begin + if(delay == 1) begin + serial_samping_o <= 1'd1; + parity <= buffered_serial; + delay <= bit_length; + state <= state_wait_for_stop; + end else + delay <= delay - 1; + end + + state_wait_for_stop: begin + if(delay == 1) begin + serial_samping_o <= 1'd1; + if(buffered_serial) begin + if(!use_parity || ((^data_o) ^ parity) == parity_is_odd) + have_data_o <= 1'b1; + frame_error_o <= 1'b0; + state <= state_wait_for_start; + end else begin + have_data_o <= 1'b0; + frame_error_o <= 1'b1; + state <= state_frame_error; + end + end else + delay <= delay - 1; + end + + state_frame_error: begin + if(buffered_serial) + state <= state_wait_for_start; + end + endcase + end + end +endmodule // serial_in Index: fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/hdl/verilog/fsl2serial.v =================================================================== --- fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/hdl/verilog/fsl2serial.v (nonexistent) +++ fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/hdl/verilog/fsl2serial.v (revision 4) @@ -0,0 +1,249 @@ +// This top level module ties together the FSL control and Serial control +// modules to make an active, two way serial to FSL / FSL to serial bridge. +// +// Alex Marschner +// 2007.02.20 + +`timescale 1 ns / 100 ps + +module fsl2serial( clock, reset, // clock and reset + rs232_tx_data_o, // + rs232_rx_data_i, + rs232_rts_i, + rs232_cts_o, + + FSL_S_CLK, FSL_S_DATA, FSL_S_CONTROL, FSL_S_EXISTS, FSL_S_READ, + FSL_M_CLK, FSL_M_DATA, FSL_M_CONTROL, FSL_M_FULL, FSL_M_WRITE +); + + parameter EXT_RESET_ACTIVE_HI = 0; + parameter CLOCK_FREQ_MHZ = 50; + parameter BAUD_RATE = 115200; + + input wire clock, reset; + output wire rs232_tx_data_o; + input wire rs232_rx_data_i; + input wire rs232_rts_i; + output wire rs232_cts_o; + + input wire [0:31] FSL_S_DATA; + input wire FSL_S_CONTROL; + input wire FSL_S_EXISTS; + input wire FSL_M_FULL; + + output wire [0:31] FSL_M_DATA; + output wire FSL_M_CONTROL; + output wire FSL_M_WRITE; + output wire FSL_S_READ; + + output wire FSL_M_CLK; + output wire FSL_S_CLK; + + wire ser2fsl_cts, fsl2ser_cts; + wire fsl2ser_start, ser2fsl_dataexists; + wire [7:0] ser2fsl_data; + wire [7:0] fsl2ser_data; + + wire reset_correct_polarity; + + assign reset_correct_polarity = EXT_RESET_ACTIVE_HI ? reset : ~reset; + + assign FSL_M_DATA[0:23] = 24'b0; // only use last byte since we are dealing with serial characters + +fsl_ctrl fsl_ctrl0( + .FSL_S_CLK (FSL_S_CLK), + .FSL_S_DATA (FSL_S_DATA[24:31]), + .FSL_S_CONTROL (FSL_S_CONTROL), + .FSL_S_EXISTS (FSL_S_EXISTS), + .FSL_S_READ (FSL_S_READ), + .FSL_M_CLK (FSL_M_CLK), + .FSL_M_DATA (FSL_M_DATA[24:31]), + .FSL_M_CONTROL (FSL_M_CONTROL), + .FSL_M_FULL (FSL_M_FULL), + .FSL_M_WRITE (FSL_M_WRITE), + .rs232_tx_ready (ser2fsl_cts), + .rs232_tx_data (fsl2ser_data), + .rs232_tx_start (fsl2ser_start), + .rs232_rx_ready (fsl2ser_cts), + .rs232_rx_data (ser2fsl_data), + .rs232_rx_exists (ser2fsl_dataexists), + .clock (clock), + .reset (reset_correct_polarity) +); + +serial_ctrl #( + .CLOCK_FREQ_MHZ(CLOCK_FREQ_MHZ), + .BAUD_RATE(BAUD_RATE) + ) serial_ctrl0 ( + .fsl_data_i (fsl2ser_data), + .fsl_senddata_i (fsl2ser_start), + .fsl_cts_o (ser2fsl_cts), + .fsl_data_o (ser2fsl_data), + .fsl_rxdata_o (ser2fsl_dataexists), + .fsl_cts_i (fsl2ser_cts), + .rs232_tx_data_o (rs232_tx_data_o), + .rs232_rx_data_i (rs232_rx_data_i), + .rs232_rts_i (rs232_rts_i), + .rs232_cts_o (rs232_cts_o), + .clock (clock), + .reset (reset_correct_polarity) +); + +/* + //----------------------------------------------------------------- + // + // ICON/ILA core wire declarations + // + //----------------------------------------------------------------- + wire [35:0] control0; + wire [31:0] trig0; + + assign trig0 = {FSL_S_DATA[24:31],FSL_S_READ,FSL_S_EXISTS, + fsl2ser_data,fsl2ser_start,ser2fsl_cts, + rs232_tx_data_o, rs232_cts_o, reset_correct_polarity, 9'b0}; + + //----------------------------------------------------------------- + // + // ICON core instance + // + //----------------------------------------------------------------- + icon i_icon + ( + .control0(control0) + ); + + //----------------------------------------------------------------- + // + // ILA core instance + // + //----------------------------------------------------------------- + ila i_ila + ( + .control(control0), + .clk(clock), + .trig0(trig0) + ); + +endmodule + + +//------------------------------------------------------------------- +// +// ICON core module declaration +// +//------------------------------------------------------------------- +module icon + ( + control0 + ); + output [35:0] control0; +endmodule + +//------------------------------------------------------------------- +// +// ILA core module declaration +// +//------------------------------------------------------------------- +module ila + ( + control, + clk, + trig0 + ); + input [35:0] control; + input clk; + input [31:0] trig0;*/ +endmodule + +/////////////////////////////////////////////////////////////////////////////// + +// TBD: +// [x] test the FSL 2 Serial direction +// [ ] test the Serial 2 FSL direction + +module fsl2serial_tb ( ); + +reg clock, reset_n; +wire rs232_tx_data_o; +reg rs232_rx_data_i; +reg rs232_rts_i; +wire rs232_cts_o; + +reg [0:31] FSL_S_DATA; +reg FSL_S_CONTROL; +wire [0:31] FSL_M_DATA; +wire FSL_M_CONTROL; +wire FSL_S_CLK, FSL_M_CLK; +wire FSL_M_WRITE, FSL_S_READ; +reg FSL_M_FULL, FSL_S_EXISTS; + +initial begin + clock <= 1'b0; + reset_n <= 1'b0; + rs232_rx_data_i <= 1'b1; + rs232_rts_i <= 1'b0; + FSL_S_DATA <= 32'h00000000; + FSL_S_CONTROL <= 1'b0; + FSL_M_FULL <= 1'b0; + FSL_S_EXISTS <= 1'b0; + + #1000 reset_n <= 1'b1; + + #1000 FSL_S_DATA <= 8'hA0; + FSL_S_EXISTS <= 1'b1; + while(~&FSL_S_READ) #1 FSL_S_EXISTS <= 1'b1; + while( &FSL_S_READ) #1 FSL_S_EXISTS <= 1'b1; + FSL_S_EXISTS <= 1'b0; + + #1000 FSL_S_DATA <= FSL_S_DATA + 1; + FSL_S_EXISTS <= 1'b1; + while(~&FSL_S_READ) #1 FSL_S_EXISTS <= 1'b1; + while( &FSL_S_READ) #1 FSL_S_EXISTS <= 1'b1; + FSL_S_EXISTS <= 1'b0; + + #1000 FSL_S_DATA <= FSL_S_DATA + 1; + FSL_S_EXISTS <= 1'b1; + while(~&FSL_S_READ) #1 FSL_S_EXISTS <= 1'b1; + while( &FSL_S_READ) #1 FSL_S_EXISTS <= 1'b1; + FSL_S_EXISTS <= 1'b0; + + #2070750 rs232_rx_data_i <= 1'b0; // start bit + #207075 rs232_rx_data_i <= 1'b1; + #207075 rs232_rx_data_i <= 1'b1; + #207075 rs232_rx_data_i <= 1'b0; + #207075 rs232_rx_data_i <= 1'b1; + #207075 rs232_rx_data_i <= 1'b0; + #207075 rs232_rx_data_i <= 1'b1; + #207075 rs232_rx_data_i <= 1'b0; + #207075 rs232_rx_data_i <= 1'b1; + #207075 rs232_rx_data_i <= 1'b1; // stop bit + + + +end + +always begin + #10 clock <= ~clock; // 50MHz +end + +fsl2serial bridge( + .clock (clock), + .reset (reset_n), + .rs232_tx_data_o (rs232_tx_data_o), + .rs232_rx_data_i (rs232_rx_data_i), + .rs232_rts_i (rs232_rts_i), + .rs232_cts_o (rs232_cts_o), + .FSL_S_CLK (FSL_S_CLK), + .FSL_S_DATA (FSL_S_DATA), + .FSL_S_CONTROL (FSL_S_CONTROL), + .FSL_S_EXISTS (FSL_S_EXISTS), + .FSL_S_READ (FSL_S_READ), + .FSL_M_CLK (FSL_M_CLK), + .FSL_M_DATA (FSL_M_DATA), + .FSL_M_CONTROL (FSL_M_CONTROL), + .FSL_M_FULL (FSL_M_FULL), + .FSL_M_WRITE (FSL_M_WRITE) +); + +endmodule + Index: fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/hdl/verilog/serial_out.v =================================================================== --- fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/hdl/verilog/serial_out.v (nonexistent) +++ fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/hdl/verilog/serial_out.v (revision 4) @@ -0,0 +1,162 @@ +// Todd Fleming 2005 + +`timescale 1 ns / 100 ps + +module serial_out( + clk, + rst, + data_size_i, + data_i, + start_i, + serial_o, + ready_o, + bit_sync_o); + + parameter clk_freq = 100000000; + parameter data_rate = 115200; + parameter bit_length = clk_freq / data_rate; + parameter delay_size = 32; // Must be large enough to store bit_length + parameter max_data_size = 8; + parameter data_size_size = 4; // Must be large enough to store max_data_size + parameter use_start = 1; + parameter use_stop = 1; + parameter use_parity = 0; + parameter stop_value = 1; + parameter parity_is_odd = 1; + + input clk, rst; + input[data_size_size-1:0] data_size_i; + input[max_data_size-1:0] data_i; + input start_i; + output serial_o; + output ready_o; + output bit_sync_o; + + reg[2:0] state; + reg[data_size_size-1:0] data_size; + reg[max_data_size-1:0] data; + reg[delay_size-1:0] delay; + reg[max_data_size-1:0] num_sent; + reg serial_o; + reg bit_sync_o; + + parameter state_wait_for_start = 3'd0; + parameter state_send_start = 3'd1; + parameter state_send_bit = 3'd2; + parameter state_send_parity = 3'd3; + parameter state_send_stop = 3'd4; + + assign ready_o = + (state == state_wait_for_start || state == state_send_stop && delay == 1) && !start_i; + + always @(posedge clk) begin + bit_sync_o <= 0; + + if(rst) begin + state <= state_wait_for_start; + end else begin + delay <= delay - 1; + + case(state) + state_wait_for_start: begin + serial_o <= stop_value; + if(start_i) begin + data_size <= data_size_i; + data <= data_i; + num_sent <= 0; + if(use_start) begin + serial_o <= ~stop_value; + delay <= bit_length - 1; + state <= state_send_start; + end else begin + serial_o <= data_i[0]; + delay <= bit_length - 1; + state <= state_send_bit; + end + end + end + state_send_start: begin + serial_o <= ~stop_value; + if(delay == 1) begin + delay <= bit_length; + state <= state_send_bit; + end + end + state_send_bit: begin + serial_o <= data[0]; + if(delay == bit_length - 2) + bit_sync_o <= 1; + if(delay == 1) begin + delay <= bit_length; + data <= data >> 1; + num_sent <= num_sent + 1; + if(num_sent == data_size - 1) + if(use_parity) + state <= state_send_parity; + else if(use_stop) + state <= state_send_stop; + else + state <= state_wait_for_start; + end + end + state_send_parity: begin + serial_o <= (^data[0]) ^ parity_is_odd; + if(delay == 1) begin + delay <= bit_length; + state <= state_send_stop; + end + end + state_send_stop: begin + serial_o <= stop_value; + if(delay == 1) begin + delay <= bit_length; + state <= state_wait_for_start; + end + end + endcase + end + end +endmodule // serial_out + +/////////////////////////////////////////////////////////////////////////////// + +module serial_out_tb ( ); + +reg clock, reset; +reg [7:0] fsl_data_i; +reg fsl_senddata_i; +wire rs232_tx_data_o; +wire rs232_tx_ready; + +initial begin + clock <= 1'b0; + reset <= 1'b1; + fsl_data_i <= 8'h00; + fsl_senddata_i <= 1'b0; + + #1000 reset <= 1'b0; + #1000 fsl_data_i <= 8'h0A; + fsl_senddata_i <= 1'b1; + #60 fsl_senddata_i <= 1'b0; +end + +always begin + #10 clock <= ~clock; +end + +// Serial Out Module + serial_out + #( + .clk_freq(50000000), + .data_rate(115200)) + serial_out0( + .clk(clock), + .rst(reset), + .data_size_i(8), + .data_i(fsl_data_i), // data to send out serially + .start_i(fsl_senddata_i), // start sending trigger + .serial_o(rs232_tx_data_o), // serial output line + .ready_o(rs232_tx_ready) // serial out !busy + ); + +endmodule Index: fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/hdl/verilog/fsl_ctrl.v =================================================================== --- fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/hdl/verilog/fsl_ctrl.v (nonexistent) +++ fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/hdl/verilog/fsl_ctrl.v (revision 4) @@ -0,0 +1,149 @@ +// This module sends the correct control signals to the slave FSL port in +// order to get the data out. +// +// Alex Marschner +// 2007.02.20 + +`timescale 1 ns / 100 ps + +module fsl_ctrl ( + FSL_S_CLK, FSL_S_DATA, FSL_S_CONTROL, FSL_S_EXISTS, FSL_S_READ, + FSL_M_CLK, FSL_M_DATA, FSL_M_CONTROL, FSL_M_FULL, FSL_M_WRITE, + rs232_tx_ready, rs232_tx_data, rs232_tx_start, + rs232_rx_ready, rs232_rx_data, rs232_rx_exists, + clock, reset +); + +output wire FSL_S_CLK; +input wire [0:7] FSL_S_DATA; +input wire FSL_S_CONTROL; +input wire FSL_S_EXISTS; +output reg FSL_S_READ; + +output wire FSL_M_CLK; +output reg [0:7] FSL_M_DATA; +output reg FSL_M_CONTROL; +input wire FSL_M_FULL; +output reg FSL_M_WRITE; + +output reg rs232_rx_ready; +input wire [7:0] rs232_rx_data; +input wire rs232_rx_exists; + +input wire rs232_tx_ready; +output wire [7:0] rs232_tx_data; +output wire rs232_tx_start; + +input wire clock, reset; + +assign FSL_S_CLK = clock; +//assign FSL_M_CLK = clock; + +assign rs232_tx_data = FSL_S_DATA; +assign rs232_tx_start = FSL_S_READ; + +always @ (posedge clock) begin + if(reset) begin + FSL_S_READ <= 1'b0; + FSL_M_DATA <= 8'h00; + FSL_M_CONTROL <= 1'b0; + FSL_M_WRITE <= 1'b0; + rs232_rx_ready <= 1'b0; + end + else begin + FSL_S_READ <= (FSL_S_EXISTS & (~FSL_S_READ) & rs232_tx_ready) ? 1'b1 : 1'b0; + FSL_M_DATA <= rs232_rx_data; + FSL_M_CONTROL <= 1'b0; + FSL_M_WRITE <= (!FSL_M_FULL & (~FSL_M_WRITE) & rs232_rx_exists) ? 1'b1 : 1'b0; + rs232_rx_ready <= 1'b1; // always ready to get data from outside + end +end + +endmodule + +/////////////////////////////////////////////////////////////////////////////// + +module fsl_ctrl_tb ( ); + +reg clock, reset; +wire FSL_S_CLK, FSL_S_READ; +reg [0:7] FSL_S_DATA; +reg FSL_S_CONTROL; +reg FSL_S_EXISTS; +reg rs232_tx_ready; +wire [7:0] rs232_tx_data; +wire rs232_tx_start; +reg [7:0] registered_out; + + +fsl_ctrl fsl_ctrl_0( + .FSL_S_CLK (FSL_S_CLK), + .FSL_S_DATA (FSL_S_DATA), + .FSL_S_CONTROL (FSL_S_CONTROL), + .FSL_S_EXISTS (FSL_S_EXISTS), + .FSL_S_READ (FSL_S_READ), + .rs232_tx_ready (rs232_tx_ready), + .rs232_tx_data (rs232_tx_data), + .rs232_tx_start (rs232_tx_start), + .clock (clock), + .reset (reset) +); + +initial begin + clock <= 1'b0; + reset <= 1'b1; + FSL_S_DATA <= 8'h00; + FSL_S_CONTROL <= 1'b0; + FSL_S_EXISTS <= 1'b0; + rs232_tx_ready <= 1'b0; + + #1000 reset <= 1'b0; + #20 rs232_tx_ready <= 1'b1; + + #1000 FSL_S_DATA <= 8'hA0; + FSL_S_EXISTS <= 1'b1; + while(~&FSL_S_READ) #1 FSL_S_EXISTS <= 1'b1; + while( &FSL_S_READ) #1 FSL_S_EXISTS <= 1'b1; + FSL_S_EXISTS <= 1'b0; + + #1000 FSL_S_DATA <= FSL_S_DATA + 1; + FSL_S_EXISTS <= 1'b1; + while(~&FSL_S_READ) #1 FSL_S_EXISTS <= 1'b1; + while( &FSL_S_READ) #1 FSL_S_EXISTS <= 1'b1; + FSL_S_EXISTS <= 1'b0; + + #1000 FSL_S_DATA <= FSL_S_DATA + 1; + FSL_S_EXISTS <= 1'b1; + while(~&FSL_S_READ) #1 FSL_S_EXISTS <= 1'b1; + while( &FSL_S_READ) #1 FSL_S_EXISTS <= 1'b1; + FSL_S_EXISTS <= 1'b0; + + #1000 while(1) FSL_S_EXISTS <= 1'b0; +end + +always @ (posedge clock) begin + if(reset) registered_out <= 8'b0; + else registered_out <= rs232_tx_start ? rs232_tx_data : registered_out; +end + +always @ (posedge clock) begin + if(reset) rs232_tx_ready <= 1'b0; + else begin + if(rs232_tx_start) begin + rs232_tx_ready <= 1'b0; + #4000 rs232_tx_ready <= 1'b1; + end + end +end + +always @ (posedge clock) begin + FSL_S_EXISTS <= (FSL_S_EXISTS && FSL_S_READ) ? 1'b0 : FSL_S_EXISTS; + FSL_S_DATA <= (FSL_S_EXISTS && FSL_S_READ) ? (FSL_S_DATA+1) : FSL_S_DATA; +end + +always begin + #20 clock <= ~clock; +end + +endmodule + Index: fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/docs/fsl2serial.ucf =================================================================== --- fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/docs/fsl2serial.ucf (nonexistent) +++ fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/docs/fsl2serial.ucf (revision 4) @@ -0,0 +1,7 @@ +#### Module FSL2Serial Constraints #### + +NET "rs232_tx_data_o_pin" LOC = "AE7" | IOSTANDARD = LVCMOS25 | DRIVE = 8 | SLEW = SLOW; +NET "rs232_rx_data_i_pin" LOC = "AJ8" | IOSTANDARD = LVCMOS25 | DRIVE = 8 | SLEW = SLOW; +NET "rs232_rts_i_pin" LOC = "AK8" | IOSTANDARD = LVCMOS25 | DRIVE = 8 | SLEW = SLOW; +NET "rs232_cts_o_pin" LOC = "AE8" | IOSTANDARD = LVCMOS25 | DRIVE = 8 | SLEW = SLOW; + Index: fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/docs/README.txt =================================================================== --- fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/docs/README.txt (nonexistent) +++ fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/docs/README.txt (revision 4) @@ -0,0 +1,48 @@ +In order to use the FSL2Serial module in XPS, follow these steps: + +1) Place the entire containing folder, fsl2serial_v1_00_a, into your pcores directory. +2) Start XPS (or restart - this may be necessary). + +3) Click on the "IP Catalog" tab, expand "Project Repository", and insert the FSL2Serial module. +4) Right click on the module name in the "System Assembly View", and select "Configure IP." + - make sure you indicate the correct system reset polarity (usually board reset polarity) + - set your clock speed in MHz (eg, 100). The range is 0-200. + - set your baud rate. Default is 115200, normal people use 9600 +5) Insert the following information into the following places: + - pcores/fsl2serial_v1_00_a/docs/fsl2serial.ucf --> data/system.ucf + - pcores/fsl2serial_v1_00_a/docs/fsl2serial.mhs --> system.mhs + + Note: if XPS is open and you make this change using some other editor, + XPS will override your changes!! + +6) In the "Ports" view, expand fsl2serial and connect the clock, rst, and rs232 pins. + + +Adding the FSL busses: + +1) In the "IP Catalog" tab, expand "Bus", and add TWO instances of the fsl_v20 bus. +2) For each of these instances, + + - right click, select "Configure IP" + - uncheck the box that says "External Reset Active High" (if appropriate) + - click "Ok" + + - in the "Ports" view, expand the bus + - connect the FSL_Clk and FSL_Rst to the system clock and reset + +3) Back in the "Bus Interface" view: + - attach the Master port of your processor and the Slave port of FSL2serial to one FSL bus. + - attach the Slave port of your processor and the Master port of FSL2serial to the other. + + +You should now be ready to write programs that use the FSL2Serial link as serial output. +Sample code is available in the fsl2serial_v1_00_a/code/ directory. + + +2007.03.12 +Alex Marschner + + + + + Index: fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/docs/fsl2serial.mhs =================================================================== --- fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/docs/fsl2serial.mhs (nonexistent) +++ fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/docs/fsl2serial.mhs (revision 4) @@ -0,0 +1,4 @@ + PORT rs232_tx_data_o_pin = rs232_tx_data_o, DIR = O + PORT rs232_rx_data_i_pin = rs232_rx_data_i, DIR = I + PORT rs232_rts_i_pin = rs232_rts_i, DIR = I + PORT rs232_cts_o_pin = rs232_cts_o, DIR = O Index: fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/data/fsl2serial_v2_1_0.pao =================================================================== --- fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/data/fsl2serial_v2_1_0.pao (nonexistent) +++ fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/data/fsl2serial_v2_1_0.pao (revision 4) @@ -0,0 +1,11 @@ +############################################################################## +## Filename: /home/amarschn/projects/OpenFire_OPB/openfire_2/pcores/fsl2serial_v1_00_a/data/fsl2serial_v2_1_0.pao +## Description: Peripheral Analysis Order +## Date: Thu Feb 22 14:37:13 2007 (by Create and Import Peripheral Wizard) +############################################################################## + +lib fsl2serial_v1_00_a fsl2serial verilog +lib fsl2serial_v1_00_a fsl_ctrl verilog +lib fsl2serial_v1_00_a serial_ctrl verilog +lib fsl2serial_v1_00_a serial_in verilog +lib fsl2serial_v1_00_a serial_out verilog Index: fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/data/fsl2serial_v2_1_0.mpd =================================================================== --- fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/data/fsl2serial_v2_1_0.mpd (nonexistent) +++ fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/data/fsl2serial_v2_1_0.mpd (revision 4) @@ -0,0 +1,47 @@ +################################################################### +## +## Name : fsl2serial +## Desc : Microprocessor Peripheral Description +## : Automatically generated by PsfUtility +## +################################################################### + +BEGIN fsl2serial + +## Peripheral Options +OPTION IPTYPE = PERIPHERAL +OPTION IMP_NETLIST = TRUE +OPTION HDL = VERILOG +OPTION CORE_STATE = ACTIVE +OPTION IP_GROUP = MICROBLAZE:PPC:USER + +## Parameters / Generics +PARAMETER EXT_RESET_ACTIVE_HI = 0, DT = INTEGER, RANGE = (0:1), DESC = Reset signal is active high: +PARAMETER CLOCK_FREQ_MHZ = 50, DT = INTEGER, RANGE = (0:200), DESC = Processor speed in MHz: +PARAMETER BAUD_RATE = 115200, DT = INTEGER, VALUES = (2400=2400, 9600=9600, 115200=115200), DESC = Serial communication speed: + +## Bus Interfaces +BUS_INTERFACE BUS = SFSL, BUS_TYPE = SLAVE, BUS_STD = FSL +BUS_INTERFACE BUS = MFSL, BUS_TYPE = MASTER, BUS_STD = FSL + +## Generics for VHDL or Parameters for Verilog + +## Ports +PORT clock = "", DIR = I, SIGIS = CLK +PORT reset = "", DIR = I, SIGIS = RST +PORT rs232_tx_data_o = "", DIR = O +PORT rs232_rx_data_i = "", DIR = I +PORT rs232_rts_i = "", DIR = I +PORT rs232_cts_o = "", DIR = O +PORT FSL_S_DATA = FSL_S_Data, DIR = I, VEC = [0:31], BUS = SFSL +PORT FSL_S_CONTROL = FSL_S_Control, DIR = I, BUS = SFSL +PORT FSL_S_EXISTS = FSL_S_Exists, DIR = I, BUS = SFSL +PORT FSL_M_FULL = FSL_M_Full, DIR = I, BUS = MFSL +PORT FSL_M_DATA = FSL_M_Data, DIR = O, VEC = [0:31], BUS = MFSL +PORT FSL_M_CONTROL = FSL_M_Control, DIR = O, BUS = MFSL +PORT FSL_M_WRITE = FSL_M_Write, DIR = O, BUS = MFSL +PORT FSL_S_READ = FSL_S_Read, DIR = O, BUS = SFSL +PORT FSL_M_CLK = FSL_M_Clk, DIR = O, BUS = MFSL +PORT FSL_S_CLK = FSL_S_Clk, DIR = O, BUS = SFSL + +END Index: fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/code/fsl_interface.c =================================================================== --- fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/code/fsl_interface.c (nonexistent) +++ fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/code/fsl_interface.c (revision 4) @@ -0,0 +1,97 @@ +// This is the source file implementing the FSL interface developed for use with the FSL2Serial +// module. Data can also be sent over this link, but the assumption is that text will be sent. +// +// This requires the Xilinx FSL interface code, which can generally be found in fsl.h, +// mb_interface.h, and xbasic_types.h +// +// Alex Marschner +// 2007.03.12 + +#include "fsl_interface.h" + +// Put a string of data through the specified FSL port. +void fsl0print(const char* s) +{ + while(*s) + { + putfsl(*s, FSL0); + ++s; + } + return; +} + +// Put a string of data through the specified FSL port. +void fsl0nprint(const char* s) +{ + while(*s) + { + nputfsl(*s, FSL0); + ++s; + } + return; +} + +// Print a single character to the specified FSL port. (BLOCKING) +void fsl0put(const char s) +{ + putfsl(s, FSL0); + return; +} + +// Print a single character to the specified FSL port. (NONBLOCKING) +void fsl0nput(const char s) +{ + nputfsl(s, FSL0); + return; +} + +// Get a single character from the specified FSL port. (BLOCKING) +char fsl0get(char * s) +{ + char inchar; + + getfsl(inchar, FSL0); + if(s!=NULL) (*s) = inchar; + + return inchar; +} + +// Get a single character from the specified FSL port. (NONBLOCKING) +char fsl0nget(char * s) +{ + char inchar; + + ngetfsl(inchar, FSL0); + if(s!=NULL) (*s) = inchar; + + return inchar; +} + +// Print the hexadecimal representation of a 32-bit integer to the specified FSL port. +void fsl0hex(const unsigned int val) +{ + char hexstring[10]; + unsigned int shiftval = val; + char maskval; + int ctr; + + for(ctr=9; ctr>1; ctr--) + { + maskval = shiftval & 0x0000000F; + + if(maskval < 10) + hexstring[ctr] = maskval + 0x30; + else + hexstring[ctr] = maskval + (0x41-0xA); + + shiftval = shiftval >> 4; + } + + hexstring[0] = '0'; + hexstring[1] = 'x'; + + fsl0print(hexstring); + + return; +} + Index: fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/code/fsl_interface.h =================================================================== --- fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/code/fsl_interface.h (nonexistent) +++ fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/code/fsl_interface.h (revision 4) @@ -0,0 +1,47 @@ +// This is a header file describing the FSL interface developed for use with the FSL2Serial +// module. Data can also be sent over this link, but the assumption is that text will be sent. +// +// This requires the Xilinx FSL interface code, which can generally be found in fsl.h, +// mb_interface.h, and xbasic_types.h +// +// These functions cannot take the FSL ID as a parameter because the fsl functions used are +// actually macros for asm inline commands. +// +// Alex Marschner +// 2007.03.12 + +#ifndef FSL_INTERFACE_H +#define FSL_INTERFACE_H + +#include "fsl.h" // getfsl(val, id), putfsl(val, id), (blocking) + // ngetfsl(val, id), nputfsl(val,id) (non blocking) + +#define BOOL int +#define TRUE 1 +#define FALSE 0 + +#define FSL_BLOCKING 1 +#define FSL_NONBLOCKING 0 + +#define FSL0 0 + +// Put a string of data through the specified FSL port. +void fsl0print(const char* s); +void fsl0nprint(const char* s); + +// Print a single character to the specified FSL port. +void fsl0put(const char s); +void fsl0nput(const char s); + +// Get a single character from the specified FSL port. +char fsl0get(char * s); +char fsl0nget(char * s); + +// Print the hexadecimal representation of a 32-bit integer to the specified FSL port. +void fsl0hex(const unsigned int val); + +// Print the decimal representation of a 32-bit unsigned int to the specified FSL port. +//void fsldec(const unsigned int val, const unsigned int id); + +#endif + Index: fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/code/makefile =================================================================== --- fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/code/makefile (nonexistent) +++ fsl2serial/tags/fsl2serial_v1_00_a/fsl2serial_v1_00_a/code/makefile (revision 4) @@ -0,0 +1,10 @@ +HDRDIR_1=-I/project/software/Xilinx/EDK8.2/sw/XilinxProcessorIPLib/drivers/common_v1_00_a/src/ +HDRDIR_2=-I/project/software/Xilinx/EDK8.2/sw/lib/bsp/standalone_v1_00_a/src/microblaze/ + +all: + mb-gcc -Wall -o ../executable.elf fsl_interface.c openfire_src.c $(HDRDIR_1) $(HDRDIR_2) + +clean: + rm -rf *~ + rm -rf *.o + rm -rf ../executable.elf Index: fsl2serial/tags =================================================================== --- fsl2serial/tags (nonexistent) +++ fsl2serial/tags (revision 4)
fsl2serial/tags Property changes : Added: svn:mergeinfo ## -0,0 +0,0 ##

powered by: WebSVN 2.1.0

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