On Jan 29, 11:46 am, jleslie48 <j...@jonathanleslie.com> wrote:
> On Jan 29, 12:35 am, rickman <gnu...@gmail.com> wrote:
>
> > I have to say that I find your learning process to be very
> > interesting. It has been so long for me that I have forgotten exactly
> > what it was that I had to learn or unlearn to switch from software to
> > HDL. I am getting a feel for that again.
>
> So glad your enjoying yourself :))))))
>
> Rata-fracken,summana,friken,thing-a-mabob....
Ok, boys, things are finishing up on a high note this week.
My partner in crime here in NJ got his UART working, and with it
albiet not pretty,
a working hello world program. Now the producers and consumers are a
bit raw,
but the throttle on the 16 byte "bucket brigade" fifo seems to be
working.
His messaging was pretty messy, but using some of the techniques
discussed here,
I'm starting to clean them up. here is a snippet of the cleaned up
code:
----------------------------
constant project_name_stg : string := "Testing 1, 2, 3! and
some more characters too!!!";
SIGNAL project_name_cnt : INTEGER RANGE
project_name_stg'range;
SIGNAL lprj_MESS_TRAN : STD_LOGIC := '0';
constant person_mess_stg : string := "Cindy Crawford's
measurments are: 34, 24, 34";
SIGNAL person_mess_cnt : INTEGER RANGE
person_mess_stg'range;
SIGNAL lprj_person_TRAN : STD_LOGIC := '0';
SIGNAL lprj_PERSON_TRAN_ENABLE :
STD_LOGIC := '0';
...
-------------------------------------------------------------------------------------------------
-- SENDING lprj PROJECT MESSAGE TO TRANSMIT UART ( TX_DATA_IN
[ 7-0 ] )
-------------------------------------------------------------------------------------------------
P16: PROCESS ( CLK_16_6MHZ, UART_RESET_BUFFER, TX_BUFFER_FULL,
TX_WRITE_BUFFER_STB,
lprj_MESS_TRAN, project_name_cnt,
lprj_PERSON_TRAN, person_mess_cnt,
lprj_RECEIVE_TRAN, RECEIVE_MAX, RECEIVE_MESS
( 0 TO lprj_RECEIVE_MAX ) )
BEGIN
IF ( CLK_16_6MHZ = '1' AND CLK_16_6MHZ'EVENT ) THEN
IF ( UART_RESET_BUFFER = '0' ) THEN
IF ( ( lprj_MESS_TRAN = '1' ) AND
( TX_BUFFER_FULL = '0' ) AND
( TX_WRITE_BUFFER_STB = '0' ) ) THEN
--TX_DATA_IN( 7 DOWNTO 0 ) <= PROJECT_NAME
( lprj_MESS_CNT );
TX_DATA_IN <= to_slv(project_name_stg
( project_name_cnt ));
ELSIF ( ( lprj_PERSON_TRAN = '1' ) AND
( TX_BUFFER_FULL = '0' ) AND
( TX_WRITE_BUFFER_STB = '0' ) ) THEN
TX_DATA_IN <= to_slv(person_mess_stg
( person_mess_cnt ));
ELSIF ( ( lprj_RECEIVE_TRAN = '1' ) AND
( TX_BUFFER_FULL = '0' ) AND
( TX_WRITE_BUFFER_STB = '0' ) ) THEN
TX_DATA_IN( 7 DOWNTO 0 ) <= RECEIVE_MESS( RECEIVE_MAX );
END IF;
END IF;
END IF;
END PROCESS P16;
-----------------------------
which while is a vast improvement over what code he gave me:
-------------------------
-- ASCII NUMBERS
-----------------------------------------------------------------------------
constant N0 : std_logic_vector( 7 DOWNTO 0 ) := x"30";
-- ASCII VALUE FOR UART
constant N1 : std_logic_vector( 7 DOWNTO 0 ) := x"31";
-- ASCII VALUE FOR UART
constant N2 : std_logic_vector( 7 DOWNTO 0 ) := x"32";
-- ASCII VALUE FOR UART
constant N3 : std_logic_vector( 7 DOWNTO 0 ) := x"33";
-- ASCII VALUE FOR UART
constant N4 : std_logic_vector( 7 DOWNTO 0 ) := x"34";
-- ASCII VALUE FOR UART
...<the whole alphabet>...
----------------------------------------------------------------------------------------------
-- LOKI PERSON MESSAGE ARRAY
- 44 CHARACTERS
----------------------------------------------------------------------------------------------
SUBTYPE REG_A IS STD_LOGIC_VECTOR( 7 DOWNTO 0 );
TYPE LOKI_PERSON IS ARRAY ( INTEGER RANGE <> ) OF REG_A;
SIGNAL LOKI_PERSON_TRAN :
STD_LOGIC := '0';
CONSTANT LOKI_PERSON_MAX :
INTEGER := 43;
SIGNAL LOKI_PERSON_CNT : INTEGER RANGE 0 TO
LOKI_PERSON_MAX;
SIGNAL LOKI_PERSON_TRAN_ENABLE :
STD_LOGIC := '0';
SIGNAL PERSON_MESS : LOKI_PERSON( 0 TO
LOKI_PERSON_MAX )
:= ( CR, AC, AI, AN, AD, AY, SP, AC, AR, AA, AW, AF, AO,
AR, AD, PO, AS, SP,
AM, AE, AA, AS, AU, AR, AE, AM, AE, AN, AT, AS, SP,
AA, AR, AE, SP,
N3, N4, SP, N2, N4, SP, N3, N4, CR );
...
------------------------
However, my version of the code skips the first letter of each of the
messages!
the problem I'm sure resides in this bit here:
mine:
-------------------------------------------------------------------------------------------------
-- INITIALIZING lprj PROJECT MESSAGE COUNT ( project_name_cnt )
-------------------------------------------------------------------------------------------------
P10: PROCESS ( CLK_16_6MHZ, UART_RESET_BUFFER, UART_RESET_NEXT,
lprj_MESS_TRAN, TX_WRITE_BUFFER_STB )
BEGIN
IF ( CLK_16_6MHZ = '1' AND CLK_16_6MHZ'EVENT ) THEN
IF ( ( UART_RESET_BUFFER = '0' ) AND
( UART_RESET_NEXT = '1' ) ) THEN
project_name_cnt <= project_name_stg'low;
ELSIF ( ( lprj_MESS_TRAN = '1' ) AND
( TX_WRITE_BUFFER_STB = '1' ) AND
( project_name_cnt /=
project_name_stg'high ) ) THEN
project_name_cnt <= ( project_name_cnt + 1 );
END IF;
END IF;
END PROCESS P10;
his:
-------------------------------------------------------------------------------------------------
-- INITIALIZING LOKI PROJECT MESSAGE COUNT ( LOKI_MESS_CNT )
-------------------------------------------------------------------------------------------------
P10: PROCESS ( CLK_16_6MHZ, UART_RESET_BUFFER, UART_RESET_NEXT,
LOKI_MESS_TRAN, TX_WRITE_BUFFER_STB )
BEGIN
IF ( CLK_16_6MHZ = '1' AND CLK_16_6MHZ'EVENT ) THEN
IF ( ( UART_RESET_BUFFER = '0' ) AND
( UART_RESET_NEXT = '1' ) ) THEN
LOKI_MESS_CNT <= 0;
ELSIF ( ( LOKI_MESS_TRAN = '1' ) AND
( TX_WRITE_BUFFER_STB = '1' ) AND
( LOKI_MESS_CNT /= LOKI_MESS_MAX ) ) THEN
LOKI_MESS_CNT <= ( LOKI_MESS_CNT + 1 );
END IF;
END IF;
END PROCESS P10;
--------------------------
I'm guessing that project_name_stg'low is coming in at a 1 instead of
0, and
the increment therefore goes to 2, and I start with the second
character.
Since I've also finally got the testbench going, I should be able to
see that
project_name_cnt increment to 2 before the first character hits the
the TXT_DATA_IN.
That's what I about to check out. its Testbench time!!!
To be continued....