URL
https://opencores.org/ocsvn/uart2bus/uart2bus/trunk
Subversion Repositories uart2bus
Compare Revisions
- This comparison shows the changes necessary to convert path
/
- from Rev 2 to Rev 1
- ↔ Reverse comparison
Rev 2 → Rev 1
/uart2bus/trunk/verilog/sim/icarus/test.txt
File deleted
\ No newline at end of file
/uart2bus/trunk/verilog/sim/icarus/compile.bat
File deleted
/uart2bus/trunk/verilog/sim/icarus/test.bin
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
uart2bus/trunk/verilog/sim/icarus/test.bin
Property changes :
Deleted: svn:mime-type
## -1 +0,0 ##
-application/octet-stream
\ No newline at end of property
Index: uart2bus/trunk/verilog/sim/icarus/block.cfg
===================================================================
--- uart2bus/trunk/verilog/sim/icarus/block.cfg (revision 2)
+++ uart2bus/trunk/verilog/sim/icarus/block.cfg (nonexistent)
@@ -1,9 +0,0 @@
-+incdir+../../bench
-../../rtl/baud_gen.v
-../../rtl/uart_tx.v
-../../rtl/uart_rx.v
-../../rtl/uart_top.v
-../../rtl/uart_parser.v
-../../rtl/uart2bus_top.v
-../../bench/reg_file_model.v
-../../bench/tb_uart2bus_top.v
Index: uart2bus/trunk/verilog/sim/icarus/run.bat
===================================================================
--- uart2bus/trunk/verilog/sim/icarus/run.bat (revision 2)
+++ uart2bus/trunk/verilog/sim/icarus/run.bat (nonexistent)
@@ -1 +0,0 @@
-vvp -l test.log test.vvp
Index: uart2bus/trunk/verilog/sim/icarus/gtk.bat
===================================================================
--- uart2bus/trunk/verilog/sim/icarus/gtk.bat (revision 2)
+++ uart2bus/trunk/verilog/sim/icarus/gtk.bat (nonexistent)
@@ -1 +0,0 @@
-gtkwave test.vcd -a test.sav
Index: uart2bus/trunk/verilog/syn/altera/uart2bus_top.qsf
===================================================================
--- uart2bus/trunk/verilog/syn/altera/uart2bus_top.qsf (revision 2)
+++ uart2bus/trunk/verilog/syn/altera/uart2bus_top.qsf (nonexistent)
@@ -1,62 +0,0 @@
-# -------------------------------------------------------------------------- #
-#
-# Copyright (C) 1991-2009 Altera Corporation
-# Your use of Altera Corporation's design tools, logic functions
-# and other software and tools, and its AMPP partner logic
-# functions, and any output files from any of the foregoing
-# (including device programming or simulation files), and any
-# associated documentation or information are expressly subject
-# to the terms and conditions of the Altera Program License
-# Subscription Agreement, Altera MegaCore Function License
-# Agreement, or other applicable license agreement, including,
-# without limitation, that your use is for the sole purpose of
-# programming logic devices manufactured by Altera and sold by
-# Altera or its authorized distributors. Please refer to the
-# applicable agreement for further details.
-#
-# -------------------------------------------------------------------------- #
-#
-# Quartus II
-# Version 9.0 Build 235 06/17/2009 Service Pack 2 SJ Web Edition
-# Date created = 13:37:13 February 13, 2010
-#
-# -------------------------------------------------------------------------- #
-#
-# Notes:
-#
-# 1) The default values for assignments are stored in the file:
-# uart2bus_top_assignment_defaults.qdf
-# If this file doesn't exist, see file:
-# assignment_defaults.qdf
-#
-# 2) Altera recommends that you do not modify this file. This
-# file is updated automatically by the Quartus II software
-# and any changes you make may be lost or overwritten.
-#
-# -------------------------------------------------------------------------- #
-
-
-set_global_assignment -name FAMILY "Stratix III"
-set_global_assignment -name DEVICE AUTO
-set_global_assignment -name TOP_LEVEL_ENTITY uart2bus_top
-set_global_assignment -name ORIGINAL_QUARTUS_VERSION "9.0 SP2"
-set_global_assignment -name PROJECT_CREATION_TIME_DATE "13:37:13 FEBRUARY 13, 2010"
-set_global_assignment -name LAST_QUARTUS_VERSION "9.0 SP2"
-set_global_assignment -name EDA_SIMULATION_TOOL "Custom Verilog HDL"
-set_global_assignment -name EDA_TIME_SCALE "1 ps" -section_id eda_simulation
-set_global_assignment -name EDA_OUTPUT_DATA_FORMAT "VERILOG HDL" -section_id eda_simulation
-set_global_assignment -name USE_GENERATED_PHYSICAL_CONSTRAINTS OFF -section_id eda_blast_fpga
-set_global_assignment -name SEARCH_PATH ..\\..\\rtl\\verilog/
-set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top
-set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top
-set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top
-set_global_assignment -name LL_ROOT_REGION ON -section_id "Root Region"
-set_global_assignment -name LL_MEMBER_STATE LOCKED -section_id "Root Region"
-set_global_assignment -name VERILOG_FILE ../../rtl/baud_gen.v
-set_global_assignment -name VERILOG_FILE ../../rtl/uart2bus_top.v
-set_global_assignment -name VERILOG_FILE ../../rtl/uart_parser.v
-set_global_assignment -name VERILOG_FILE ../../rtl/uart_rx.v
-set_global_assignment -name VERILOG_FILE ../../rtl/uart_top.v
-set_global_assignment -name VERILOG_FILE ../../rtl/uart_tx.v
-set_global_assignment -name TIMEQUEST_DO_REPORT_TIMING ON
-set_global_assignment -name USE_CONFIGURATION_DEVICE OFF
\ No newline at end of file
Index: uart2bus/trunk/verilog/syn/altera/uart2bus.qpf
===================================================================
--- uart2bus/trunk/verilog/syn/altera/uart2bus.qpf (revision 2)
+++ uart2bus/trunk/verilog/syn/altera/uart2bus.qpf (nonexistent)
@@ -1,30 +0,0 @@
-# -------------------------------------------------------------------------- #
-#
-# Copyright (C) 1991-2009 Altera Corporation
-# Your use of Altera Corporation's design tools, logic functions
-# and other software and tools, and its AMPP partner logic
-# functions, and any output files from any of the foregoing
-# (including device programming or simulation files), and any
-# associated documentation or information are expressly subject
-# to the terms and conditions of the Altera Program License
-# Subscription Agreement, Altera MegaCore Function License
-# Agreement, or other applicable license agreement, including,
-# without limitation, that your use is for the sole purpose of
-# programming logic devices manufactured by Altera and sold by
-# Altera or its authorized distributors. Please refer to the
-# applicable agreement for further details.
-#
-# -------------------------------------------------------------------------- #
-#
-# Quartus II
-# Version 9.0 Build 235 06/17/2009 Service Pack 2 SJ Web Edition
-# Date created = 13:37:13 February 13, 2010
-#
-# -------------------------------------------------------------------------- #
-
-QUARTUS_VERSION = "9.0"
-DATE = "13:37:13 February 13, 2010"
-
-# Revisions
-
-PROJECT_REVISION = "uart2bus_top"
Index: uart2bus/trunk/verilog/syn/altera/uart2bus.qws
===================================================================
--- uart2bus/trunk/verilog/syn/altera/uart2bus.qws (revision 2)
+++ uart2bus/trunk/verilog/syn/altera/uart2bus.qws (nonexistent)
@@ -1,4 +0,0 @@
-[ProjectWorkspace]
-ptn_Child1=Frames
-[ProjectWorkspace.Frames]
-ptn_Child1=ChildFrames
Index: uart2bus/trunk/verilog/syn/xilinx/uart2bus.xise
===================================================================
--- uart2bus/trunk/verilog/syn/xilinx/uart2bus.xise (revision 2)
+++ uart2bus/trunk/verilog/syn/xilinx/uart2bus.xise (nonexistent)
@@ -1,74 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Index: uart2bus/trunk/verilog/bench/Test Bench Text Mode - tb_uart2bus_top.v
===================================================================
--- uart2bus/trunk/verilog/bench/Test Bench Text Mode - tb_uart2bus_top.v (revision 2)
+++ uart2bus/trunk/verilog/bench/Test Bench Text Mode - tb_uart2bus_top.v (nonexistent)
@@ -1,166 +0,0 @@
-//---------------------------------------------------------------------------------------
-// uart test bench
-//
-//---------------------------------------------------------------------------------------
-
-`include "timescale.v"
-
-module test;
-//---------------------------------------------------------------------------------------
-// include uart tasks
-`include "uart_tasks.v"
-
-// internal signal
-reg clock; // global clock
-reg reset; // global reset
-reg [6:0] counter;
-
-//---------------------------------------------------------------------------------------
-// test bench implementation
-// global signals generation
-initial
-begin
- counter = 0;
- reset = 1;
- #40 reset = 0;
-end
-
-// clock generator - 40MHz clock
-always
-begin
- #12 clock = 0;
- #13 clock = 1;
-end
-
-// test bench dump variables
-initial
-begin
- $dumpfile("test.vcd");
- //$dumpall;
- $dumpvars(0, test);
-end
-
-//------------------------------------------------------------------
-// test bench transmitter and receiver
-// uart transmit - test bench control
-
-initial
-begin
- // defualt value of serial output
- serial_out = 1;
-
- // transmit a write command to internal register file
- // command string: "w 4cd9 1a" + CR
- send_serial (8'h77, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h20, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h34, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h63, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h64, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h39, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h20, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h31, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h61, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h0d, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- // transmit a read command from register file
- // command string: "r 1a" + CR
- send_serial (8'h72, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h20, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h31, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h61, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h0d, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
-
- // delay and finish
- #900000;
- $finish;
-end
-
-// uart receive
-initial
-begin
- // default value for serial receiver and serial input
- serial_in = 1;
- get_serial_data = 0; // data received from get_serial task
- get_serial_status = 0; // status of get_serial task
-end
-
-// serial sniffer loop
-always
-begin
- // call serial sniffer
- get_serial(`BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8);
-
- // check serial receiver status
- // byte received OK
- if (get_serial_status & `RECEIVE_RESULT_OK)
- begin
- // check if not a control character (above and including space ascii code)
- if (get_serial_data >= 8'h20)
- $display("received byte 0x%h (\"%c\") at %t ns", get_serial_data, get_serial_data, $time);
- else
- $display("received byte 0x%h (\"%c\") at %t ns", get_serial_data, 8'hb0, $time);
- end
-
- // false start error
- if (get_serial_status & `RECEIVE_RESULT_FALSESTART)
- $display("Error (get_char): false start condition at %t", $realtime);
-
- // bad parity error
- if (get_serial_status & `RECEIVE_RESULT_BADPARITY)
- $display("Error (get_char): bad parity condition at %t", $realtime);
-
- // bad stop bits sequence
- if (get_serial_status & `RECEIVE_RESULT_BADSTOP)
- $display("Error (get_char): bad stop bits sequence at %t", $realtime);
-end
-
-//------------------------------------------------------------------
-// device under test
-// DUT interface
-wire [7:0] int_address; // address bus to register file
-wire [7:0] int_wr_data; // write data to register file
-wire int_write; // write control to register file
-wire int_read; // read control to register file
-wire [7:0] int_rd_data; // data read from register file
-wire ser_in; // DUT serial input
-wire ser_out; // DUT serial output
-
-// DUT instance
-uart2bus_top uart2bus1
-(
- .clock(clock), .reset(reset),
- .ser_in(ser_in), .ser_out(ser_out),
- .int_address(int_address), .int_wr_data(int_wr_data), .int_write(int_write),
- .int_rd_data(int_rd_data), .int_read(int_read)
-);
-
-// serial interface to test bench
-assign ser_in = serial_out;
-always @ (posedge clock) serial_in = ser_out;
-
-// register file model
-reg_file_model reg_file1
-(
- .clock(clock), .reset(reset),
- .int_address(int_address), .int_wr_data(int_wr_data), .int_write(int_write),
- .int_rd_data(int_rd_data), .int_read(int_read)
-);
-
-endmodule
-//---------------------------------------------------------------------------------------
-// Th.. Th.. Th.. Thats all folks !!!
-//---------------------------------------------------------------------------------------
Index: uart2bus/trunk/verilog/bench/Test Bench Binary Mode - tb_uart2bus_top.v
===================================================================
--- uart2bus/trunk/verilog/bench/Test Bench Binary Mode - tb_uart2bus_top.v (revision 2)
+++ uart2bus/trunk/verilog/bench/Test Bench Binary Mode - tb_uart2bus_top.v (nonexistent)
@@ -1,219 +0,0 @@
-//---------------------------------------------------------------------------------------
-// uart test bench
-//
-//---------------------------------------------------------------------------------------
-
-`include "timescale.v"
-
-module test;
-//---------------------------------------------------------------------------------------
-// include uart tasks
-`include "uart_tasks.v"
-
-// define if simulation should be binary or ascii
-parameter BINARY_MODE = 1;
-
-// internal signal
-reg clock; // global clock
-reg reset; // global reset
-reg [6:0] counter;
-
-//---------------------------------------------------------------------------------------
-// test bench implementation
-// global signals generation
-initial
-begin
- counter = 0;
- reset = 1;
- #40 reset = 0;
-end
-
-// clock generator - 40MHz clock
-always
-begin
- #12 clock = 0;
- #13 clock = 1;
-end
-
-// test bench dump variables
-initial
-begin
- $dumpfile("test.vcd");
- //$dumpall;
- $dumpvars(0, test);
-end
-
-//------------------------------------------------------------------
-// test bench transmitter and receiver
-// uart transmit - test bench control
-integer file; // file handler index
-integer char; // character read from file
-integer file_len; // length of binary simulation file
-integer byte_idx; // byte index in binary mode simulation
-integer tx_len;
-integer rx_len;
-reg new_rx_data;
-
-initial
-begin
- // defualt value of serial output
- serial_out = 1;
-
- // check simulation mode
- if (BINARY_MODE > 0)
- begin
- // binary mode simulation
- $display("Starting binary mode simulation");
- // open binary command file
- file=$fopen("test.bin", "r");
- // in binary simulation mode the first two byte contain the file length (MSB first)
- char = $fgetc(file);
- $display("char = %d", char);
- file_len = char;
- char = $fgetc(file);
- $display("char = %d", char);
- file_len = 256*file_len + char;
- $display("File length: %d", file_len);
-
- // send entire file to uart
- byte_idx = 0;
- while (byte_idx < file_len)
- begin
- // each "record" in the binary starts with two bytes: the first is the number
- // of bytes to transmit and the second is the number of received bytes to wait
- // for before transmitting the next command.
- tx_len = $fgetc(file);
- rx_len = $fgetc(file);
- $display("Executing command with %d tx bytes and %d rx bytes", tx_len, rx_len);
- byte_idx = byte_idx + 2;
-
- // transmit command
- while (tx_len > 0)
- begin
- // read next byte from file and transmit it
- char = $fgetc(file);
- byte_idx = byte_idx + 1;
- send_serial(char, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- // update tx_len
- tx_len = tx_len - 1;
- end
-
- // wait for received bytes
- while (rx_len > 0)
- begin
- // one clock delay to allow new_rx_data to update
- @(posedge new_rx_data) rx_len = rx_len - 1;
- // check if a new byte was received
-// if (new_rx_data)
-// rx_len = rx_len - 1;
- end
-
- $display("Command finished");
- end
- end
- else
- begin
- // ascii mode simulation
- // open UART command file
- file=$fopen("test.txt", "r");
- // transmit the byte in the command file one by one
- char = $fgetc(file);
- while (char >= 0) begin
- // transmit byte through UART
- send_serial(char, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #200000;
- // read next byte from file
- char = $fgetc(file);
- end
- end
-
- // close input file
- $fclose(file);
-
- // delay and finish
- #500000;
- $finish;
-end
-
-// uart receive
-initial
-begin
- // default value for serial receiver and serial input
- serial_in = 1;
- get_serial_data = 0; // data received from get_serial task
- get_serial_status = 0; // status of get_serial task
-end
-
-// serial sniffer loop
-always
-begin
- // clear new_rx_data flag
- new_rx_data = 0;
-
- // call serial sniffer
- get_serial(`BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8);
-
- // check serial receiver status
- // byte received OK
- if (get_serial_status & `RECEIVE_RESULT_OK)
- begin
- // check if not a control character (above and including space ascii code)
- if (get_serial_data >= 8'h20)
- $display("received byte 0x%h (\"%c\") at %t ns", get_serial_data, get_serial_data, $time);
- else
- $display("received byte 0x%h (\"%c\") at %t ns", get_serial_data, 8'hb0, $time);
-
- // sign to transmit process that a new byte was received
- @(posedge clock) new_rx_data = 1;
- @(posedge clock) new_rx_data = 0;
- end
-
- // false start error
- if (get_serial_status & `RECEIVE_RESULT_FALSESTART)
- $display("Error (get_char): false start condition at %t", $realtime);
-
- // bad parity error
- if (get_serial_status & `RECEIVE_RESULT_BADPARITY)
- $display("Error (get_char): bad parity condition at %t", $realtime);
-
- // bad stop bits sequence
- if (get_serial_status & `RECEIVE_RESULT_BADSTOP)
- $display("Error (get_char): bad stop bits sequence at %t", $realtime);
-end
-
-//------------------------------------------------------------------
-// device under test
-// DUT interface
-wire [7:0] int_address; // address bus to register file
-wire [7:0] int_wr_data; // write data to register file
-wire int_write; // write control to register file
-wire int_read; // read control to register file
-wire [7:0] int_rd_data; // data read from register file
-wire ser_in; // DUT serial input
-wire ser_out; // DUT serial output
-
-// DUT instance
-uart2bus_top uart2bus1
-(
- .clock(clock), .reset(reset),
- .ser_in(ser_in), .ser_out(ser_out),
- .int_address(int_address), .int_wr_data(int_wr_data), .int_write(int_write),
- .int_rd_data(int_rd_data), .int_read(int_read)
-);
-
-// serial interface to test bench
-assign ser_in = serial_out;
-always @ (posedge clock) serial_in = ser_out;
-
-// register file model
-reg_file_model reg_file1
-(
- .clock(clock), .reset(reset),
- .int_address(int_address), .int_wr_data(int_wr_data), .int_write(int_write),
- .int_rd_data(int_rd_data), .int_read(int_read)
-);
-
-endmodule
-//---------------------------------------------------------------------------------------
-// Th.. Th.. Th.. Thats all folks !!!
-//---------------------------------------------------------------------------------------
Index: uart2bus/trunk/verilog/bench/timescale.v
===================================================================
--- uart2bus/trunk/verilog/bench/timescale.v (revision 2)
+++ uart2bus/trunk/verilog/bench/timescale.v (nonexistent)
@@ -1,7 +0,0 @@
-//---------------------------------------------------------------------------------------
-//
-// Timescale definition.
-//
-//---------------------------------------------------------------------------------------
-
-`timescale 1ns / 1ns
Index: uart2bus/trunk/verilog/bench/readme.txt
===================================================================
--- uart2bus/trunk/verilog/bench/readme.txt (revision 2)
+++ uart2bus/trunk/verilog/bench/readme.txt (nonexistent)
@@ -1,4 +0,0 @@
-To select between text mode and binary mode test bench simply make a copy of the testbench to be
-used, delete the current 'tb_uart2bus_top.v' file and rename the copied file to
-'tb_uart2bus_top.v'.
-I know this is not a very clever way to do things but it works!
Index: uart2bus/trunk/verilog/bench/reg_file_model.v
===================================================================
--- uart2bus/trunk/verilog/bench/reg_file_model.v (revision 2)
+++ uart2bus/trunk/verilog/bench/reg_file_model.v (nonexistent)
@@ -1,68 +0,0 @@
-//---------------------------------------------------------------------------------------
-// register file model as a simple memory
-//
-//---------------------------------------------------------------------------------------
-
-`include "timescale.v"
-
-module reg_file_model
-(
- // global signals
- clock, reset,
- // internal bus to register file
- int_address, int_wr_data, int_write,
- int_rd_data, int_read
-);
-//---------------------------------------------------------------------------------------
-// modules inputs and outputs
-input clock; // global clock input
-input reset; // global reset input
-input [7:0] int_address; // address bus to register file
-input [7:0] int_wr_data; // write data to register file
-input int_write; // write control to register file
-input int_read; // read control to register file
-output [7:0] int_rd_data; // data read from register file
-
-// registered outputs
-reg [7:0] int_rd_data;
-
-// internal signal
-reg [7:0] reg_file [0:255]; // 256 of 8 bit registers
-
-//---------------------------------------------------------------------------------------
-// internal tasks
-// clear memory
-task clear_reg_file;
-reg [8:0] regfile_adr;
-begin
- for (regfile_adr = 9'h00; regfile_adr < 9'h80; regfile_adr = regfile_adr + 1)
- begin
- reg_file[regfile_adr] = 0;
- end
-end
-endtask
-
-//---------------------------------------------------------------------------------------
-// module implementation
-// register file write
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- clear_reg_file;
- else if (int_write)
- reg_file[int_address] <= int_wr_data;
-end
-
-// register file read
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- int_rd_data <= 8'h0;
- else if (int_read)
- int_rd_data <= reg_file[int_address];
-end
-
-endmodule
-//---------------------------------------------------------------------------------------
-// Th.. Th.. Th.. Thats all folks !!!
-//---------------------------------------------------------------------------------------
Index: uart2bus/trunk/verilog/bench/tb_uart2bus_top.v
===================================================================
--- uart2bus/trunk/verilog/bench/tb_uart2bus_top.v (revision 2)
+++ uart2bus/trunk/verilog/bench/tb_uart2bus_top.v (nonexistent)
@@ -1,167 +0,0 @@
-//---------------------------------------------------------------------------------------
-// uart test bench
-//
-//---------------------------------------------------------------------------------------
-
-`include "timescale.v"
-
-module test;
-//---------------------------------------------------------------------------------------
-// include uart tasks
-`include "uart_tasks.v"
-
-// internal signal
-reg clock; // global clock
-reg reset; // global reset
-reg [6:0] counter;
-
-//---------------------------------------------------------------------------------------
-// test bench implementation
-// global signals generation
-initial
-begin
- counter = 0;
- clock = 0;
- reset = 1;
- #40 reset = 0;
-end
-
-// clock generator - 40MHz clock
-always
-begin
- #12 clock = 0;
- #13 clock = 1;
-end
-
-// test bench dump variables
-initial
-begin
- $dumpfile("test.vcd");
- //$dumpall;
- $dumpvars(0, test);
-end
-
-//------------------------------------------------------------------
-// test bench transmitter and receiver
-// uart transmit - test bench control
-
-initial
-begin
- // defualt value of serial output
- serial_out = 1;
-
- // transmit a write command to internal register file
- // command string: "w 4cd9 1a" + CR
- send_serial (8'h77, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h20, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h34, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h63, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h64, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h39, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h20, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h31, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h61, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h0d, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- // transmit a read command from register file
- // command string: "r 1a" + CR
- send_serial (8'h72, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h20, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h31, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h61, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
- send_serial (8'h0d, `BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8, 0);
- #100;
-
- // delay and finish
- #900000;
- $finish;
-end
-
-// uart receive
-initial
-begin
- // default value for serial receiver and serial input
- serial_in = 1;
- get_serial_data = 0; // data received from get_serial task
- get_serial_status = 0; // status of get_serial task
-end
-
-// serial sniffer loop
-always
-begin
- // call serial sniffer
- get_serial(`BAUD_115200, `PARITY_EVEN, `PARITY_OFF, `NSTOPS_1, `NBITS_8);
-
- // check serial receiver status
- // byte received OK
- if (get_serial_status & `RECEIVE_RESULT_OK)
- begin
- // check if not a control character (above and including space ascii code)
- if (get_serial_data >= 8'h20)
- $display("received byte 0x%h (\"%c\") at %t ns", get_serial_data, get_serial_data, $time);
- else
- $display("received byte 0x%h (\"%c\") at %t ns", get_serial_data, 8'hb0, $time);
- end
-
- // false start error
- if (get_serial_status & `RECEIVE_RESULT_FALSESTART)
- $display("Error (get_char): false start condition at %t", $realtime);
-
- // bad parity error
- if (get_serial_status & `RECEIVE_RESULT_BADPARITY)
- $display("Error (get_char): bad parity condition at %t", $realtime);
-
- // bad stop bits sequence
- if (get_serial_status & `RECEIVE_RESULT_BADSTOP)
- $display("Error (get_char): bad stop bits sequence at %t", $realtime);
-end
-
-//------------------------------------------------------------------
-// device under test
-// DUT interface
-wire [7:0] int_address; // address bus to register file
-wire [7:0] int_wr_data; // write data to register file
-wire int_write; // write control to register file
-wire int_read; // read control to register file
-wire [7:0] int_rd_data; // data read from register file
-wire ser_in; // DUT serial input
-wire ser_out; // DUT serial output
-
-// DUT instance
-uart2bus_top uart2bus1
-(
- .clock(clock), .reset(reset),
- .ser_in(ser_in), .ser_out(ser_out),
- .int_address(int_address), .int_wr_data(int_wr_data), .int_write(int_write),
- .int_rd_data(int_rd_data), .int_read(int_read)
-);
-
-// serial interface to test bench
-assign ser_in = serial_out;
-always @ (posedge clock) serial_in = ser_out;
-
-// register file model
-reg_file_model reg_file1
-(
- .clock(clock), .reset(reset),
- .int_address(int_address), .int_wr_data(int_wr_data), .int_write(int_write),
- .int_rd_data(int_rd_data), .int_read(int_read)
-);
-
-endmodule
-//---------------------------------------------------------------------------------------
-// Th.. Th.. Th.. Thats all folks !!!
-//---------------------------------------------------------------------------------------
Index: uart2bus/trunk/verilog/bench/uart_tasks.v
===================================================================
--- uart2bus/trunk/verilog/bench/uart_tasks.v (revision 2)
+++ uart2bus/trunk/verilog/bench/uart_tasks.v (nonexistent)
@@ -1,246 +0,0 @@
-//------------------------------------------------------------------------------
-// uart tasks:
-// send_serial serial transmitter
-// get_serial serial receiver
-//
-//------------------------------------------------------------------------------
-
-/* Serial Parameters used for send_serial task and its callers. */
-`define PARITY_OFF 1'b0
-`define PARITY_ON 1'b1
-`define PARITY_ODD 1'b0
-`define PARITY_EVEN 1'b1
-`define NSTOPS_1 1'b0
-`define NSTOPS_2 1'b1
-`define BAUD_115200 3'b000
-`define BAUD_38400 3'b001
-`define BAUD_28800 3'b010
-`define BAUD_19200 3'b011
-`define BAUD_9600 3'b100
-`define BAUD_4800 3'b101
-`define BAUD_2400 3'b110
-`define BAUD_1200 3'b111
-`define NBITS_7 1'b0
-`define NBITS_8 1'b1
-// constants for status from get_serial task
-`define RECEIVE_RESULT_OK 4'b1000
-`define RECEIVE_RESULT_FALSESTART 4'b0001
-`define RECEIVE_RESULT_BADPARITY 4'b0010
-`define RECEIVE_RESULT_BADSTOP 4'b0100
-
-// uart tasks global interfaces signals
-reg serial_out; // transmit serial output
-reg serial_in; // receive serial input
-reg [7:0] get_serial_data; // data received from serial
-reg [7:0] get_serial_status; // status of receive operation
-
-//------------------------------------------------------------------------------
-// uart transmit task
-//
-// usage:
-// send_serial (data, baud_rate, parity_type, parity_on, stop_bits_num,
-// data_bit_num, baud_error);
-// where:
-// data data character for transmission
-// parity_type this is a flag indicating that parity should be even
-// (either 'PARITY_ODD or 'PARITY_EVEN)
-// parity_on indicates that the parity is used
-// (either 'PARITY_OFF or 'PARITY_ON)
-// stop_bits_num number of stop bits (either NSTOPS_1 or NSTOPS_2)
-// data_bit_num number of data bits (either NBITS_7 or NBITS_8)
-// baud_error baud error in precentage (-5 is -5%)
-//
-
-task send_serial;
-// task input parameters
-input [7:0] inputchar;
-input baud;
-input paritytype;
-input parityenable;
-input nstops;
-input nbits;
-input baud_error_factor;
-// internal registers
-reg nbits;
-reg parityenable;
-reg paritytype;
-reg [1:0] baud;
-reg nstops;
-integer baud_error_factor; // e.g. +5 means 5% too fast and -5 means 5% too slow
-reg [7:0] char;
-reg [7:0] disp_char;
-reg parity_bit;
-integer bit_time;
-integer num_of_bits;
-// task implementation
-begin
- char = inputchar;
- parity_bit = 1'b0;
- // calculate bit time from input baud rate - this assumes a simulation resolution of 1ns
- case (baud)
- `BAUD_115200: bit_time = 1000000000/(115200 + 1152*baud_error_factor);
-// `BAUD_115200: bit_time = 40000000000/(115200 + 1152*baud_error_factor);
- `BAUD_38400: bit_time = 1000000000/(38400 + 384*baud_error_factor);
- `BAUD_28800: bit_time = 1000000000/(28800 + 288*baud_error_factor);
- `BAUD_19200: bit_time = 1000000000/(19200 + 192*baud_error_factor);
- `BAUD_9600: bit_time = 1000000000/(9600 + 96*baud_error_factor);
- `BAUD_4800: bit_time = 1000000000/(4800 + 48*baud_error_factor);
- `BAUD_2400: bit_time = 1000000000/(2400 + 24*baud_error_factor);
- `BAUD_1200: bit_time = 1000000000/(1200 + 12*baud_error_factor);
- endcase
-
- // display info
- disp_char = (char >= 8'h20) ? char : 8'hb0;
- $display ("Sending character 0x%h (\"%c\"), at %0d baud (err=%0d), %0d bits, %0s parity, %0d stops",
- (nbits == `NBITS_7) ? (char & 8'h7f) : char,
- (nbits == `NBITS_7) ? (disp_char & 8'h7f) : disp_char,
- 1000000000/bit_time,
- baud_error_factor,
- (nbits == `NBITS_7) ? 7 : 8,
- (parityenable == `PARITY_OFF) ? "NONE" : (paritytype == `PARITY_EVEN) ? "EVEN" : "ODD",
- (nstops == `NSTOPS_1) ? 1 : 2
- );
-
- // Start bit
- serial_out = 1'b0; // Start bit.
- #(bit_time);
-
- // Output data bits
- num_of_bits = (nbits == `NBITS_7) ? 7 : 8;
- repeat (num_of_bits)
- begin
- serial_out = char[0];
- #(bit_time);
- char = {1'b0, char[7:1]};
- end
-
- // check if parity is enabled
- if (parityenable == `PARITY_ON) begin
- parity_bit = (nbits == `NBITS_7) ? ^inputchar[6:0] : ^inputchar[7:0];
- // even parity
- if (paritytype == `PARITY_ODD)
- parity_bit = ~parity_bit;
-
- serial_out = parity_bit;
- #(bit_time);
- end
-
- // Stop bit.
- serial_out = 1'b1;
- #(bit_time);
- // Second stop bit
- if (nstops)
- #(bit_time);
-end
-endtask
-
-//------------------------------------------------------------------------------
-// uart receive task
-//
-// usage:
-// get_serial (baud_rate, parity_type, parity_on, stop_bits_num, data_bit_num);
-// where:
-// data data character for transmission
-// parity_type this is a flag indicating that parity should be even
-// (either 'PARITY_ODD or 'PARITY_EVEN)
-// parity_on indicates that the parity is used
-// (either 'PARITY_OFF or 'PARITY_ON)
-// stop_bits_num number of stop bits (either NSTOPS_1 or NSTOPS_2)
-// data_bit_num number of data bits (either NBITS_7 or NBITS_8)
-//
-task get_serial;
-// input parameters
-input baud;
-input paritytype;
-input parityenable;
-input nstops;
-input nbits;
-// internal registers
-reg nbits;
-reg parityenable;
-reg paritytype;
-reg [1:0] baud;
-reg nstops;
-integer bit_time;
-reg expected_parity;
-integer num_of_bits;
-// task implementation
-begin
- // init receive globals
- get_serial_status = 0;
- get_serial_data = 0;
-
- // calculate bit time from input baud rate - this assumes a simulation resolution of 1ns
- case (baud)
- `BAUD_115200: bit_time = 1000000000/115200;
- `BAUD_38400: bit_time = 1000000000/38400;
- `BAUD_28800: bit_time = 1000000000/28800;
- `BAUD_19200: bit_time = 1000000000/19200;
- `BAUD_9600: bit_time = 1000000000/9600;
- `BAUD_4800: bit_time = 1000000000/4800;
- `BAUD_2400: bit_time = 1000000000/2400;
- `BAUD_1200: bit_time = 1000000000/1200;
- endcase
-
- // Assume OK until bad things happen.
- get_serial_status = `RECEIVE_RESULT_OK;
-
- // wait for start bit edge
- @(negedge serial_in);
-
- // wait till center of start bit
- #(bit_time/2);
-
- // make sure its really a start bit
- if (serial_in != 0)
- get_serial_status = get_serial_status | `RECEIVE_RESULT_FALSESTART;
- else
- begin
- // get all the data bits (7 or 8)
- num_of_bits = (nbits == `NBITS_7) ? 7 : 8;
- repeat (num_of_bits)
- begin
- // wait till center
- #(bit_time);
- // sample a data bit
- get_serial_data = {serial_in, get_serial_data[7:1]};
- end
-
- // If we are only expecting 7 bits, go ahead and right-justify what we have
- if (nbits == `NBITS_7)
- get_serial_data = {1'b0, get_serial_data[7:1]};
-
- // wait for next bit to start
- #(bit_time);
-
- // now, we have either a parity bit, or a stop bit
- if (parityenable == `PARITY_ON) begin
- if (paritytype == `PARITY_EVEN)
- expected_parity = (nbits == `NBITS_7) ? (^get_serial_data[6:0]) :
- (^get_serial_data[7:0]);
- else
- expected_parity = (nbits == `NBITS_7) ? (~(^get_serial_data[6:0])) :
- (~(^get_serial_data[7:0]));
-
- if (expected_parity != serial_in)
- get_serial_status = get_serial_status | `RECEIVE_RESULT_BADPARITY;
- end
- // wait for either 1 or 2 stop bits
- else begin
- // this is a stop bit.
- if (serial_in != 1)
- get_serial_status = get_serial_status | `RECEIVE_RESULT_BADSTOP;
- else
- // that was cool. if 2 stops, then do this again
- if (nstops)
- begin
- #(bit_time);
- if (serial_in != 1)
- get_serial_status = get_serial_status | `RECEIVE_RESULT_BADSTOP;
- end
- #(bit_time/2);
- end
- end
-end
-endtask
-
Index: uart2bus/trunk/verilog/rtl/baud_gen.v
===================================================================
--- uart2bus/trunk/verilog/rtl/baud_gen.v (revision 2)
+++ uart2bus/trunk/verilog/rtl/baud_gen.v (nonexistent)
@@ -1,55 +0,0 @@
-//---------------------------------------------------------------------------------------
-// baud rate generator for uart
-//
-// this module has been changed to receive the baud rate dividing counter from registers.
-// the two registers should be calculated as follows:
-// first register:
-// baud_freq = 16*baud_rate / gcd(global_clock_freq, 16*baud_rate)
-// second register:
-// baud_limit = (global_clock_freq / gcd(global_clock_freq, 16*baud_rate)) - baud_freq
-//---------------------------------------------------------------------------------------
-
-module baud_gen
-(
- clock, reset,
- ce_16, baud_freq, baud_limit
-);
-//---------------------------------------------------------------------------------------
-// modules inputs and outputs
-input clock; // global clock input
-input reset; // global reset input
-output ce_16; // baud rate multiplyed by 16
-input [11:0] baud_freq; // baud rate setting registers - see header description
-input [15:0] baud_limit;
-
-// internal registers
-reg ce_16;
-reg [15:0] counter;
-//---------------------------------------------------------------------------------------
-// module implementation
-// baud divider counter
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- counter <= 16'b0;
- else if (counter >= baud_limit)
- counter <= counter - baud_limit;
- else
- counter <= counter + baud_freq;
-end
-
-// clock divider output
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- ce_16 <= 1'b0;
- else if (counter >= baud_limit)
- ce_16 <= 1'b1;
- else
- ce_16 <= 1'b0;
-end
-
-endmodule
-//---------------------------------------------------------------------------------------
-// Th.. Th.. Th.. Thats all folks !!!
-//---------------------------------------------------------------------------------------
Index: uart2bus/trunk/verilog/rtl/uart_rx.v
===================================================================
--- uart2bus/trunk/verilog/rtl/uart_rx.v (revision 2)
+++ uart2bus/trunk/verilog/rtl/uart_rx.v (nonexistent)
@@ -1,116 +0,0 @@
-//---------------------------------------------------------------------------------------
-// uart receive module
-//
-//---------------------------------------------------------------------------------------
-
-module uart_rx
-(
- clock, reset,
- ce_16, ser_in,
- rx_data, new_rx_data
-);
-//---------------------------------------------------------------------------------------
-// modules inputs and outputs
-input clock; // global clock input
-input reset; // global reset input
-input ce_16; // baud rate multiplyed by 16 - generated by baud module
-input ser_in; // serial data input
-output [7:0] rx_data; // data byte received
-output new_rx_data; // signs that a new byte was received
-
-// internal wires
-wire ce_1; // clock enable at bit rate
-wire ce_1_mid; // clock enable at the middle of each bit - used to sample data
-
-// internal registers
-reg [7:0] rx_data;
-reg new_rx_data;
-reg [1:0] in_sync;
-reg rx_busy;
-reg [3:0] count16;
-reg [3:0] bit_count;
-reg [7:0] data_buf;
-//---------------------------------------------------------------------------------------
-// module implementation
-// input async input is sampled twice
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- in_sync <= 2'b11;
- else
- in_sync <= {in_sync[0], ser_in};
-end
-
-// a counter to count 16 pulses of ce_16 to generate the ce_1 and ce_1_mid pulses.
-// this counter is used to detect the start bit while the receiver is not receiving and
-// signs the sampling cycle during reception.
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- count16 <= 4'b0;
- else if (ce_16)
- begin
- if (rx_busy | (in_sync[1] == 1'b0))
- count16 <= count16 + 4'b1;
- else
- count16 <= 4'b0;
- end
-end
-
-// ce_1 pulse indicating expected end of current bit
-assign ce_1 = (count16 == 4'b1111) & ce_16;
-// ce_1_mid pulse indication the sampling clock cycle of the current data bit
-assign ce_1_mid = (count16 == 4'b0111) & ce_16;
-
-// receiving busy flag
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- rx_busy <= 1'b0;
- else if (~rx_busy & ce_1_mid)
- rx_busy <= 1'b1;
- else if (rx_busy & (bit_count == 4'h9) & ce_1)
- rx_busy <= 1'b0;
-end
-
-// bit counter
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- bit_count <= 4'h0;
- else if (~rx_busy)
- bit_count <= 4'h0;
- else if (rx_busy & ce_1_mid)
- bit_count <= bit_count + 4'h1;
-end
-
-// data buffer shift register
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- data_buf <= 8'h0;
- else if (rx_busy & ce_1_mid)
- data_buf <= {in_sync[1], data_buf[7:1]};
-end
-
-// data output and flag
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- begin
- rx_data <= 8'h0;
- new_rx_data <= 1'b0;
- end
- else if (rx_busy & (bit_count == 4'h8) & ce_1)
- begin
- rx_data <= data_buf;
- new_rx_data <= 1'b1;
- end
- else
- new_rx_data <= 1'b0;
-end
-
-endmodule
-//---------------------------------------------------------------------------------------
-// Th.. Th.. Th.. Thats all folks !!!
-//---------------------------------------------------------------------------------------
Index: uart2bus/trunk/verilog/rtl/uart_tx.v
===================================================================
--- uart2bus/trunk/verilog/rtl/uart_tx.v (revision 2)
+++ uart2bus/trunk/verilog/rtl/uart_tx.v (nonexistent)
@@ -1,94 +0,0 @@
-//---------------------------------------------------------------------------------------
-// uart transmit module
-//
-//---------------------------------------------------------------------------------------
-
-module uart_tx
-(
- clock, reset,
- ce_16, tx_data, new_tx_data,
- ser_out, tx_busy
-);
-//---------------------------------------------------------------------------------------
-// modules inputs and outputs
-input clock; // global clock input
-input reset; // global reset input
-input ce_16; // baud rate multiplyed by 16 - generated by baud module
-input [7:0] tx_data; // data byte to transmit
-input new_tx_data; // asserted to indicate that there is a new data byte for transmission
-output ser_out; // serial data output
-output tx_busy; // signs that transmitter is busy
-
-// internal wires
-wire ce_1; // clock enable at bit rate
-
-// internal registers
-reg ser_out;
-reg tx_busy;
-reg [3:0] count16;
-reg [3:0] bit_count;
-reg [8:0] data_buf;
-//---------------------------------------------------------------------------------------
-// module implementation
-// a counter to count 16 pulses of ce_16 to generate the ce_1 pulse
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- count16 <= 4'b0;
- else if (tx_busy & ce_16)
- count16 <= count16 + 4'b1;
- else if (~tx_busy)
- count16 <= 4'b0;
-end
-
-// ce_1 pulse indicating output data bit should be updated
-assign ce_1 = (count16 == 4'b1111) & ce_16;
-
-// tx_busy flag
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- tx_busy <= 1'b0;
- else if (~tx_busy & new_tx_data)
- tx_busy <= 1'b1;
- else if (tx_busy & (bit_count == 4'ha) & ce_1)
- tx_busy <= 1'b0;
-end
-
-// output bit counter
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- bit_count <= 4'h0;
- else if (tx_busy & ce_1)
- bit_count <= bit_count + 4'h1;
- else if (~tx_busy)
- bit_count <= 4'h0;
-end
-
-// data shift register
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- data_buf <= 9'b0;
- else if (~tx_busy)
- data_buf <= {tx_data, 1'b0};
- else if (tx_busy & ce_1)
- data_buf <= {1'b1, data_buf[8:1]};
-end
-
-// output data bit
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- ser_out <= 1'b1;
- else if (tx_busy)
- ser_out <= data_buf[0];
- else
- ser_out <= 1'b1;
-end
-
-endmodule
-//---------------------------------------------------------------------------------------
-// Th.. Th.. Th.. Thats all folks !!!
-//---------------------------------------------------------------------------------------
Index: uart2bus/trunk/verilog/rtl/uart_parser.v
===================================================================
--- uart2bus/trunk/verilog/rtl/uart_parser.v (revision 2)
+++ uart2bus/trunk/verilog/rtl/uart_parser.v (nonexistent)
@@ -1,646 +0,0 @@
-//---------------------------------------------------------------------------------------
-// uart parser module
-//
-//---------------------------------------------------------------------------------------
-
-module uart_parser
-(
- // global signals
- clock, reset,
- // transmit and receive internal interface signals from uart interface
- rx_data, new_rx_data,
- tx_data, new_tx_data, tx_busy,
- // internal bus to register file
- int_address, int_wr_data, int_write,
- int_rd_data, int_read
-);
-//---------------------------------------------------------------------------------------
-// parameters
-parameter AW = 8; // address bus width parameter
-
-// modules inputs and outputs
-input clock; // global clock input
-input reset; // global reset input
-output [7:0] tx_data; // data byte to transmit
-output new_tx_data; // asserted to indicate that there is a new data byte for
- // transmission
-input tx_busy; // signs that transmitter is busy
-input [7:0] rx_data; // data byte received
-input new_rx_data; // signs that a new byte was received
-output [AW-1:0] int_address; // address bus to register file
-output [7:0] int_wr_data; // write data to register file
-output int_write; // write control to register file
-output int_read; // read control to register file
-input [7:0] int_rd_data; // data read from register file
-
-// registered outputs
-reg [7:0] tx_data;
-reg new_tx_data;
-reg [AW-1:0] int_address;
-reg [7:0] int_wr_data;
-reg int_write, int_read;
-
-// internal constants
-// define characters used by the parser
-`define CHAR_CR 8'h0d
-`define CHAR_LF 8'h0a
-`define CHAR_SPACE 8'h20
-`define CHAR_TAB 8'h09
-`define CHAR_COMMA 8'h2C
-`define CHAR_R_UP 8'h52
-`define CHAR_r_LO 8'h72
-`define CHAR_W_UP 8'h57
-`define CHAR_w_LO 8'h77
-`define CHAR_0 8'h30
-`define CHAR_1 8'h31
-`define CHAR_2 8'h32
-`define CHAR_3 8'h33
-`define CHAR_4 8'h34
-`define CHAR_5 8'h35
-`define CHAR_6 8'h36
-`define CHAR_7 8'h37
-`define CHAR_8 8'h38
-`define CHAR_9 8'h39
-`define CHAR_A_UP 8'h41
-`define CHAR_B_UP 8'h42
-`define CHAR_C_UP 8'h43
-`define CHAR_D_UP 8'h44
-`define CHAR_E_UP 8'h45
-`define CHAR_F_UP 8'h46
-`define CHAR_a_LO 8'h61
-`define CHAR_b_LO 8'h62
-`define CHAR_c_LO 8'h63
-`define CHAR_d_LO 8'h64
-`define CHAR_e_LO 8'h65
-`define CHAR_f_LO 8'h66
-
-// main (receive) state machine states
-`define MAIN_IDLE 4'b0000
-`define MAIN_WHITE1 4'b0001
-`define MAIN_DATA 4'b0010
-`define MAIN_WHITE2 4'b0011
-`define MAIN_ADDR 4'b0100
-`define MAIN_EOL 4'b0101
-// binary mode extension states
-`define MAIN_BIN_CMD 4'b1000
-`define MAIN_BIN_ADRH 4'b1001
-`define MAIN_BIN_ADRL 4'b1010
-`define MAIN_BIN_LEN 4'b1011
-`define MAIN_BIN_DATA 4'b1100
-
-// transmit state machine
-`define TX_IDLE 3'b000
-`define TX_HI_NIB 3'b001
-`define TX_LO_NIB 3'b100
-`define TX_CHAR_CR 3'b101
-`define TX_CHAR_LF 3'b110
-
-// binary extension mode commands - the command is indicated by bits 5:4 of the command byte
-`define BIN_CMD_NOP 2'b00
-`define BIN_CMD_READ 2'b01
-`define BIN_CMD_WRITE 2'b10
-
-// internal wires and registers
-reg [3:0] main_sm; // main state machine
-reg read_op; // read operation flag
-reg write_op; // write operation flag
-reg data_in_hex_range; // indicates that the received data is in the range of hex number
-reg [7:0] data_param; // operation data parameter
-reg [15:0] addr_param; // operation address parameter
-reg [3:0] data_nibble; // data nibble from received character
-reg read_done; // internally generated read done flag
-reg read_done_s; // sampled read done
-reg [7:0] read_data_s; // sampled read data
-reg [3:0] tx_nibble; // nibble value for transmission
-reg [7:0] tx_char; // transmit byte from nibble to character conversion
-reg [2:0] tx_sm; // transmit state machine
-reg s_tx_busy; // sampled tx_busy for falling edge detection
-reg bin_read_op; // binary mode read operation flag
-reg bin_write_op; // binary mode write operation flag
-reg addr_auto_inc; // address auto increment mode
-reg send_stat_flag; // send status flag
-reg [7:0] bin_byte_count; // binary mode byte counter
-wire bin_last_byte; // last byte flag indicates that the current byte in the command is the last
-wire tx_end_p; // transmission end pulse
-
-//---------------------------------------------------------------------------------------
-// module implementation
-// main state machine
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- main_sm <= `MAIN_IDLE;
- else if (new_rx_data)
- begin
- case (main_sm)
- // wait for a read ('r') or write ('w') command
- // binary extension - an all zeros byte enabled binary commands
- `MAIN_IDLE:
- // check received character
- if (rx_data == 8'h0)
- // an all zeros received byte enters binary mode
- main_sm <= `MAIN_BIN_CMD;
- else if ((rx_data == `CHAR_r_LO) | (rx_data == `CHAR_R_UP))
- // on read wait to receive only address field
- main_sm <= `MAIN_WHITE2;
- else if ((rx_data == `CHAR_w_LO) | (rx_data == `CHAR_W_UP))
- // on write wait to receive data and address
- main_sm <= `MAIN_WHITE1;
- else if ((rx_data == `CHAR_CR) | (rx_data == `CHAR_LF))
- // on new line sta in idle
- main_sm <= `MAIN_IDLE;
- else
- // any other character wait to end of line (EOL)
- main_sm <= `MAIN_EOL;
-
- // wait for white spaces till first data nibble
- `MAIN_WHITE1:
- // wait in this case until any white space character is received. in any
- // valid character for data value switch to data state. a new line or carriage
- // return should reset the state machine to idle.
- // any other character transitions the state machine to wait for EOL.
- if ((rx_data == `CHAR_SPACE) | (rx_data == `CHAR_TAB))
- main_sm <= `MAIN_WHITE1;
- else if (data_in_hex_range)
- main_sm <= `MAIN_DATA;
- else if ((rx_data == `CHAR_CR) | (rx_data == `CHAR_LF))
- main_sm <= `MAIN_IDLE;
- else
- main_sm <= `MAIN_EOL;
-
- // receive data field
- `MAIN_DATA:
- // wait while data in hex range. white space transition to wait white 2 state.
- // CR and LF resets the state machine. any other value cause state machine to
- // wait til end of line.
- if (data_in_hex_range)
- main_sm <= `MAIN_DATA;
- else if ((rx_data == `CHAR_SPACE) | (rx_data == `CHAR_TAB))
- main_sm <= `MAIN_WHITE2;
- else if ((rx_data == `CHAR_CR) | (rx_data == `CHAR_LF))
- main_sm <= `MAIN_IDLE;
- else
- main_sm <= `MAIN_EOL;
-
- // wait for white spaces till first address nibble
- `MAIN_WHITE2:
- // similar to MAIN_WHITE1
- if ((rx_data == `CHAR_SPACE) | (rx_data == `CHAR_TAB))
- main_sm <= `MAIN_WHITE2;
- else if (data_in_hex_range)
- main_sm <= `MAIN_ADDR;
- else if ((rx_data == `CHAR_CR) | (rx_data == `CHAR_LF))
- main_sm <= `MAIN_IDLE;
- else
- main_sm <= `MAIN_EOL;
-
- // receive address field
- `MAIN_ADDR:
- // similar to MAIN_DATA
- if (data_in_hex_range)
- main_sm <= `MAIN_ADDR;
- else if ((rx_data == `CHAR_CR) | (rx_data == `CHAR_LF))
- main_sm <= `MAIN_IDLE;
- else
- main_sm <= `MAIN_EOL;
-
- // wait to EOL
- `MAIN_EOL:
- // wait for CR or LF to move back to idle
- if ((rx_data == `CHAR_CR) | (rx_data == `CHAR_LF))
- main_sm <= `MAIN_IDLE;
-
- // binary extension
- // wait for command - one byte
- `MAIN_BIN_CMD:
- // check if command is a NOP command
- if (rx_data[5:4] == `BIN_CMD_NOP)
- // if NOP command then switch back to idle state
- main_sm <= `MAIN_IDLE;
- else
- // not a NOP command, continue receiving parameters
- main_sm <= `MAIN_BIN_ADRH;
-
- // wait for address parameter - two bytes
- // high address byte
- `MAIN_BIN_ADRH:
- // switch to next state
- main_sm <= `MAIN_BIN_ADRL;
-
- // low address byte
- `MAIN_BIN_ADRL:
- // switch to next state
- main_sm <= `MAIN_BIN_LEN;
-
- // wait for length parameter - one byte
- `MAIN_BIN_LEN:
- // check if write command else command reception ended
- if (bin_write_op)
- // wait for write data
- main_sm <= `MAIN_BIN_DATA;
- else
- // command reception has ended
- main_sm <= `MAIN_IDLE;
-
- // on write commands wait for data till end of buffer as specified by length parameter
- `MAIN_BIN_DATA:
- // if this is the last data byte then return to idle
- if (bin_last_byte)
- main_sm <= `MAIN_IDLE;
-
- // go to idle
- default:
- main_sm <= `MAIN_IDLE;
- endcase
- end
-end
-
-// indicates that the received data is in the range of hex number
-always @ (rx_data)
-begin
- if (((rx_data >= `CHAR_0 ) && (rx_data <= `CHAR_9 )) ||
- ((rx_data >= `CHAR_A_UP) && (rx_data <= `CHAR_F_UP)) ||
- ((rx_data >= `CHAR_a_LO) && (rx_data <= `CHAR_f_LO)))
- data_in_hex_range <= 1'b1;
- else
- data_in_hex_range <= 1'b0;
-end
-
-// read operation flag
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- read_op <= 1'b0;
- else if ((main_sm == `MAIN_IDLE) && new_rx_data)
- begin
- // the read operation flag is set when a read command is received in idle state and cleared
- // if any other character is received during that state.
- if ((rx_data == `CHAR_r_LO) | (rx_data == `CHAR_R_UP))
- read_op <= 1'b1;
- else
- read_op <= 1'b0;
- end
-end
-
-// write operation flag
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- write_op <= 1'b0;
- else if ((main_sm == `MAIN_IDLE) & new_rx_data)
- begin
- // the write operation flag is set when a write command is received in idle state and cleared
- // if any other character is received during that state.
- if ((rx_data == `CHAR_w_LO) | (rx_data == `CHAR_W_UP))
- write_op <= 1'b1;
- else
- write_op <= 1'b0;
- end
-end
-
-// binary mode read operation flag
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- bin_read_op <= 1'b0;
- else if ((main_sm == `MAIN_BIN_CMD) && new_rx_data && (rx_data[5:4] == `BIN_CMD_READ))
- // read command is started on reception of a read command
- bin_read_op <= 1'b1;
- else if (bin_read_op && tx_end_p && bin_last_byte)
- // read command ends on transmission of the last byte read
- bin_read_op <= 1'b0;
-end
-
-// binary mode write operation flag
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- bin_write_op <= 1'b0;
- else if ((main_sm == `MAIN_BIN_CMD) && new_rx_data && (rx_data[5:4] == `BIN_CMD_WRITE))
- // write command is started on reception of a write command
- bin_write_op <= 1'b1;
- else if ((main_sm == `MAIN_BIN_DATA) && new_rx_data && bin_last_byte)
- bin_write_op <= 1'b0;
-end
-
-// send status flag - used only in binary extension mode
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- send_stat_flag <= 1'b0;
- else if ((main_sm == `MAIN_BIN_CMD) && new_rx_data)
- begin
- // check if a status byte should be sent at the end of the command
- if (rx_data[0] == 1'b1)
- send_stat_flag <= 1'b1;
- else
- send_stat_flag <= 1'b0;
- end
-end
-
-// address auto increment - used only in binary extension mode
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- addr_auto_inc <= 1'b0;
- else if ((main_sm == `MAIN_BIN_CMD) && new_rx_data)
- begin
- // check if address should be automatically incremented or not.
- // Note that when rx_data[1] is set, address auto increment is disabled.
- if (rx_data[1] == 1'b0)
- addr_auto_inc <= 1'b1;
- else
- addr_auto_inc <= 1'b0;
- end
-end
-
-// operation data parameter
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- data_param <= 8'h0;
- else if ((main_sm == `MAIN_WHITE1) & new_rx_data & data_in_hex_range)
- data_param <= {4'h0, data_nibble};
- else if ((main_sm == `MAIN_DATA) & new_rx_data & data_in_hex_range)
- data_param <= {data_param[3:0], data_nibble};
-end
-
-// operation address parameter
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- addr_param <= 0;
- else if ((main_sm == `MAIN_WHITE2) & new_rx_data & data_in_hex_range)
- addr_param <= {12'b0, data_nibble};
- else if ((main_sm == `MAIN_ADDR) & new_rx_data & data_in_hex_range)
- addr_param <= {addr_param[11:0], data_nibble};
- // binary extension
- else if (main_sm == `MAIN_BIN_ADRH)
- addr_param[15:8] <= rx_data;
- else if (main_sm == `MAIN_BIN_ADRL)
- addr_param[7:0] <= rx_data;
-end
-
-// binary mode command byte counter is loaded with the length parameter and counts down to zero.
-// NOTE: a value of zero for the length parameter indicates a command of 256 bytes.
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- bin_byte_count <= 8'b0;
- else if ((main_sm == `MAIN_BIN_LEN) && new_rx_data)
- bin_byte_count <= rx_data;
- else if ((bin_write_op && (main_sm == `MAIN_BIN_DATA) && new_rx_data) ||
- (bin_read_op && tx_end_p))
- // byte counter is updated on every new data received in write operations and for every
- // byte transmitted for read operations.
- bin_byte_count <= bin_byte_count - 1;
-end
-// last byte in command flag
-assign bin_last_byte = (bin_byte_count == 8'h01) ? 1'b1 : 1'b0;
-
-// internal write control and data
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- begin
- int_write <= 1'b0;
- int_wr_data <= 0;
- end
- else if (write_op && (main_sm == `MAIN_ADDR) && new_rx_data && !data_in_hex_range)
- begin
- int_write <= 1'b1;
- int_wr_data <= data_param;
- end
- // binary extension mode
- else if (bin_write_op && (main_sm == `MAIN_BIN_DATA) && new_rx_data)
- begin
- int_write <= 1'b1;
- int_wr_data <= rx_data;
- end
- else
- int_write <= 1'b0;
-end
-
-// internal read control
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- int_read <= 1'b0;
- else if (read_op && (main_sm == `MAIN_ADDR) && new_rx_data && !data_in_hex_range)
- int_read <= 1'b1;
- // binary extension
- else if (bin_read_op && (main_sm == `MAIN_BIN_LEN) && new_rx_data)
- // the first read request is issued on reception of the length byte
- int_read <= 1'b1;
- else if (bin_read_op && tx_end_p && !bin_last_byte)
- // the next read requests are issued after the previous read value was transmitted and
- // this is not the last byte to be read.
- int_read <= 1'b1;
- else
- int_read <= 1'b0;
-end
-
-// internal address
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- int_address <= 0;
- else if ((main_sm == `MAIN_ADDR) && new_rx_data && !data_in_hex_range)
- int_address <= addr_param[AW-1:0];
- // binary extension
- else if ((main_sm == `MAIN_BIN_LEN) && new_rx_data)
- // sample address parameter on reception of length byte
- int_address <= addr_param[AW-1:0];
- else if (addr_auto_inc &&
- ((bin_read_op && tx_end_p && !bin_last_byte) ||
-// (bin_write_op && (main_sm == `MAIN_BIN_DATA) && new_rx_data)))
- (bin_write_op && int_write)))
- // address is incremented on every read or write if enabled
- int_address <= int_address + 1;
-end
-
-// read done flag and sampled data read
-always @ (posedge clock or posedge reset)
-begin
- if (reset) begin
- read_done <= 1'b0;
- read_done_s <= 1'b0;
- read_data_s <= 8'h0;
- end
- else
- begin
- // read done flag
- if (int_read)
- read_done <= 1'b1;
- else
- read_done <= 1'b0;
-
- // sampled read done
- read_done_s <= read_done;
-
- // sampled data read
- if (read_done)
- read_data_s <= int_rd_data;
- end
-end
-
-// transmit state machine and control
-always @ (posedge clock or posedge reset)
-begin
- if (reset) begin
- tx_sm <= `TX_IDLE;
- tx_data <= 8'h0;
- new_tx_data <= 1'b0;
- end
- else
- case (tx_sm)
- // wait for read done indication
- `TX_IDLE:
- // on end of every read operation check how the data read should be transmitted
- // according to read type: ascii or binary.
- if (read_done_s)
- // on binary mode read transmit byte value
- if (bin_read_op)
- begin
- // note that there is no need to change state
- tx_data <= read_data_s;
- new_tx_data <= 1'b1;
- end
- else
- begin
- tx_sm <= `TX_HI_NIB;
- tx_data <= tx_char;
- new_tx_data <= 1'b1;
- end
- // check if status byte should be transmitted
- else if ((send_stat_flag && bin_read_op && tx_end_p && bin_last_byte) || // end of read command
- (send_stat_flag && bin_write_op && new_rx_data && bin_last_byte) || // end of write command
- ((main_sm == `MAIN_BIN_CMD) && new_rx_data && (rx_data[5:4] == `BIN_CMD_NOP))) // NOP
- begin
- // send status byte - currently a constant
- tx_data <= 8'h5a;
- new_tx_data <= 1'b1;
- end
- else
- new_tx_data <= 1'b0;
-
- // wait for transmit to end
- `TX_HI_NIB:
- if (tx_end_p)
- begin
- tx_sm <= `TX_LO_NIB;
- tx_data <= tx_char;
- new_tx_data <= 1'b1;
- end
- else
- new_tx_data <= 1'b0;
-
- // wait for transmit to end
- `TX_LO_NIB:
- if (tx_end_p)
- begin
- tx_sm <= `TX_CHAR_CR;
- tx_data <= `CHAR_CR;
- new_tx_data <= 1'b1;
- end
- else
- new_tx_data <= 1'b0;
-
- // wait for transmit to end
- `TX_CHAR_CR:
- if (tx_end_p)
- begin
- tx_sm <= `TX_CHAR_LF;
- tx_data <= `CHAR_LF;
- new_tx_data <= 1'b1;
- end
- else
- new_tx_data <= 1'b0;
-
- // wait for transmit to end
- `TX_CHAR_LF:
- begin
- if (tx_end_p)
- tx_sm <= `TX_IDLE;
- // clear tx new data flag
- new_tx_data <= 1'b0;
- end
-
- // return to idle
- default:
- tx_sm <= `TX_IDLE;
- endcase
-end
-
-// select the nibble to the nibble to character conversion
-always @ (tx_sm or read_data_s)
-begin
- case (tx_sm)
- `TX_IDLE: tx_nibble = read_data_s[7:4];
- `TX_HI_NIB: tx_nibble = read_data_s[3:0];
- default: tx_nibble = read_data_s[7:4];
- endcase
-end
-
-// sampled tx_busy
-always @ (posedge clock or posedge reset)
-begin
- if (reset)
- s_tx_busy <= 1'b0;
- else
- s_tx_busy <= tx_busy;
-end
-// tx end pulse
-assign tx_end_p = ~tx_busy & s_tx_busy;
-
-// character to nibble conversion
-always @ (rx_data)
-begin
- case (rx_data)
- `CHAR_0: data_nibble = 4'h0;
- `CHAR_1: data_nibble = 4'h1;
- `CHAR_2: data_nibble = 4'h2;
- `CHAR_3: data_nibble = 4'h3;
- `CHAR_4: data_nibble = 4'h4;
- `CHAR_5: data_nibble = 4'h5;
- `CHAR_6: data_nibble = 4'h6;
- `CHAR_7: data_nibble = 4'h7;
- `CHAR_8: data_nibble = 4'h8;
- `CHAR_9: data_nibble = 4'h9;
- `CHAR_A_UP, `CHAR_a_LO: data_nibble = 4'ha;
- `CHAR_B_UP, `CHAR_b_LO: data_nibble = 4'hb;
- `CHAR_C_UP, `CHAR_c_LO: data_nibble = 4'hc;
- `CHAR_D_UP, `CHAR_d_LO: data_nibble = 4'hd;
- `CHAR_E_UP, `CHAR_e_LO: data_nibble = 4'he;
- `CHAR_F_UP, `CHAR_f_LO: data_nibble = 4'hf;
- default: data_nibble = 4'hf;
- endcase
-end
-
-// nibble to character conversion
-always @ (tx_nibble)
-begin
- case (tx_nibble)
- 4'h0: tx_char = `CHAR_0;
- 4'h1: tx_char = `CHAR_1;
- 4'h2: tx_char = `CHAR_2;
- 4'h3: tx_char = `CHAR_3;
- 4'h4: tx_char = `CHAR_4;
- 4'h5: tx_char = `CHAR_5;
- 4'h6: tx_char = `CHAR_6;
- 4'h7: tx_char = `CHAR_7;
- 4'h8: tx_char = `CHAR_8;
- 4'h9: tx_char = `CHAR_9;
- 4'ha: tx_char = `CHAR_A_UP;
- 4'hb: tx_char = `CHAR_B_UP;
- 4'hc: tx_char = `CHAR_C_UP;
- 4'hd: tx_char = `CHAR_D_UP;
- 4'he: tx_char = `CHAR_E_UP;
- default: tx_char = `CHAR_F_UP;
- endcase
-end
-
-endmodule
-//---------------------------------------------------------------------------------------
-// Th.. Th.. Th.. Thats all folks !!!
-//---------------------------------------------------------------------------------------
Index: uart2bus/trunk/verilog/rtl/uart2bus_top.v
===================================================================
--- uart2bus/trunk/verilog/rtl/uart2bus_top.v (revision 2)
+++ uart2bus/trunk/verilog/rtl/uart2bus_top.v (nonexistent)
@@ -1,79 +0,0 @@
-//---------------------------------------------------------------------------------------
-// uart to internal bus top module
-//
-//---------------------------------------------------------------------------------------
-
-module uart2bus_top
-(
- // global signals
- clock, reset,
- // uart serial signals
- ser_in, ser_out,
- // internal bus to register file
- int_address, int_wr_data, int_write,
- int_rd_data, int_read
-);
-//---------------------------------------------------------------------------------------
-// modules inputs and outputs
-input clock; // global clock input
-input reset; // global reset input
-input ser_in; // serial data input
-output ser_out; // serial data output
-output [15:0] int_address; // address bus to register file
-output [7:0] int_wr_data; // write data to register file
-output int_write; // write control to register file
-output int_read; // read control to register file
-input [7:0] int_rd_data; // data read from register file
-
-// baud rate configuration, see baud_gen.v for more details.
-// baud rate generator parameters for 115200 baud on 44MHz clock
-`define D_BAUD_FREQ 12'd23
-`define D_BAUD_LIMIT 16'd527
-// baud rate generator parameters for 115200 baud on 40MHz clock
-//`define D_BAUD_FREQ 12'h90
-//`define D_BAUD_LIMIT 16'h0ba5
-// baud rate generator parameters for 9600 baud on 66MHz clock
-//`define D_BAUD_FREQ 12'h10
-//`define D_BAUD_LIMIT 16'h1ACB
-
-// internal wires
-wire [7:0] tx_data; // data byte to transmit
-wire new_tx_data; // asserted to indicate that there is a new data byte for transmission
-wire tx_busy; // signs that transmitter is busy
-wire [7:0] rx_data; // data byte received
-wire new_rx_data; // signs that a new byte was received
-wire [11:0] baud_freq;
-wire [15:0] baud_limit;
-wire baud_clk;
-
-//---------------------------------------------------------------------------------------
-// module implementation
-// uart top module instance
-uart_top uart1
-(
- .clock(clock), .reset(reset),
- .ser_in(ser_in), .ser_out(ser_out),
- .rx_data(rx_data), .new_rx_data(new_rx_data),
- .tx_data(tx_data), .new_tx_data(new_tx_data), .tx_busy(tx_busy),
- .baud_freq(baud_freq), .baud_limit(baud_limit),
- .baud_clk(baud_clk)
-);
-
-// assign baud rate default values
-assign baud_freq = `D_BAUD_FREQ;
-assign baud_limit = `D_BAUD_LIMIT;
-
-// uart parser instance
-uart_parser #(16) uart_parser1
-(
- .clock(clock), .reset(reset),
- .rx_data(rx_data), .new_rx_data(new_rx_data),
- .tx_data(tx_data), .new_tx_data(new_tx_data), .tx_busy(tx_busy),
- .int_address(int_address), .int_wr_data(int_wr_data), .int_write(int_write),
- .int_rd_data(int_rd_data), .int_read(int_read)
-);
-
-endmodule
-//---------------------------------------------------------------------------------------
-// Th.. Th.. Th.. Thats all folks !!!
-//---------------------------------------------------------------------------------------
Index: uart2bus/trunk/verilog/rtl/uart_top.v
===================================================================
--- uart2bus/trunk/verilog/rtl/uart_top.v (revision 2)
+++ uart2bus/trunk/verilog/rtl/uart_top.v (nonexistent)
@@ -1,66 +0,0 @@
-//---------------------------------------------------------------------------------------
-// uart top level module
-//
-//---------------------------------------------------------------------------------------
-
-module uart_top
-(
- // global signals
- clock, reset,
- // uart serial signals
- ser_in, ser_out,
- // transmit and receive internal interface signals
- rx_data, new_rx_data,
- tx_data, new_tx_data, tx_busy,
- // baud rate configuration register - see baud_gen.v for details
- baud_freq, baud_limit,
- baud_clk
-);
-//---------------------------------------------------------------------------------------
-// modules inputs and outputs
-input clock; // global clock input
-input reset; // global reset input
-input ser_in; // serial data input
-output ser_out; // serial data output
-input [7:0] tx_data; // data byte to transmit
-input new_tx_data; // asserted to indicate that there is a new data byte for transmission
-output tx_busy; // signs that transmitter is busy
-output [7:0] rx_data; // data byte received
-output new_rx_data; // signs that a new byte was received
-input [11:0] baud_freq; // baud rate setting registers - see header description
-input [15:0] baud_limit;
-output baud_clk;
-
-// internal wires
-wire ce_16; // clock enable at bit rate
-
-assign baud_clk = ce_16;
-//---------------------------------------------------------------------------------------
-// module implementation
-// baud rate generator module
-baud_gen baud_gen_1
-(
- .clock(clock), .reset(reset),
- .ce_16(ce_16), .baud_freq(baud_freq), .baud_limit(baud_limit)
-);
-
-// uart receiver
-uart_rx uart_rx_1
-(
- .clock(clock), .reset(reset),
- .ce_16(ce_16), .ser_in(ser_in),
- .rx_data(rx_data), .new_rx_data(new_rx_data)
-);
-
-// uart transmitter
-uart_tx uart_tx_1
-(
- .clock(clock), .reset(reset),
- .ce_16(ce_16), .tx_data(tx_data), .new_tx_data(new_tx_data),
- .ser_out(ser_out), .tx_busy(tx_busy)
-);
-
-endmodule
-//---------------------------------------------------------------------------------------
-// Th.. Th.. Th.. Thats all folks !!!
-//---------------------------------------------------------------------------------------
Index: uart2bus/trunk/doc/UART to Bus Core Specifications.pdf
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: uart2bus/trunk/doc/UART to Bus Core Specifications.pdf
===================================================================
--- uart2bus/trunk/doc/UART to Bus Core Specifications.pdf (revision 2)
+++ uart2bus/trunk/doc/UART to Bus Core Specifications.pdf (nonexistent)
uart2bus/trunk/doc/UART to Bus Core Specifications.pdf
Property changes :
Deleted: svn:mime-type
## -1 +0,0 ##
-application/octet-stream
\ No newline at end of property
Index: uart2bus/trunk/scilab/calc_baud_gen.sce
===================================================================
--- uart2bus/trunk/scilab/calc_baud_gen.sce (revision 2)
+++ uart2bus/trunk/scilab/calc_baud_gen.sce (nonexistent)
@@ -1,49 +0,0 @@
-// a short script to calaculate the baud rate generation parameters for the
-// UART to Bus core
-mode(-1)
-
-// define the GCD function since Scilab prefers to use a different function as gcd
-function x = gcdn(a,b)
-x = zeros(length(b),length(a));
-for n=1:length(a),
- for m=1:length(b),
- x=a(n);
- y=b(m);
- while y~=0
- r=modulo(x,y);
- x=y;
- y=r;
- end
- x(m,n) = x;
- end
-end
-endfunction
-
-// request the required clock rate and baud rate parameters
-dig_labels = ["Clock Frequency in MHz"; "UART Baud Rate in bps"];
-default_val = ["40", "115200"];
-params = evstr(x_mdialog("Enter Core Parameters", dig_labels, default_val));
-
-// extract the parameters
-global_clock_freq = params(1)*1e6;
-baud_rate = params(2);
-
-// calculate the baud rate generator parameters
-D_BAUD_FREQ = 16*baud_rate / gcdn(global_clock_freq, 16*baud_rate);
-D_BAUD_LIMIT = (global_clock_freq / gcdn(global_clock_freq, 16*baud_rate)) - D_BAUD_FREQ;
-
-// print the values to the command window
-printf("Calculated core baud rate generator parameters:\n");
-printf(" D_BAUD_FREQ = 12''d%d\n", D_BAUD_FREQ);
-printf(" D_BAUD_LIMIT = 16''d%d\n", D_BAUD_LIMIT);
-
-// open a message with the calculated values
-mes_str = ["Calculated core baud rate generator parameters:"; ...
- " D_BAUD_FREQ = "+string(D_BAUD_FREQ); ...
- " D_BAUD_LIMIT = "+string(D_BAUD_LIMIT); ...
- ""; ...
- "The verilog definition can be copied from the following lines:"; ...
- "`define D_BAUD_FREQ 12''d"+string(D_BAUD_FREQ); ...
- "`define D_BAUD_LIMIT 16''d"+string(D_BAUD_LIMIT);
- ];
-x_message_modeless(mes_str);