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

Subversion Repositories uart2bus

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /uart2bus/trunk
    from Rev 10 to Rev 11
    Reverse comparison

Rev 10 → Rev 11

/vhdl/test.txt File deleted \ No newline at end of file
/vhdl/test.bin Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
vhdl/test.bin Property changes : Deleted: svn:mime-type ## -1 +0,0 ## -application/octet-stream \ No newline at end of property Index: vhdl/bench/regFileModel.vhd =================================================================== --- vhdl/bench/regFileModel.vhd (revision 10) +++ vhdl/bench/regFileModel.vhd (nonexistent) @@ -1,51 +0,0 @@ ------------------------------------------------------------------------------------------ --- register file model as a simple memory --- ------------------------------------------------------------------------------------------ -library ieee; -use ieee.std_logic_1164.ALL; -use ieee.std_logic_unsigned.all; - -entity regFileModel is - port ( -- global signals - clr : in std_logic; -- global reset input - clk : in std_logic; -- global clock input - -- internal bus to register file - intAddress : in std_logic_vector(7 downto 0); -- address bus to register file - intWrData : in std_logic_vector(7 downto 0); -- write data to register file - intWrite : in std_logic; -- write control to register file - intRead : in std_logic; -- read control to register file - intRdData : out std_logic_vector(7 downto 0)); -- data read from register file -end regFileModel; - -architecture Behavioral of regFileModel is - - type RAM is array (integer range <>)of std_logic_vector (7 downto 0); - signal regFile : RAM (0 to 255); - - begin - -- register file write - process (clr, clk) - begin - if (clr = '1') then - for index in 0 to 255 loop - regFile(index) <= (others => '0'); - end loop; - elsif (rising_edge(clk)) then - if (intWrite = '1') then - regFile(conv_integer(intAddress)) <= intWrData; - end if; - end if; - end process; - -- register file read - process (clr, clk) - begin - if (clr = '1') then - intRdData <= (others => '0'); - elsif (rising_edge(clk)) then - if (intRead = '1') then - intRdData <= regFile(conv_integer(intAddress)); - end if; - end if; - end process; - end Behavioral; Index: vhdl/bench/helpers/helpers_pkg.vhd =================================================================== --- vhdl/bench/helpers/helpers_pkg.vhd (nonexistent) +++ vhdl/bench/helpers/helpers_pkg.vhd (revision 11) @@ -0,0 +1,18 @@ +library ieee; +use ieee.std_logic_1164.all; + +package helpers_pkg is + + component regFileModel + port + ( + clr : in std_logic; + clk : in std_logic; + intAddress : in std_logic_vector(7 downto 0); + intWrData : in std_logic_vector(7 downto 0); + intWrite : in std_logic; + intRead : in std_logic; + intRdData : out std_logic_vector(7 downto 0)); + end component; + +end helpers_pkg; Index: vhdl/bench/helpers/regFileModel.vhd =================================================================== --- vhdl/bench/helpers/regFileModel.vhd (nonexistent) +++ vhdl/bench/helpers/regFileModel.vhd (revision 11) @@ -0,0 +1,51 @@ +----------------------------------------------------------------------------------------- +-- register file model as a simple memory +-- +----------------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.ALL; +use ieee.std_logic_unsigned.all; + +entity regFileModel is + port ( -- global signals + clr : in std_logic; -- global reset input + clk : in std_logic; -- global clock input + -- internal bus to register file + intAddress : in std_logic_vector(7 downto 0); -- address bus to register file + intWrData : in std_logic_vector(7 downto 0); -- write data to register file + intWrite : in std_logic; -- write control to register file + intRead : in std_logic; -- read control to register file + intRdData : out std_logic_vector(7 downto 0)); -- data read from register file +end regFileModel; + +architecture Behavioral of regFileModel is + + type RAM is array (integer range <>)of std_logic_vector (7 downto 0); + signal regFile : RAM (0 to 255); + + begin + -- register file write + process (clr, clk) + begin + if (clr = '1') then + for index in 0 to 255 loop + regFile(index) <= (others => '0'); + end loop; + elsif (rising_edge(clk)) then + if (intWrite = '1') then + regFile(conv_integer(intAddress)) <= intWrData; + end if; + end if; + end process; + -- register file read + process (clr, clk) + begin + if (clr = '1') then + intRdData <= (others => '0'); + elsif (rising_edge(clk)) then + if (intRead = '1') then + intRdData <= regFile(conv_integer(intAddress)); + end if; + end if; + end process; + end Behavioral; Index: vhdl/bench/uart2BusTop_bin_tb.vhd =================================================================== --- vhdl/bench/uart2BusTop_bin_tb.vhd (revision 10) +++ vhdl/bench/uart2BusTop_bin_tb.vhd (revision 11) @@ -3,6 +3,7 @@ -- ----------------------------------------------------------------------------------------- use std.textio.all; + library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; @@ -9,6 +10,10 @@ use ieee.numeric_std.all; use ieee.std_logic_textio.all; +library work; +use work.uart2BusTop_pkg.all; +use work.helpers_pkg.all; + ----------------------------------------------------------------------------------------- -- test bench implementation entity uart2BusTop_bin_tb is @@ -50,37 +55,6 @@ wait for stopbit * bitTime; end procedure; - component uart2BusTop - generic - ( - AW : integer := 8 - ); - port - ( - clr : in std_logic; - clk : in std_logic; - serIn : in std_logic; - serOut : out std_logic; - intRdData : in std_logic_vector(7 downto 0); - intAddress : out std_logic_vector(AW - 1 downto 0); - intWrData : out std_logic_vector(7 downto 0); - intWrite : out std_logic; - intRead : out std_logic - ); - end component; - - component regFileModel - port - ( - clr : in std_logic; - clk : in std_logic; - intAddress : in std_logic_vector(7 downto 0); - intWrData : in std_logic_vector(7 downto 0); - intWrite : in std_logic; - intRead : in std_logic; - intRdData : out std_logic_vector(7 downto 0)); - end component; - -- Inputs signal clr : std_logic := '0'; signal clk : std_logic := '0'; @@ -95,6 +69,9 @@ signal intRead : std_logic; signal recvData : std_logic_vector(7 downto 0); signal newRxData : std_logic; + signal intAccessReq : std_logic; + signal intAccessGnt : std_logic; + signal counter : integer; constant BAUD_115200 : real := 115200.0; constant BAUD_38400 : real := 38400.0; @@ -127,6 +104,8 @@ clk => clk, serIn => serIn, serOut => serOut, + intAccessReq => intAccessReq, + intAccessGnt => intAccessGnt, intRdData => intRdData, intAddress => intAddress, intWrData => intWrData, @@ -145,6 +124,27 @@ intWrite => intWrite, intRead => intRead); + -- just to create a delay similar to simulate a bus arbitrer + process (clr, clk) + begin + if (clr = '1') then + intAccessGnt <= '0'; + counter <= 0; + elsif (rising_edge(clk)) then + if (counter = 0) then + if ((intAccessReq = '1') and (intAccessGnt = '0')) then + counter <= 500; + end if; + intAccessGnt <= '0'; + elsif (counter = 1) then + counter <= counter - 1; + intAccessGnt <= '1'; + else + counter <= counter - 1; + end if; + end if; + end process; + -- clock generator - 25MHz clock process begin @@ -184,7 +184,7 @@ process type dataFile is file of character; - file testBinaryFile : dataFile open READ_MODE is "test.bin"; + file testBinaryFile : dataFile open READ_MODE is "../test.bin"; variable charBuf : character; variable fileLength : integer; variable byteIndex : integer;
/vhdl/bench/uart2BusTop_txt_tb.vhd
1,211 → 1,212
-----------------------------------------------------------------------------------------
-- uart test bench
--
-----------------------------------------------------------------------------------------
use std.textio.all;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
use ieee.std_logic_textio.all;
 
-----------------------------------------------------------------------------------------
-- test bench implementation
entity uart2BusTop_txt_tb is
end uart2BusTop_txt_tb;
 
architecture behavior of uart2BusTop_txt_tb is
 
procedure sendSerial(data : integer; baud : in real; parity : in integer; stopbit : in real; bitnumber : in integer; baudError : in real; signal txd : inout std_logic) is
 
variable shiftreg : std_logic_vector(7 downto 0);
variable bitTime : time;
 
begin
bitTime := 1000 ms / (baud + baud * baudError / 100.0);
shiftreg := std_logic_vector(to_unsigned(data, shiftreg'length));
txd <= '0';
wait for bitTime;
for index in 0 to bitnumber loop
txd <= shiftreg(index);
wait for bitTime;
end loop;
txd <= '1';
wait for stopbit * bitTime;
end procedure;
 
procedure recvSerial( signal rxd : in std_logic; baud : in real; parity : in integer; stopbit : in real; bitnumber : in integer; baudError : in real; signal data : inout std_logic_vector(7 downto 0)) is
 
variable bitTime : time;
 
begin
bitTime := 1000 ms / (baud + baud * baudError / 100.0);
wait until (rxd = '0');
wait for bitTime / 2;
wait for bitTime;
for index in 0 to bitnumber loop
data <= rxd & data(7 downto 1);
wait for bitTime;
end loop;
wait for stopbit * bitTime;
end procedure;
 
component uart2BusTop
generic
(
AW : integer := 8
);
port
(
clr : in std_logic;
clk : in std_logic;
serIn : in std_logic;
serOut : out std_logic;
intRdData : in std_logic_vector(7 downto 0);
intAddress : out std_logic_vector(7 downto 0);
intWrData : out std_logic_vector(7 downto 0);
intWrite : out std_logic;
intRead : out std_logic
);
end component;
 
component regFileModel
port
(
clr : in std_logic;
clk : in std_logic;
intAddress : in std_logic_vector(7 downto 0);
intWrData : in std_logic_vector(7 downto 0);
intWrite : in std_logic;
intRead : in std_logic;
intRdData : out std_logic_vector(7 downto 0));
end component;
 
-- Inputs
signal clr : std_logic := '0';
signal clk : std_logic := '0';
signal serIn : std_logic := '0';
signal intRdData : std_logic_vector(7 downto 0) := (others => '0');
 
-- Outputs
signal serOut : std_logic;
signal intAddress : std_logic_vector(7 downto 0);
signal intWrData : std_logic_vector(7 downto 0);
signal intWrite : std_logic;
signal intRead : std_logic;
signal recvData : std_logic_vector(7 downto 0);
signal newRxData : std_logic;
constant BAUD_115200 : real := 115200.0;
constant BAUD_38400 : real := 38400.0;
constant BAUD_28800 : real := 28800.0;
constant BAUD_19200 : real := 19200.0;
constant BAUD_9600 : real := 9600.0;
constant BAUD_4800 : real := 4800.0;
constant BAUD_2400 : real := 2400.0;
constant BAUD_1200 : real := 1200.0;
constant NSTOPS_1 : real := 1.0;
constant NSTOPS_1_5 : real := 1.5;
constant NSTOPS_2 : real := 2.0;
constant PARITY_NONE : integer := 0;
constant PARITY_EVEN : integer := 1;
constant PARITY_ODD : integer := 2;
constant PARITY_MARK : integer := 3;
constant PARITY_SPACE : integer := 4;
constant NBITS_7 : integer := 6;
constant NBITS_8 : integer := 7;
begin
-- Instantiate the Unit Under Test (UUT)
uut : uart2BusTop
port map
(
clr => clr,
clk => clk,
serIn => serIn,
serOut => serOut,
intRdData => intRdData,
intAddress => intAddress,
intWrData => intWrData,
intWrite => intWrite,
intRead => intRead
);
 
rfm : regFileModel
port map
(
clr => clr,
clk => clk,
intRdData => intRdData,
intAddress => intAddress,
intWrData => intWrData,
intWrite => intWrite,
intRead => intRead);
 
-- clock generator - 25MHz clock
process
begin
clk <= '0';
wait for 20 ns;
clk <= '1';
wait for 20 ns;
end process;
 
-- reset process definitions
process
begin
clr <= '1';
wait for 40 ns;
clr <= '0';
wait;
end process;
 
--------------------------------------------------------------------
-- test bench receiver
process
 
begin
newRxData <= '0';
recvData <= (others => '0');
wait until (clr = '0');
loop
recvSerial(serOut, BAUD_115200, PARITY_NONE, NSTOPS_1, NBITS_8, 0.0, recvData);
newRxData <= '1';
wait for 25 ns;
newRxData <= '0';
end loop;
end process;
 
--------------------------------------------------------------------
-- uart transmit - test bench control
process
 
type dataFile is file of character;
file testTextFile : dataFile open READ_MODE is "test.txt";
variable charBuf : character;
variable data : integer;
 
begin
-- default value of serial output
serIn <= '1';
-- text mode simulation
write(tempLine, string'("Starting text mode simulation"));
writeline(output, tempLine);
wait until (clr = '0');
wait until (rising_edge(clk));
for index in 0 to 99 loop
wait until (rising_edge(clk));
end loop;
while not endfile(testTextFile) loop
-- transmit the byte in the command file one by one
read(testTextFile, charBuf);
data := character'pos(charBuf);
sendSerial(data, BAUD_115200, PARITY_NONE, NSTOPS_1, NBITS_8, 0.0, serIn);
wait for 800 us;
end loop;
wait;
end process;
end;
-----------------------------------------------------------------------------------------
-- uart test bench
--
-----------------------------------------------------------------------------------------
use std.textio.all;
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
use ieee.std_logic_textio.all;
 
library work;
use work.uart2BusTop_pkg.all;
use work.helpers_pkg.all;
 
-----------------------------------------------------------------------------------------
-- test bench implementation
entity uart2BusTop_txt_tb is
end uart2BusTop_txt_tb;
 
architecture behavior of uart2BusTop_txt_tb is
 
procedure sendSerial(data : integer; baud : in real; parity : in integer; stopbit : in real; bitnumber : in integer; baudError : in real; signal txd : inout std_logic) is
 
variable shiftreg : std_logic_vector(7 downto 0);
variable bitTime : time;
 
begin
bitTime := 1000 ms / (baud + baud * baudError / 100.0);
shiftreg := std_logic_vector(to_unsigned(data, shiftreg'length));
txd <= '0';
wait for bitTime;
for index in 0 to bitnumber loop
txd <= shiftreg(index);
wait for bitTime;
end loop;
txd <= '1';
wait for stopbit * bitTime;
end procedure;
 
procedure recvSerial( signal rxd : in std_logic; baud : in real; parity : in integer; stopbit : in real; bitnumber : in integer; baudError : in real; signal data : inout std_logic_vector(7 downto 0)) is
 
variable bitTime : time;
 
begin
bitTime := 1000 ms / (baud + baud * baudError / 100.0);
wait until (rxd = '0');
wait for bitTime / 2;
wait for bitTime;
for index in 0 to bitnumber loop
data <= rxd & data(7 downto 1);
wait for bitTime;
end loop;
wait for stopbit * bitTime;
end procedure;
 
-- Inputs
signal clr : std_logic := '0';
signal clk : std_logic := '0';
signal serIn : std_logic := '0';
signal intRdData : std_logic_vector(7 downto 0) := (others => '0');
 
-- Outputs
signal serOut : std_logic;
signal intAddress : std_logic_vector(7 downto 0);
signal intWrData : std_logic_vector(7 downto 0);
signal intWrite : std_logic;
signal intRead : std_logic;
signal recvData : std_logic_vector(7 downto 0);
signal newRxData : std_logic;
signal intAccessReq : std_logic;
signal intAccessGnt : std_logic;
signal counter : integer;
constant BAUD_115200 : real := 115200.0;
constant BAUD_38400 : real := 38400.0;
constant BAUD_28800 : real := 28800.0;
constant BAUD_19200 : real := 19200.0;
constant BAUD_9600 : real := 9600.0;
constant BAUD_4800 : real := 4800.0;
constant BAUD_2400 : real := 2400.0;
constant BAUD_1200 : real := 1200.0;
constant NSTOPS_1 : real := 1.0;
constant NSTOPS_1_5 : real := 1.5;
constant NSTOPS_2 : real := 2.0;
constant PARITY_NONE : integer := 0;
constant PARITY_EVEN : integer := 1;
constant PARITY_ODD : integer := 2;
constant PARITY_MARK : integer := 3;
constant PARITY_SPACE : integer := 4;
constant NBITS_7 : integer := 6;
constant NBITS_8 : integer := 7;
begin
-- Instantiate the Unit Under Test (UUT)
uut : uart2BusTop
port map
(
clr => clr,
clk => clk,
serIn => serIn,
serOut => serOut,
intAccessReq => intAccessReq,
intAccessGnt => intAccessGnt,
intRdData => intRdData,
intAddress => intAddress,
intWrData => intWrData,
intWrite => intWrite,
intRead => intRead
);
 
rfm : regFileModel
port map
(
clr => clr,
clk => clk,
intRdData => intRdData,
intAddress => intAddress,
intWrData => intWrData,
intWrite => intWrite,
intRead => intRead);
 
-- just to create a delay similar to simulate a bus arbitrer
process (clr, clk)
begin
if (clr = '1') then
intAccessGnt <= '0';
counter <= 0;
elsif (rising_edge(clk)) then
if (counter = 0) then
if ((intAccessReq = '1') and (intAccessGnt = '0')) then
counter <= 500;
end if;
intAccessGnt <= '0';
elsif (counter = 1) then
counter <= counter - 1;
intAccessGnt <= '1';
else
counter <= counter - 1;
end if;
end if;
end process;
 
-- clock generator - 25MHz clock
process
begin
clk <= '0';
wait for 20 ns;
clk <= '1';
wait for 20 ns;
end process;
 
-- reset process definitions
process
begin
clr <= '1';
wait for 40 ns;
clr <= '0';
wait;
end process;
 
--------------------------------------------------------------------
-- test bench receiver
process
 
begin
newRxData <= '0';
recvData <= (others => '0');
wait until (clr = '0');
loop
recvSerial(serOut, BAUD_115200, PARITY_NONE, NSTOPS_1, NBITS_8, 0.0, recvData);
newRxData <= '1';
wait for 25 ns;
newRxData <= '0';
end loop;
end process;
 
--------------------------------------------------------------------
-- uart transmit - test bench control
process
 
type dataFile is file of character;
file testTextFile : dataFile open READ_MODE is "../test.txt";
variable charBuf : character;
variable data : integer;
variable tempLine : line;
 
begin
-- default value of serial output
serIn <= '1';
-- text mode simulation
write(tempLine, string'("Starting text mode simulation"));
writeline(output, tempLine);
wait until (clr = '0');
wait until (rising_edge(clk));
for index in 0 to 99 loop
wait until (rising_edge(clk));
end loop;
while not endfile(testTextFile) loop
-- transmit the byte in the command file one by one
read(testTextFile, charBuf);
data := character'pos(charBuf);
sendSerial(data, BAUD_115200, PARITY_NONE, NSTOPS_1, NBITS_8, 0.0, serIn);
wait for 800 us;
end loop;
wait;
end process;
end;
vhdl/bench Property changes : Added: svn:ignore ## -0,0 +1 ## +*.bak Index: vhdl/rtl/baudGen.vhd =================================================================== --- vhdl/rtl/baudGen.vhd (revision 10) +++ vhdl/rtl/baudGen.vhd (revision 11) @@ -9,9 +9,9 @@ -- baud_limit = (global_clock_freq / gcd(global_clock_freq, 16*baud_rate)) - baud_freq -- ----------------------------------------------------------------------------------------- -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.STD_LOGIC_UNSIGNED.ALL; +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; entity baudGen is port ( clr : in std_logic; -- global reset input
/vhdl/rtl/uartRx.vhd
2,9 → 2,9
-- uart receive module
--
-----------------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
library ieee;
use ieee.std_logic_1164.ALL;
use ieee.std_logic_unsigned.ALL;
 
entity uartRx is
port ( clr : in std_logic; -- global reset input
60,7 → 60,7
elsif (rising_edge(clk)) then
if ((rxBusy = '0') and (ce1Mid = '1')) then
rxBusy <= '1';
elsif ((rxBusy = '1') and (bitCount = "1000") and (ce1 = '1')) then
elsif ((rxBusy = '1') and (bitCount = "1000") and (ce1Mid = '1')) then
rxBusy <= '0';
end if;
end if;
/vhdl/rtl/uartTx.vhd
2,9 → 2,9
-- uart transmit module
--
-----------------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
 
entity uartTx is
port ( clr : in std_logic; -- global reset input
/vhdl/rtl/uartParser.vhd
2,9 → 2,9
-- uart parser module
--
-----------------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
library ieee;
use ieee.std_logic_1164.ALL;
use ieee.std_logic_unsigned.ALL;
 
entity uartParser is
generic ( -- parameters
19,6 → 19,8
txData : out std_logic_vector(7 downto 0); -- data byte to transmit
newTxData : out std_logic; -- asserted to indicate that there is a new data byte for transmission
-- internal bus to register file
intReq : out std_logic; --
intGnt : in std_logic; --
intRdData : in std_logic_vector(7 downto 0); -- data read from register file
intAddress : out std_logic_vector(AW - 1 downto 0); -- address bus to register file
intWrData : out std_logic_vector(7 downto 0); -- write data to register file
105,10 → 107,12
signal addrNibble : std_logic_vector(3 downto 0); -- data nibble from received character
signal binByteCount : std_logic_vector(7 downto 0); -- binary mode byte counter
signal iIntAddress : std_logic_vector(intAddress'range); --
signal iWriteReq : std_logic; --
signal iIntWrite : std_logic; --
signal readDone : std_logic; -- internally generated read done flag
signal readDoneS : std_logic; -- sampled read done
signal readDataS : std_logic_vector(7 downto 0); -- sampled read data
signal iReadReq : std_logic; --
signal iIntRead : std_logic; --
signal txChar : std_logic_vector(7 downto 0); -- transmit byte from nibble to character conversion
signal sTxBusy : std_logic; -- sampled tx_busy for falling edge detection
356,29 → 360,37
process (clr, clk)
begin
if (clr = '1') then
iReadReq <= '0';
iIntRead <= '0';
iWriteReq <= '0';
iIntWrite <= '0';
intWrData <= (others => '0');
elsif (rising_edge(clk)) then
if ((mainSm = mainAddr) and (writeOp = '1') and (newRxData = '1') and (dataInHexRange = '0')) then
iIntWrite <= '1';
iWriteReq <= '1';
intWrData <= dataParam;
-- binary extension mode
elsif ((mainSm = mainBinData) and (binWriteOp = '1') and (newRxData = '1')) then
iWriteReq <= '1';
intWrData <= rxData;
elsif ((intGnt = '1') and (iWriteReq = '1')) then
iWriteReq <= '0';
iIntWrite <= '1';
intWrData <= rxData;
else
iIntWrite <= '0';
end if;
if ((mainSm = mainAddr) and (readOp = '1') and (newRxData = '1') and (dataInHexRange = '0')) then
iIntRead <= '1';
iReadReq <= '1';
-- binary extension
elsif ((mainSm = mainBinLen) and (binReadOp = '1') and (newRxData = '1')) then
-- the first read request is issued on reception of the length byte
iIntRead <= '1';
iReadReq <= '1';
elsif ((binReadOp = '1') and (txEndP = '1') and (binLastByte = '0')) then
-- the next read requests are issued after the previous read value was transmitted and
-- this is not the last byte to be read.
iReadReq <= '1';
elsif ((intGnt = '1') and (iReadReq = '1')) then
iReadReq <= '0';
iIntRead <= '1';
else
iIntRead <= '0';
559,4 → 571,6
intAddress <= iIntAddress;
intWrite <= iIntWrite;
intRead <= iIntRead;
intReq <= '1' when (iReadReq = '1') else
'1' when (iWriteReq = '1') else '0';
end Behavioral;
/vhdl/rtl/uart2BusTop.vhd
2,67 → 2,41
-- uart to internal bus top module
--
-----------------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
library ieee;
use ieee.std_logic_1164.all;
 
library work;
use work.uart2BusTop_pkg.all;
 
entity uart2BusTop is
generic ( AW : integer := 8);
port ( -- global signals
clr : in STD_LOGIC; -- global reset input
clk : in STD_LOGIC; -- global clock input
clr : in STD_LOGIC; -- global reset input
clk : in STD_LOGIC; -- global clock input
-- uart serial signals
serIn : in STD_LOGIC; -- serial data input
serOut : out STD_LOGIC; -- serial data output
serIn : in STD_LOGIC; -- serial data input
serOut : out STD_LOGIC; -- serial data output
-- internal bus to register file
intRdData : in STD_LOGIC_VECTOR (7 downto 0); -- data read from register file
intAddress : out STD_LOGIC_VECTOR (AW - 1 downto 0); -- address bus to register file
intWrData : out STD_LOGIC_VECTOR (7 downto 0); -- write data to register file
intWrite : out STD_LOGIC; -- write control to register file
intRead : out STD_LOGIC); -- read control to register file
intAccessReq : out std_logic; --
intAccessGnt : in std_logic; --
intRdData : in STD_LOGIC_VECTOR (7 downto 0); -- data read from register file
intAddress : out STD_LOGIC_VECTOR (AW - 1 downto 0); -- address bus to register file
intWrData : out STD_LOGIC_VECTOR (7 downto 0); -- write data to register file
intWrite : out STD_LOGIC; -- write control to register file
intRead : out STD_LOGIC); -- read control to register file
end uart2BusTop;
 
architecture Behavioral of uart2BusTop is
 
component uartTop
port ( clr : in std_logic;
clk : in std_logic;
serIn : in std_logic;
txData : in std_logic_vector(7 downto 0);
newTxData : in std_logic;
baudFreq : in std_logic_vector(11 downto 0);
baudLimit : in std_logic_vector(15 downto 0);
serOut : out std_logic;
txBusy : out std_logic;
rxData : out std_logic_vector(7 downto 0);
newRxData : out std_logic;
baudClk : out std_logic);
end component;
 
component uartParser
generic ( AW : integer := 8);
port ( clr : in std_logic;
clk : in std_logic;
txBusy : in std_logic;
rxData : in std_logic_vector(7 downto 0);
newRxData : in std_logic;
intRdData : in std_logic_vector(7 downto 0);
txData : out std_logic_vector(7 downto 0);
newTxData : out std_logic;
intAddress : out std_logic_vector(AW - 1 downto 0);
intWrData : out std_logic_vector(7 downto 0);
intWrite : out std_logic;
intRead : out std_logic);
end component;
 
-- baud rate configuration, see baudGen.vhd for more details.
-- baud rate generator parameters for 115200 baud on 25MHz clock
constant baudFreq : std_logic_vector(11 downto 0) := x"480";
constant baudLimit : std_logic_vector(15 downto 0) := x"3889";
signal txData : std_logic_vector(7 downto 0); -- data byte to transmit
signal newTxData : std_logic; -- asserted to indicate that there is a new data byte for transmission
signal txBusy : std_logic; -- signs that transmitter is busy
signal rxData : std_logic_vector(7 downto 0); -- data byte received
signal newRxData : std_logic; -- signs that a new byte was received
constant baudFreq : std_logic_vector(11 downto 0) := x"480";
constant baudLimit : std_logic_vector(15 downto 0) := x"3889";
signal txData : std_logic_vector(7 downto 0); -- data byte to transmit
signal newTxData : std_logic; -- asserted to indicate that there is a new data byte for transmission
signal txBusy : std_logic; -- signs that transmitter is busy
signal rxData : std_logic_vector(7 downto 0); -- data byte received
signal newRxData : std_logic; -- signs that a new byte was received
begin
-- uart top module instance
93,8 → 67,11
intRdData => intRdData,
txData => txData,
newTxData => newTxData,
intReq => intAccessReq,
intGnt => intAccessGnt,
intAddress => intAddress,
intWrData => intWrData,
intWrite => intWrite,
intRead => intRead);
 
end Behavioral;
/vhdl/rtl/uart2BusTop_pkg.vhd
0,0 → 1,90
library ieee;
use ieee.std_logic_1164.all;
 
package uart2BusTop_pkg is
 
component baudGen
port (
clr : in std_logic;
clk : in std_logic;
baudFreq : in std_logic_vector(11 downto 0);
baudLimit : in std_logic_vector(15 downto 0);
ce16 : out std_logic);
end component;
 
component uartTx
port (
clr : in std_logic;
clk : in std_logic;
ce16 : in std_logic;
txData : in std_logic_vector(7 downto 0);
newTxData : in std_logic;
serOut : out std_logic;
txBusy : out std_logic);
end component;
 
component uartRx
port (
clr : in std_logic;
clk : in std_logic;
ce16 : in std_logic;
serIn : in std_logic;
rxData : out std_logic_vector(7 downto 0);
newRxData : out std_logic);
end component;
 
component uartTop
port ( clr : in std_logic;
clk : in std_logic;
serIn : in std_logic;
txData : in std_logic_vector(7 downto 0);
newTxData : in std_logic;
baudFreq : in std_logic_vector(11 downto 0);
baudLimit : in std_logic_vector(15 downto 0);
serOut : out std_logic;
txBusy : out std_logic;
rxData : out std_logic_vector(7 downto 0);
newRxData : out std_logic;
baudClk : out std_logic);
end component;
 
component uartParser
generic ( AW : integer := 8);
port ( clr : in std_logic;
clk : in std_logic;
txBusy : in std_logic;
rxData : in std_logic_vector(7 downto 0);
newRxData : in std_logic;
intRdData : in std_logic_vector(7 downto 0);
txData : out std_logic_vector(7 downto 0);
newTxData : out std_logic;
intReq : out std_logic;
intGnt : in std_logic;
intAddress : out std_logic_vector(AW - 1 downto 0);
intWrData : out std_logic_vector(7 downto 0);
intWrite : out std_logic;
intRead : out std_logic);
end component;
 
component uart2BusTop
generic
(
AW : integer := 8
);
port
(
clr : in std_logic;
clk : in std_logic;
serIn : in std_logic;
serOut : out std_logic;
intAccessReq : out std_logic;
intAccessGnt : in std_logic;
intRdData : in std_logic_vector(7 downto 0);
intAddress : out std_logic_vector(AW - 1 downto 0);
intWrData : out std_logic_vector(7 downto 0);
intWrite : out std_logic;
intRead : out std_logic
);
end component;
 
end uart2BusTop_pkg;
/vhdl/rtl/uartTop.vhd
2,9 → 2,12
-- uart top level module
--
-----------------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
library ieee;
use ieee.std_logic_1164.all;
 
library work;
use work.uart2BusTop_pkg.all;
 
entity uartTop is
port ( -- global signals
clr : in std_logic; -- global reset input
26,36 → 29,6
 
architecture Behavioral of uartTop is
 
component baudGen
port (
clr : in std_logic;
clk : in std_logic;
baudFreq : in std_logic_vector(11 downto 0);
baudLimit : in std_logic_vector(15 downto 0);
ce16 : out std_logic);
end component;
 
component uartTx
port (
clr : in std_logic;
clk : in std_logic;
ce16 : in std_logic;
txData : in std_logic_vector(7 downto 0);
newTxData : in std_logic;
serOut : out std_logic;
txBusy : out std_logic);
end component;
 
component uartRx
port (
clr : in std_logic;
clk : in std_logic;
ce16 : in std_logic;
serIn : in std_logic;
rxData : out std_logic_vector(7 downto 0);
newRxData : out std_logic);
end component;
 
signal ce16 : std_logic; -- clock enable at bit rate
 
begin
/vhdl/sim/test.bin Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
vhdl/sim/test.bin Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: vhdl/sim/modelsim/uart2bus_txt_sim.tcl =================================================================== --- vhdl/sim/modelsim/uart2bus_txt_sim.tcl (nonexistent) +++ vhdl/sim/modelsim/uart2bus_txt_sim.tcl (revision 11) @@ -0,0 +1,37 @@ +set prj_home "../.." +set tb_home "$prj_home/bench" +set src_home "$prj_home/rtl" +set sim_home "$prj_home/sim/modelsim" +set wave_file "wave_uart2bus_txt.do" +set time "50 ms" + +transcript file "" +transcript file $sim_home/transcript.log + +if {[file exists $sim_home/work]} { + file delete -force $sim_home/work +} +vlib $sim_home/work +vmap work $sim_home/work + +vcom -work work $src_home/uart2BusTop_pkg.vhd +vcom -work work $src_home/uartTx.vhd +vcom -work work $src_home/uartRx.vhd +vcom -work work $src_home/baudGen.vhd +vcom -work work $src_home/uartTop.vhd +vcom -work work $src_home/uartParser.vhd +vcom -work work $src_home/uart2BusTop.vhd + +vcom -work work $tb_home/helpers/helpers_pkg.vhd +vcom -work work $tb_home/helpers/regFileModel.vhd +vcom -work work $tb_home/uart2BusTop_txt_tb.vhd + +onbreak {resume} + +vsim -voptargs=+acc work.uart2BusTop_txt_tb(behavior) + +do $sim_home/$wave_file + +run $time + +transcript file "" \ No newline at end of file Index: vhdl/sim/modelsim/wave_uart2bus_bin.do =================================================================== --- vhdl/sim/modelsim/wave_uart2bus_bin.do (nonexistent) +++ vhdl/sim/modelsim/wave_uart2bus_bin.do (revision 11) @@ -0,0 +1,63 @@ +onerror {resume} +virtual type { \ +Idle\ +HiNib\ +{0x4 LoNib}\ +{0x5 CharCR}\ +{0x6 CharLF}\ +{default undefined_state}\ +} vt_tx +virtual type { \ +Idle\ +White1\ +Data\ +White2\ +Addr\ +Eol\ +{0x8 BinCmd}\ +{0x9 BinAdrh}\ +{0xa BinAdrl}\ +{0xb BinLen}\ +{0xc BinData}\ +{default undefined_state}\ +} vt_main +quietly virtual signal -install /uart2bustop_bin_tb/uut/up {/uart2bustop_bin_tb/uut/up/mainsm } vs_main +quietly virtual signal -install /uart2bustop_bin_tb/uut/up {/uart2bustop_bin_tb/uut/up/txsm } vs_tx +quietly virtual function -install /uart2bustop_bin_tb/uut/up -env /uart2bustop_bin_tb { (vt_main) /uart2bustop_bin_tb/uut/up/vs_main} vf_main +quietly virtual function -install /uart2bustop_bin_tb/uut/up -env /uart2bustop_bin_tb { (vt_tx) /uart2bustop_bin_tb/uut/up/vs_tx} vf_tx +quietly WaveActivateNextPane {} 0 +add wave -noupdate -divider {global signals} +add wave -noupdate -format Logic /uart2bustop_bin_tb/clr +add wave -noupdate -format Logic /uart2bustop_bin_tb/clk +add wave -noupdate -divider {UART serial signals} +add wave -noupdate -format Logic /uart2bustop_bin_tb/serin +add wave -noupdate -format Logic /uart2bustop_bin_tb/serout +add wave -noupdate -divider {Internal bus to register file} +add wave -noupdate -format Logic /uart2bustop_bin_tb/intaccessreq +add wave -noupdate -format Logic /uart2bustop_bin_tb/intaccessgnt +add wave -noupdate -format Literal -radix hexadecimal /uart2bustop_bin_tb/intrddata +add wave -noupdate -format Literal -radix hexadecimal /uart2bustop_bin_tb/intaddress +add wave -noupdate -format Literal -radix hexadecimal /uart2bustop_bin_tb/intwrdata +add wave -noupdate -format Logic /uart2bustop_bin_tb/intwrite +add wave -noupdate -format Logic /uart2bustop_bin_tb/intread +add wave -noupdate -divider Debug +add wave -noupdate -format Literal -radix hexadecimal /uart2bustop_bin_tb/recvdata +add wave -noupdate -format Logic /uart2bustop_bin_tb/newrxdata +add wave -noupdate -format Literal /uart2bustop_bin_tb/uut/up/vf_main +add wave -noupdate -format Literal /uart2bustop_bin_tb/uut/up/vf_tx +TreeUpdate [SetDefaultTree] +configure wave -namecolwidth 200 +configure wave -valuecolwidth 40 +configure wave -justifyvalue left +configure wave -signalnamewidth 0 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 1 +configure wave -griddelta 40 +configure wave -timeline 0 +configure wave -timelineunits ps +update +WaveRestoreZoom {0 ps} {2625 us} Index: vhdl/sim/modelsim/uart2bus_txt_sim.bat =================================================================== --- vhdl/sim/modelsim/uart2bus_txt_sim.bat (nonexistent) +++ vhdl/sim/modelsim/uart2bus_txt_sim.bat (revision 11) @@ -0,0 +1,3 @@ +@Echo Off +Rem Modify the below vsim.exe path to run the test bench +C:\Modeltech_xe_starter\win32xoem\vsim.exe -do uart2bus_txt_sim.tcl Index: vhdl/sim/modelsim/uart2bus_bin_sim.tcl =================================================================== --- vhdl/sim/modelsim/uart2bus_bin_sim.tcl (nonexistent) +++ vhdl/sim/modelsim/uart2bus_bin_sim.tcl (revision 11) @@ -0,0 +1,37 @@ +set prj_home "../.." +set tb_home "$prj_home/bench" +set src_home "$prj_home/rtl" +set sim_home "$prj_home/sim/modelsim" +set wave_file "wave_uart2bus_bin.do" +set time "2500 us" + +transcript file "" +transcript file $sim_home/transcript.log + +if {[file exists $sim_home/work]} { + file delete -force $sim_home/work +} +vlib $sim_home/work +vmap work $sim_home/work + +vcom -work work $src_home/uart2BusTop_pkg.vhd +vcom -work work $src_home/uartTx.vhd +vcom -work work $src_home/uartRx.vhd +vcom -work work $src_home/baudGen.vhd +vcom -work work $src_home/uartTop.vhd +vcom -work work $src_home/uartParser.vhd +vcom -work work $src_home/uart2BusTop.vhd + +vcom -work work $tb_home/helpers/helpers_pkg.vhd +vcom -work work $tb_home/helpers/regFileModel.vhd +vcom -work work $tb_home/uart2BusTop_bin_tb.vhd + +onbreak {resume} + +vsim -voptargs=+acc work.uart2BusTop_bin_tb(behavior) + +do $sim_home/$wave_file + +run $time + +transcript file "" \ No newline at end of file Index: vhdl/sim/modelsim/wave_uart2bus_txt.do =================================================================== --- vhdl/sim/modelsim/wave_uart2bus_txt.do (nonexistent) +++ vhdl/sim/modelsim/wave_uart2bus_txt.do (revision 11) @@ -0,0 +1,63 @@ +onerror {resume} +virtual type { \ +Idle\ +HiNib\ +{0x4 LoNib}\ +{0x5 CharCR}\ +{0x6 CharLF}\ +{default undefined_state}\ +} vt_tx +virtual type { \ +Idle\ +White1\ +Data\ +White2\ +Addr\ +Eol\ +{0x8 BinCmd}\ +{0x9 BinAdrh}\ +{0xa BinAdrl}\ +{0xb BinLen}\ +{0xc BinData}\ +{default undefined_state}\ +} vt_main +quietly virtual signal -install /uart2bustop_txt_tb/uut/up {/uart2bustop_txt_tb/uut/up/mainsm } vs_main +quietly virtual signal -install /uart2bustop_txt_tb/uut/up {/uart2bustop_txt_tb/uut/up/txsm } vs_tx +quietly virtual function -install /uart2bustop_txt_tb/uut/up -env /uart2bustop_txt_tb { (vt_main) /uart2bustop_txt_tb/uut/up/vs_main} vf_main +quietly virtual function -install /uart2bustop_txt_tb/uut/up -env /uart2bustop_txt_tb { (vt_tx) /uart2bustop_txt_tb/uut/up/vs_tx} vf_tx +quietly WaveActivateNextPane {} 0 +add wave -noupdate -divider {global signals} +add wave -noupdate -format Logic /uart2bustop_txt_tb/clr +add wave -noupdate -format Logic /uart2bustop_txt_tb/clk +add wave -noupdate -divider {UART serial signals} +add wave -noupdate -format Logic /uart2bustop_txt_tb/serin +add wave -noupdate -format Logic /uart2bustop_txt_tb/serout +add wave -noupdate -divider {Internal bus to register file} +add wave -noupdate -format Logic /uart2bustop_txt_tb/intaccessreq +add wave -noupdate -format Logic /uart2bustop_txt_tb/intaccessgnt +add wave -noupdate -format Literal -radix hexadecimal /uart2bustop_txt_tb/intrddata +add wave -noupdate -format Literal -radix hexadecimal /uart2bustop_txt_tb/intaddress +add wave -noupdate -format Literal -radix hexadecimal /uart2bustop_txt_tb/intwrdata +add wave -noupdate -format Logic /uart2bustop_txt_tb/intwrite +add wave -noupdate -format Logic /uart2bustop_txt_tb/intread +add wave -noupdate -divider Debug +add wave -noupdate -format Literal -radix hexadecimal /uart2bustop_txt_tb/recvdata +add wave -noupdate -format Logic /uart2bustop_txt_tb/newrxdata +add wave -noupdate -format Literal /uart2bustop_txt_tb/uut/up/vf_main +add wave -noupdate -format Literal /uart2bustop_txt_tb/uut/up/vf_tx +TreeUpdate [SetDefaultTree] +configure wave -namecolwidth 200 +configure wave -valuecolwidth 40 +configure wave -justifyvalue left +configure wave -signalnamewidth 0 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 1 +configure wave -griddelta 40 +configure wave -timeline 0 +configure wave -timelineunits ps +update +WaveRestoreZoom {0 ps} {52500 us} Index: vhdl/sim/modelsim/uart2bus_bin_sim.bat =================================================================== --- vhdl/sim/modelsim/uart2bus_bin_sim.bat (nonexistent) +++ vhdl/sim/modelsim/uart2bus_bin_sim.bat (revision 11) @@ -0,0 +1,3 @@ +@Echo Off +Rem Modify the below vsim.exe path to run the test bench +C:\Modeltech_xe_starter\win32xoem\vsim.exe -do uart2bus_bin_sim.tcl Index: vhdl/sim/modelsim =================================================================== --- vhdl/sim/modelsim (revision 10) +++ vhdl/sim/modelsim (revision 11)
vhdl/sim/modelsim Property changes : Added: svn:ignore ## -0,0 +1,5 ## +*.ini +*.log +*.wlf +transcript +work Index: vhdl/sim/test.txt =================================================================== --- vhdl/sim/test.txt (nonexistent) +++ vhdl/sim/test.txt (revision 11) @@ -0,0 +1,6 @@ +w de 1a; +r 1a; +r 0a; +w 12 0a; +r 1a; +r 0a; \ No newline at end of file Index: vhdl/syn/xilinx/uart2bus.xise =================================================================== --- vhdl/syn/xilinx/uart2bus.xise (revision 10) +++ vhdl/syn/xilinx/uart2bus.xise (revision 11) @@ -27,6 +27,10 @@ + + + + @@ -35,28 +39,10 @@ - + - - - - - - - - - - - - - - - - - - @@ -80,8 +66,8 @@ - - + + @@ -123,7 +109,7 @@ - + @@ -142,7 +128,7 @@ - + @@ -241,7 +227,7 @@ - + @@ -298,7 +284,6 @@ - @@ -314,7 +299,7 @@ - + @@ -356,7 +341,7 @@ - + @@ -363,7 +348,7 @@ - + @@ -374,8 +359,8 @@ - - + +
vhdl/syn/xilinx Property changes : Added: svn:ignore ## -0,0 +1,16 ## +*.cmd_log +*.gise +*.html +*.ise +*.lso +*.ngc +*.ngr +*.ntrc_log +*.prj +*.stx +*.syr +*.xrpt +*.xst +_xmsgs +uart2bus_xdb +xst Index: vhdl =================================================================== --- vhdl (revision 10) +++ vhdl (revision 11)
vhdl Property changes : Added: svn:ignore ## -0,0 +1,16 ## +*.cmd_log +*.gise +*.html +*.ise +*.lso +*.ngc +*.ngr +*.ntrc_log +*.prj +*.stx +*.syr +*.xrpt +*.xst +_xmsgs +uart2bus_xdb +xst

powered by: WebSVN 2.1.0

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