3248 lines
95 KiB
VHDL
3248 lines
95 KiB
VHDL
-- VHDL Entity Board.morse_ebs3.symbol
|
||
--
|
||
-- Created:
|
||
-- by - axel.amand.UNKNOWN (WE7860)
|
||
-- at - 08:06:36 08.05.2023
|
||
--
|
||
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
||
--
|
||
LIBRARY ieee;
|
||
USE ieee.std_logic_1164.all;
|
||
USE ieee.numeric_std.all;
|
||
|
||
ENTITY morse_ebs3 IS
|
||
PORT(
|
||
RxD : IN std_ulogic;
|
||
clock : IN std_ulogic;
|
||
morseIn : IN std_uLogic;
|
||
reset_n : IN std_ulogic;
|
||
RxD_synch : OUT std_ulogic;
|
||
TxD : OUT std_ulogic;
|
||
morseEnvelope : OUT std_ulogic;
|
||
morseOut : OUT std_ulogic
|
||
);
|
||
|
||
-- Declarations
|
||
|
||
END morse_ebs3 ;
|
||
|
||
|
||
|
||
|
||
|
||
-- VHDL Entity Board.inverterIn.symbol
|
||
--
|
||
-- Created:
|
||
-- by - francois.francois (Aphelia)
|
||
-- at - 13:07:14 02/19/19
|
||
--
|
||
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
||
--
|
||
LIBRARY ieee;
|
||
USE ieee.std_logic_1164.all;
|
||
|
||
ENTITY inverterIn IS
|
||
PORT(
|
||
in1 : IN std_uLogic;
|
||
out1 : OUT std_uLogic
|
||
);
|
||
|
||
-- Declarations
|
||
|
||
END inverterIn ;
|
||
|
||
|
||
|
||
|
||
|
||
ARCHITECTURE sim OF inverterIn IS
|
||
BEGIN
|
||
|
||
out1 <= NOT in1;
|
||
|
||
END ARCHITECTURE sim;
|
||
|
||
|
||
|
||
|
||
|
||
-- VHDL Entity Board.DFF.symbol
|
||
--
|
||
-- Created:
|
||
-- by - francois.francois (Aphelia)
|
||
-- at - 13:07:05 02/19/19
|
||
--
|
||
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
||
--
|
||
LIBRARY ieee;
|
||
USE ieee.std_logic_1164.all;
|
||
|
||
ENTITY DFF IS
|
||
PORT(
|
||
CLK : IN std_uLogic;
|
||
CLR : IN std_uLogic;
|
||
D : IN std_uLogic;
|
||
Q : OUT std_uLogic
|
||
);
|
||
|
||
-- Declarations
|
||
|
||
END DFF ;
|
||
|
||
|
||
|
||
|
||
|
||
ARCHITECTURE sim OF DFF IS
|
||
BEGIN
|
||
|
||
process(clk, clr)
|
||
begin
|
||
if clr = '1' then
|
||
q <= '0';
|
||
elsif rising_edge(clk) then
|
||
q <= d;
|
||
end if;
|
||
end process;
|
||
|
||
END ARCHITECTURE sim;
|
||
|
||
|
||
|
||
|
||
|
||
-- VHDL Entity Morse.morseDecoder.symbol
|
||
--
|
||
-- Created:
|
||
-- by - francois.francois (Aphelia)
|
||
-- at - 09:13:01 03/29/19
|
||
--
|
||
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
||
--
|
||
LIBRARY ieee;
|
||
USE ieee.std_logic_1164.all;
|
||
USE ieee.numeric_std.all;
|
||
|
||
ENTITY morseDecoder IS
|
||
GENERIC(
|
||
clockFrequency : real := 100.0E6;
|
||
uartBaudRate : real := 115.2E3;
|
||
uartDataBitNb : positive := 8;
|
||
unitDuration : real := 100.0E-3;
|
||
toneFrequency : real := 300.0;
|
||
deglitchBitNb : natural := 8
|
||
);
|
||
PORT(
|
||
morseCode : IN std_ulogic;
|
||
clock : IN std_ulogic;
|
||
reset : IN std_ulogic;
|
||
TxD : OUT std_ulogic;
|
||
morseEnvelope : OUT std_ulogic
|
||
);
|
||
|
||
-- Declarations
|
||
|
||
END morseDecoder ;
|
||
|
||
|
||
|
||
|
||
|
||
-- VHDL Entity Memory.FIFO_bram.symbol
|
||
--
|
||
-- Created:
|
||
-- by - francois.francois (Aphelia)
|
||
-- at - 13:45:15 08/28/19
|
||
--
|
||
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
||
--
|
||
LIBRARY ieee;
|
||
USE ieee.std_logic_1164.all;
|
||
USE ieee.numeric_std.all;
|
||
|
||
ENTITY FIFO_bram IS
|
||
GENERIC(
|
||
dataBitNb : positive := 8;
|
||
depth : positive := 8
|
||
);
|
||
PORT(
|
||
write : IN std_ulogic;
|
||
clock : IN std_ulogic;
|
||
reset : IN std_ulogic;
|
||
dataOut : OUT std_ulogic_vector (dataBitNb-1 DOWNTO 0);
|
||
read : IN std_ulogic;
|
||
dataIn : IN std_ulogic_vector (dataBitNb-1 DOWNTO 0);
|
||
empty : OUT std_ulogic;
|
||
full : OUT std_ulogic
|
||
);
|
||
|
||
-- Declarations
|
||
|
||
END FIFO_bram ;
|
||
|
||
|
||
|
||
|
||
|
||
--------------------------------------------------------------------------------
|
||
-- Copyright 2012 HES-SO Valais Wallis (www.hevs.ch)
|
||
--------------------------------------------------------------------------------
|
||
-- This program is free software: you can redistribute it and/or modify
|
||
-- it under the terms of the GNU General Public License as published by
|
||
-- the Free Software Foundation; either version 3 of the License, or
|
||
-- (at your option) any later version.
|
||
--
|
||
-- This program IS distributed in the hope that it will be useful,
|
||
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
-- GNU General Public License for more details.
|
||
-- You should have received a copy of the GNU General Public License along with
|
||
-- this program. If not, see <http://www.gnu.org/licenses/>
|
||
-- -----------------------------------------------------------------------------
|
||
-- Common Lib
|
||
--
|
||
-- -----------------------------------------------------------------------------
|
||
-- Authors:
|
||
-- cof: [Fran<61>ois Corthay](francois.corthay@hevs.ch)
|
||
-- guo: [Oliver A. Gubler](oliver.gubler@hevs.ch)
|
||
-- -----------------------------------------------------------------------------
|
||
-- Changelog:
|
||
-- 2016-06 : guo
|
||
-- added function sel
|
||
-- 2015-06 : guo
|
||
-- added counterBitNb
|
||
-- added documentation
|
||
-- -----------------------------------------------------------------------------
|
||
library IEEE;
|
||
use IEEE.std_logic_1164.all;
|
||
use IEEE.numeric_std.all;
|
||
|
||
PACKAGE CommonLib IS
|
||
|
||
------------------------------------------------------------------------------
|
||
-- Returns the number of bits needed to represent the given val
|
||
-- Examples:
|
||
-- requiredBitNb(1) = 1 (1)
|
||
-- requiredBitNb(2) = 2 (10)
|
||
-- requiredBitNb(3) = 2 (11)
|
||
function requiredBitNb(val : integer) return integer;
|
||
|
||
------------------------------------------------------------------------------
|
||
-- Returns the number of bits needed to count val times (0 to val-1)
|
||
-- Examples:
|
||
-- counterBitNb(1) = 1 (0)
|
||
-- counterBitNb(2) = 1 (0->1)
|
||
-- counterBitNb(3) = 2 (0->1->10)
|
||
function counterBitNb(val : integer) return integer;
|
||
|
||
------------------------------------------------------------------------------
|
||
-- Functions to return one or the other input based on a boolean.
|
||
-- Can be used to build conditional constants.
|
||
-- Example:
|
||
-- constant bonjour_c : string := sel(ptpRole = master, "fpga20", "fpga02");
|
||
function sel(Cond : BOOLEAN; If_True, If_False : integer)
|
||
return integer;
|
||
function sel(Cond : BOOLEAN; If_True, If_False : string)
|
||
return string;
|
||
function sel(Cond : BOOLEAN; If_True, If_False : std_ulogic_vector)
|
||
return std_ulogic_vector;
|
||
function sel(Cond : BOOLEAN; If_True, If_False : unsigned)
|
||
return unsigned;
|
||
function sel(Cond : BOOLEAN; If_True, If_False : signed)
|
||
return signed;
|
||
|
||
END CommonLib;
|
||
|
||
|
||
|
||
|
||
--------------------------------------------------------------------------------
|
||
-- Copyright 2012 HES-SO Valais Wallis (www.hevs.ch)
|
||
--------------------------------------------------------------------------------
|
||
-- This program is free software: you can redistribute it and/or modify
|
||
-- it under the terms of the GNU General Public License as published by
|
||
-- the Free Software Foundation; either version 3 of the License, or
|
||
-- (at your option) any later version.
|
||
--
|
||
-- This program IS distributed in the hope that it will be useful,
|
||
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
-- GNU General Public License for more details.
|
||
-- You should have received a copy of the GNU General Public License along with
|
||
-- this program. If not, see <http://www.gnu.org/licenses/>
|
||
-- -----------------------------------------------------------------------------
|
||
-- Often used functions
|
||
--
|
||
-- -----------------------------------------------------------------------------
|
||
-- Authors:
|
||
-- cof: [Fran<61>ois Corthay](francois.corthay@hevs.ch)
|
||
-- guo: [Oliver A. Gubler](oliver.gubler@hevs.ch)
|
||
-- -----------------------------------------------------------------------------
|
||
-- Changelog:
|
||
-- 2016-06 : guo
|
||
-- added function sel
|
||
-- 2015-06 : guo
|
||
-- added counterBitNb
|
||
-- -----------------------------------------------------------------------------
|
||
PACKAGE BODY CommonLib IS
|
||
|
||
function requiredBitNb (val : integer) return integer is
|
||
variable powerOfTwo, bitNb : integer;
|
||
begin
|
||
powerOfTwo := 1;
|
||
bitNb := 0;
|
||
while powerOfTwo <= val loop
|
||
powerOfTwo := 2 * powerOfTwo;
|
||
bitNb := bitNb + 1;
|
||
end loop;
|
||
return bitNb;
|
||
end requiredBitNb;
|
||
|
||
function counterBitNb (val : integer) return integer is
|
||
variable powerOfTwo, bitNb : integer;
|
||
begin
|
||
powerOfTwo := 1;
|
||
bitNb := 0;
|
||
while powerOfTwo < val loop
|
||
powerOfTwo := 2 * powerOfTwo;
|
||
bitNb := bitNb + 1;
|
||
end loop;
|
||
return bitNb;
|
||
end counterBitNb;
|
||
|
||
function sel(Cond : BOOLEAN; If_True, If_False : integer)
|
||
return integer is
|
||
begin
|
||
if (Cond = TRUE) then
|
||
return (If_True);
|
||
else
|
||
return (If_False);
|
||
end if;
|
||
end function sel;
|
||
|
||
function sel(Cond : BOOLEAN; If_True, If_False : string)
|
||
return string is
|
||
begin
|
||
if (Cond = TRUE) then
|
||
return (If_True);
|
||
else
|
||
return (If_False);
|
||
end if;
|
||
end function sel;
|
||
|
||
function sel(Cond : BOOLEAN; If_True, If_False : std_ulogic_vector)
|
||
return std_ulogic_vector is
|
||
begin
|
||
if (Cond = TRUE) then
|
||
return (If_True);
|
||
else
|
||
return (If_False);
|
||
end if;
|
||
end function sel;
|
||
|
||
function sel(Cond : BOOLEAN; If_True, If_False : unsigned)
|
||
return unsigned is
|
||
begin
|
||
if (Cond = TRUE) then
|
||
return (If_True);
|
||
else
|
||
return (If_False);
|
||
end if;
|
||
end function sel;
|
||
|
||
function sel(Cond : BOOLEAN; If_True, If_False : signed)
|
||
return signed is
|
||
begin
|
||
if (Cond = TRUE) then
|
||
return (If_True);
|
||
else
|
||
return (If_False);
|
||
end if;
|
||
end function sel;
|
||
|
||
END CommonLib;
|
||
|
||
|
||
|
||
|
||
-- library Common;
|
||
use work.CommonLib.all;
|
||
|
||
architecture RTL of FIFO_bram is
|
||
|
||
subtype register_type is std_ulogic_vector(dataIn'high downto 0);
|
||
type memory_type is array (0 to depth-1) of register_type;
|
||
|
||
signal writeCounter: unsigned(requiredBitNb(depth-1)-1 downto 0);
|
||
signal readCounter: unsigned(writeCounter'range);
|
||
signal memoryArray: memory_type;
|
||
|
||
type fifoStateType is (
|
||
sEmpty, sFull,
|
||
sRead, sWrite, sWriteFirst,
|
||
sReadWrite, sWait
|
||
);
|
||
signal fifoState: fifoStateType;
|
||
signal emptyCondition, fullCondition, empty_int: std_ulogic;
|
||
|
||
begin
|
||
------------------------------------------------------------------------------
|
||
-- read and write counters
|
||
updateWriteCounter: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
writeCounter <= (others => '0');
|
||
elsif rising_edge(clock) then
|
||
if (write = '1') and (fullCondition = '0') then
|
||
writeCounter <= writeCounter + 1;
|
||
end if;
|
||
end if;
|
||
end process updateWriteCounter;
|
||
|
||
updateReadCounter: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
readCounter <= (others => '0');
|
||
elsif rising_edge(clock) then
|
||
if (read = '1') and (empty_int = '0') then
|
||
readCounter <= readCounter + 1;
|
||
end if;
|
||
end if;
|
||
end process updateReadCounter;
|
||
|
||
------------------------------------------------------------------------------
|
||
-- memory access
|
||
writeMem: process(clock)
|
||
begin
|
||
if rising_edge(clock) then
|
||
if (write = '1') and (fullCondition = '0') then
|
||
memoryArray(to_integer(writeCounter)) <= dataIn;
|
||
end if;
|
||
end if;
|
||
end process writeMem;
|
||
|
||
readMem: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
dataOut <= (others => '0');
|
||
elsif rising_edge(clock) then
|
||
if (read = '0') or (empty_int = '1') then
|
||
dataOut <= memoryArray(to_integer(readCounter));
|
||
else
|
||
dataOut <= memoryArray(to_integer(readCounter+1));
|
||
end if;
|
||
end if;
|
||
end process readMem;
|
||
|
||
------------------------------------------------------------------------------
|
||
-- controls
|
||
emptyCondition <= '1' when
|
||
( (fifoState = sRead) and (writeCounter = readCounter) ) or
|
||
(fifoState = sEmpty)
|
||
else '0';
|
||
|
||
fullCondition <= '1' when
|
||
( (fifoState = sWrite) and (writeCounter = readCounter) ) or
|
||
(fifoState = sFull)
|
||
else '0';
|
||
|
||
|
||
fifoControl: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
fifoState <= sEmpty;
|
||
elsif rising_edge(clock) then
|
||
case fifoState is
|
||
when sEmpty =>
|
||
if write = '1' then
|
||
fifoState <= sWriteFirst;
|
||
end if;
|
||
when sFull =>
|
||
if (read = '1') then
|
||
fifoState <= sRead;
|
||
end if;
|
||
when sRead =>
|
||
if (read = '1') and (write = '1') then
|
||
fifoState <= sReadWrite;
|
||
elsif write = '1' then
|
||
fifoState <= sWrite;
|
||
elsif emptyCondition = '1' then
|
||
fifoState <= sEmpty;
|
||
elsif read = '1' then
|
||
fifoState <= sRead;
|
||
else
|
||
fifoState <= sWait;
|
||
end if;
|
||
when sWriteFirst =>
|
||
if (read = '1') and (write = '1') then
|
||
fifoState <= sReadWrite;
|
||
elsif write = '1' then
|
||
fifoState <= sWrite;
|
||
elsif read = '1' then
|
||
fifoState <= sRead;
|
||
else
|
||
fifoState <= sWait;
|
||
end if;
|
||
when sWrite =>
|
||
if (read = '1') and (write = '1') then
|
||
fifoState <= sReadWrite;
|
||
elsif read = '1' then
|
||
fifoState <= sRead;
|
||
elsif fullCondition = '1' then
|
||
fifoState <= sFull;
|
||
elsif write = '1' then
|
||
fifoState <= sWrite;
|
||
else
|
||
fifoState <= sWait;
|
||
end if;
|
||
when sReadWrite =>
|
||
if (read = '0') and (write = '0') then
|
||
fifoState <= sWait;
|
||
elsif (read = '1') and (write = '0') then
|
||
fifoState <= sRead;
|
||
elsif (write = '1') and (read = '0') then
|
||
fifoState <= sWrite;
|
||
end if;
|
||
when sWait =>
|
||
if (read = '1') and (write = '1') then
|
||
fifoState <= sReadWrite;
|
||
elsif read = '1' then
|
||
fifoState <= sRead;
|
||
elsif write = '1' then
|
||
fifoState <= sWrite;
|
||
end if;
|
||
when others => null;
|
||
end case;
|
||
end if;
|
||
end process fifoControl;
|
||
|
||
|
||
full <= '1' when
|
||
(fifoState = sFull) or
|
||
(fullCondition = '1')
|
||
else '0';
|
||
|
||
empty_int <= '1' when
|
||
(fifoState = sEmpty) or
|
||
(fifoState = sWriteFirst) or
|
||
( (emptyCondition = '1') and (fifoState = sRead) )
|
||
else '0';
|
||
empty <= empty_int;
|
||
|
||
end RTL;
|
||
|
||
|
||
|
||
|
||
-- VHDL Entity Morse.morseToCharDecoder.symbol
|
||
--
|
||
-- Created:
|
||
-- by - francois.francois (Aphelia)
|
||
-- at - 09:13:01 03/29/19
|
||
--
|
||
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
||
--
|
||
LIBRARY ieee;
|
||
USE ieee.std_logic_1164.all;
|
||
USE ieee.numeric_std.all;
|
||
|
||
ENTITY morseToCharDecoder IS
|
||
GENERIC(
|
||
unitCountDivide : positive := 100;
|
||
unitCountBitNb : positive := 2;
|
||
characterBitNb : positive := 8
|
||
);
|
||
PORT(
|
||
clock : IN std_ulogic;
|
||
reset : IN std_ulogic;
|
||
charValid : OUT std_ulogic;
|
||
symbolDuration : IN unsigned (unitCountBitNb-1 DOWNTO 0);
|
||
symbolValid : IN std_ulogic;
|
||
symbolValue : IN std_ulogic;
|
||
charOut : OUT std_ulogic_vector (characterBitNb-1 DOWNTO 0)
|
||
);
|
||
|
||
-- Declarations
|
||
|
||
END morseToCharDecoder ;
|
||
|
||
|
||
|
||
|
||
|
||
ARCHITECTURE masterVersion OF morseToCharDecoder IS
|
||
|
||
constant shortDuration : positive := 1;
|
||
constant longDuration : positive := 3;
|
||
constant veryLongDuration : positive := 5;
|
||
signal isShort, isLong, isVeryLong : std_ulogic;
|
||
|
||
type decoderStateType is (
|
||
idle,
|
||
atA, atB, atC, atD, atE, atF, atG, atH, atI, atJ,
|
||
atK, atL, atM, atN, atO, atP, atQ, atR, atS, atT,
|
||
atU, atV, atW, atX, atY, atZ,
|
||
atO1, atO2, atU2,
|
||
at0, at1, at2, at3, at4, at5, at6, at7, at8, at9,
|
||
endOfCharacter, endOfWord
|
||
);
|
||
signal decoderState : decoderStateType;
|
||
|
||
BEGIN
|
||
-- decode symbol lengths
|
||
isShort <= '1' when symbolDuration = shortDuration else '0';
|
||
isLong <= '1' when symbolDuration = longDuration else '0';
|
||
isVeryLong <= '1' when symbolDuration = veryLongDuration else '0';
|
||
-- decode Morse Code
|
||
updateState: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
decoderState <= idle;
|
||
elsif rising_edge(clock) then
|
||
if symbolValid = '1' then
|
||
case decoderState is
|
||
when idle =>
|
||
if symbolValue = '1' then
|
||
if isShort = '1' then
|
||
decoderState <= atE;
|
||
else
|
||
decoderState <= atT;
|
||
end if;
|
||
end if;
|
||
when atA =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
if isShort = '1' then
|
||
decoderState <= atR;
|
||
else
|
||
decoderState <= atW;
|
||
end if;
|
||
end if;
|
||
when atB =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
if isShort = '1' then
|
||
decoderState <= at6;
|
||
else
|
||
decoderState <= idle;
|
||
end if;
|
||
end if;
|
||
when atC =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
decoderState <= idle;
|
||
end if;
|
||
when atD =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
if isShort = '1' then
|
||
decoderState <= atB;
|
||
else
|
||
decoderState <= atX;
|
||
end if;
|
||
end if;
|
||
when atE =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then -- end of character
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then -- end of word
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else -- next character symbol
|
||
if isShort = '1' then
|
||
decoderState <= atI;
|
||
else
|
||
decoderState <= atA;
|
||
end if;
|
||
end if;
|
||
when atF =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
decoderState <= idle;
|
||
end if;
|
||
when atG =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
if isShort = '1' then
|
||
decoderState <= atZ;
|
||
else
|
||
decoderState <= atQ;
|
||
end if;
|
||
end if;
|
||
when atH =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
if isShort = '1' then
|
||
decoderState <= at5;
|
||
else
|
||
decoderState <= at4;
|
||
end if;
|
||
end if;
|
||
when atI =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
if isShort = '1' then
|
||
decoderState <= atS;
|
||
else
|
||
decoderState <= atU;
|
||
end if;
|
||
end if;
|
||
when atJ =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
if isShort = '1' then
|
||
decoderState <= idle;
|
||
else
|
||
decoderState <= at1;
|
||
end if;
|
||
end if;
|
||
when atK =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
if isShort = '1' then
|
||
decoderState <= atC;
|
||
else
|
||
decoderState <= atY;
|
||
end if;
|
||
end if;
|
||
when atL =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
decoderState <= idle;
|
||
end if;
|
||
when atM =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
if isShort = '1' then
|
||
decoderState <= atG;
|
||
else
|
||
decoderState <= atO;
|
||
end if;
|
||
end if;
|
||
when atN =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
if isShort = '1' then
|
||
decoderState <= atD;
|
||
else
|
||
decoderState <= atK;
|
||
end if;
|
||
end if;
|
||
when atO =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
if isShort = '1' then
|
||
decoderState <= atO1;
|
||
else
|
||
decoderState <= atO2;
|
||
end if;
|
||
end if;
|
||
when atO1 =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
if isShort = '1' then
|
||
decoderState <= at8;
|
||
else
|
||
decoderState <= idle;
|
||
end if;
|
||
end if;
|
||
when atO2 =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
if isShort = '1' then
|
||
decoderState <= at9;
|
||
else
|
||
decoderState <= at0;
|
||
end if;
|
||
end if;
|
||
when atP =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
decoderState <= idle;
|
||
end if;
|
||
when atQ =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
decoderState <= idle;
|
||
end if;
|
||
when atR =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
if isShort = '1' then
|
||
decoderState <= atL;
|
||
else
|
||
decoderState <= idle;
|
||
end if;
|
||
end if;
|
||
when atS =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
if isShort = '1' then
|
||
decoderState <= atH;
|
||
else
|
||
decoderState <= atV;
|
||
end if;
|
||
end if;
|
||
when atT =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
if isShort = '1' then
|
||
decoderState <= atN;
|
||
else
|
||
decoderState <= atM;
|
||
end if;
|
||
end if;
|
||
when atU =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
if isShort = '1' then
|
||
decoderState <= atF;
|
||
else
|
||
decoderState <= atU2;
|
||
end if;
|
||
end if;
|
||
when atU2 =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
if isShort = '1' then
|
||
decoderState <= idle;
|
||
else
|
||
decoderState <= at2;
|
||
end if;
|
||
end if;
|
||
when atV =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
if isShort = '1' then
|
||
decoderState <= idle;
|
||
else
|
||
decoderState <= at3;
|
||
end if;
|
||
end if;
|
||
when atW =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
if isShort = '1' then
|
||
decoderState <= atP;
|
||
else
|
||
decoderState <= atJ;
|
||
end if;
|
||
end if;
|
||
when atX =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
decoderState <= idle;
|
||
end if;
|
||
when atY =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
decoderState <= idle;
|
||
end if;
|
||
when atZ =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
if isShort = '1' then
|
||
decoderState <= at7;
|
||
else
|
||
decoderState <= idle;
|
||
end if;
|
||
end if;
|
||
when at0 | at1 | at2 | at3 | at4 | at5 | at6 | at7 | at8 | at9 =>
|
||
if symbolValue = '0' then
|
||
if isLong = '1' then
|
||
decoderState <= endOfCharacter;
|
||
elsif isVeryLong = '1' then
|
||
decoderState <= endOfWord;
|
||
end if;
|
||
else
|
||
decoderState <= idle;
|
||
end if;
|
||
when others => null;
|
||
end case;
|
||
else
|
||
case decoderState is
|
||
when endOfCharacter => decoderState <= idle;
|
||
when endOfWord => decoderState <= idle;
|
||
when others => null;
|
||
end case;
|
||
end if;
|
||
end if;
|
||
end process updateState;
|
||
-- provide character
|
||
provideCharacter: process(reset, clock)
|
||
-- could be combinatorial, but made sequential for easier debug
|
||
begin
|
||
if reset = '1' then
|
||
charValid <= '0';
|
||
charOut <= (others => '0');
|
||
elsif rising_edge(clock) then
|
||
charValid <= '0';
|
||
if (symbolValid = '1') and (symbolValue = '0') then
|
||
if (isLong = '1') or (isVeryLong = '1') then
|
||
charValid <= '1';
|
||
case decoderState is
|
||
when atA =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('a'), charOut'length));
|
||
when atB =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('b'), charOut'length));
|
||
when atC =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('c'), charOut'length));
|
||
when atD =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('d'), charOut'length));
|
||
when atE =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('e'), charOut'length));
|
||
when atF =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('f'), charOut'length));
|
||
when atG =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('g'), charOut'length));
|
||
when atH =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('h'), charOut'length));
|
||
when atI =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('i'), charOut'length));
|
||
when atJ =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('j'), charOut'length));
|
||
when atK =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('k'), charOut'length));
|
||
when atL =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('l'), charOut'length));
|
||
when atM =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('m'), charOut'length));
|
||
when atN =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('n'), charOut'length));
|
||
when atO =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('o'), charOut'length));
|
||
when atP =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('p'), charOut'length));
|
||
when atQ =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('q'), charOut'length));
|
||
when atR =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('r'), charOut'length));
|
||
when atS =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('s'), charOut'length));
|
||
when atT =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('t'), charOut'length));
|
||
when atU =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('u'), charOut'length));
|
||
when atV =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('v'), charOut'length));
|
||
when atW =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('w'), charOut'length));
|
||
when atX =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('x'), charOut'length));
|
||
when atY =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('y'), charOut'length));
|
||
when atZ =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('z'), charOut'length));
|
||
when at0 =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('0'), charOut'length));
|
||
when at1 =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('1'), charOut'length));
|
||
when at2 =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('2'), charOut'length));
|
||
when at3 =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('3'), charOut'length));
|
||
when at4 =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('4'), charOut'length));
|
||
when at5 =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('5'), charOut'length));
|
||
when at6 =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('6'), charOut'length));
|
||
when at7 =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('7'), charOut'length));
|
||
when at8 =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('8'), charOut'length));
|
||
when at9 =>
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos('9'), charOut'length));
|
||
when others => charOut <= (others => '-');
|
||
end case;
|
||
end if;
|
||
elsif decoderState = endOfWord then
|
||
charValid <= '1';
|
||
charOut <= std_ulogic_vector(to_unsigned(character'pos(' '), charOut'length));
|
||
end if;
|
||
end if;
|
||
end process provideCharacter;
|
||
|
||
END ARCHITECTURE masterVersion;
|
||
|
||
|
||
|
||
|
||
-- VHDL Entity Morse.envelopeRetreiver.symbol
|
||
--
|
||
-- Created:
|
||
-- by - francois.francois (Aphelia)
|
||
-- at - 09:13:01 03/29/19
|
||
--
|
||
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
||
--
|
||
LIBRARY ieee;
|
||
USE ieee.std_logic_1164.all;
|
||
USE ieee.numeric_std.all;
|
||
|
||
ENTITY envelopeRetreiver IS
|
||
GENERIC(
|
||
toneDivide : positive := 100E3;
|
||
deglitchBitNb : positive := 8
|
||
);
|
||
PORT(
|
||
clock : IN std_ulogic;
|
||
reset : IN std_ulogic;
|
||
morseWithTone : IN std_ulogic;
|
||
morseEnvelope : OUT std_ulogic
|
||
);
|
||
|
||
-- Declarations
|
||
|
||
END envelopeRetreiver ;
|
||
|
||
|
||
|
||
|
||
|
||
-- library Common;
|
||
use work.CommonLib.all;
|
||
|
||
ARCHITECTURE masterVersion OF envelopeRetreiver IS
|
||
|
||
signal morseDelayed, morseRising : std_ulogic;
|
||
constant toneCounterBitNb: positive := requiredBitNb(toneDivide-1) + 1;
|
||
signal toneCounter, tonePeriod: unsigned(toneCounterBitNb-1 downto 0);
|
||
constant triggerShift : positive := 3;
|
||
constant triggerMin : positive := toneDivide - toneDivide/2**triggerShift;
|
||
constant triggerMax : positive := toneDivide + toneDivide/2**triggerShift;
|
||
signal morseTriggered : std_ulogic;
|
||
signal deglitchCounter: unsigned(deglitchBitNb-1 downto 0);
|
||
|
||
BEGIN
|
||
-- find input rising edge
|
||
delayMorseIn: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
morseDelayed <= '1';
|
||
elsif rising_edge(clock) then
|
||
morseDelayed <= morseWithTone;
|
||
end if;
|
||
end process delayMorseIn;
|
||
|
||
morseRising <= '1' when (morseWithTone = '1') and (morseDelayed = '0')
|
||
else '0';
|
||
-- count period of incoming signal
|
||
countInputPeriod: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
toneCounter <= (others => '0');
|
||
tonePeriod <= (others => '0');
|
||
elsif rising_edge(clock) then
|
||
if morseRising = '1' then
|
||
toneCounter <= (others => '0');
|
||
tonePeriod <= toneCounter;
|
||
elsif toneCounter+1 /= 0 then
|
||
toneCounter <= toneCounter + 1;
|
||
end if;
|
||
end if;
|
||
end process countInputPeriod;
|
||
-- trigger morse signal
|
||
triggerMorse: process(tonePeriod, toneCounter)
|
||
begin
|
||
morseTriggered <= '1';
|
||
if tonePeriod < triggerMin then
|
||
morseTriggered <= '0';
|
||
end if;
|
||
if tonePeriod > triggerMax then
|
||
morseTriggered <= '0';
|
||
end if;
|
||
if toneCounter > triggerMax then
|
||
morseTriggered <= '0';
|
||
end if;
|
||
end process triggerMorse;
|
||
-- deglitch morse signal
|
||
countDeglitchDuration: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
deglitchCounter <= (others => '0');
|
||
elsif rising_edge(clock) then
|
||
if morseTriggered = '1' then
|
||
if deglitchCounter+1 /= 0 then
|
||
deglitchCounter <= deglitchCounter + 1;
|
||
end if;
|
||
else
|
||
if deglitchCounter /= 0 then
|
||
deglitchCounter <= deglitchCounter - 1;
|
||
end if;
|
||
end if;
|
||
end if;
|
||
end process countDeglitchDuration;
|
||
|
||
trigDeglitchCounter: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
morseEnvelope <= '0';
|
||
elsif rising_edge(clock) then
|
||
if deglitchCounter+1 = 0 then
|
||
morseEnvelope <= '1';
|
||
end if;
|
||
if deglitchCounter = 0 then
|
||
morseEnvelope <= '0';
|
||
end if;
|
||
end if;
|
||
end process trigDeglitchCounter;
|
||
|
||
END ARCHITECTURE masterVersion;
|
||
|
||
|
||
|
||
|
||
-- VHDL Entity Morse.symbolLengthCounter.symbol
|
||
--
|
||
-- Created:
|
||
-- by - francois.francois (Aphelia)
|
||
-- at - 09:13:01 03/29/19
|
||
--
|
||
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
||
--
|
||
LIBRARY ieee;
|
||
USE ieee.std_logic_1164.all;
|
||
USE ieee.numeric_std.all;
|
||
|
||
ENTITY symbolLengthCounter IS
|
||
GENERIC(
|
||
unitCountDivide : positive := 100;
|
||
unitCountBitNb : positive := 2
|
||
);
|
||
PORT(
|
||
clock : IN std_ulogic;
|
||
reset : IN std_ulogic;
|
||
morseCode : IN std_ulogic;
|
||
symbolDuration : OUT unsigned (unitCountBitNb-1 DOWNTO 0);
|
||
symbolValid : OUT std_ulogic;
|
||
symbolValue : OUT std_ulogic
|
||
);
|
||
|
||
-- Declarations
|
||
|
||
END symbolLengthCounter ;
|
||
|
||
|
||
|
||
|
||
|
||
-- library Common;
|
||
use work.CommonLib.all;
|
||
|
||
ARCHITECTURE masterVersion OF symbolLengthCounter IS
|
||
|
||
signal morseDelayed, morseChanged : std_ulogic;
|
||
signal unitCounter : unsigned(requiredBitNb(unitCountDivide/2-1)-1 downto 0);
|
||
signal unitDone : std_ulogic;
|
||
signal durationCounter : unsigned(unitCountBitNb+1-1 downto 0);
|
||
constant shortDuration : positive := 1;
|
||
constant longDuration : positive := 3;
|
||
constant veryLongDuration : positive := 5;
|
||
|
||
BEGIN
|
||
-- find input change
|
||
delayMorseCode: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
morseDelayed <= '1';
|
||
elsif rising_edge(clock) then
|
||
morseDelayed <= morseCode;
|
||
end if;
|
||
end process delayMorseCode;
|
||
|
||
morseChanged <= '1' when morseDelayed /= morseCode
|
||
else '0';
|
||
-- count half unit duration
|
||
countHalfUnitPeriod: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
unitCounter <= (others => '0');
|
||
elsif rising_edge(clock) then
|
||
if morseChanged = '1' then
|
||
unitCounter <= (others => '0');
|
||
elsif unitDone = '1' then
|
||
unitCounter <= (others => '0');
|
||
else
|
||
unitCounter <= unitCounter + 1;
|
||
end if;
|
||
end if;
|
||
end process countHalfUnitPeriod;
|
||
|
||
unitDone <= '1' when unitCounter = unitCountDivide/2-1
|
||
else '0';
|
||
-- count unit number
|
||
countUnitNumber: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
durationCounter <= (others => '0');
|
||
elsif rising_edge(clock) then
|
||
if morseChanged = '1' then
|
||
durationCounter <= (others => '0');
|
||
elsif unitDone = '1' then
|
||
if durationCounter+1 /= 0 then
|
||
durationCounter <= durationCounter + 1;
|
||
end if;
|
||
end if;
|
||
end if;
|
||
end process countUnitNumber;
|
||
-- provide symbol information
|
||
provideSymbolInformation: process(reset, clock)
|
||
-- could be combinatorial, but made sequential for easier debug
|
||
begin
|
||
if reset = '1' then
|
||
symbolValid <= '0';
|
||
symbolValue <= '0';
|
||
symbolDuration <= (others => '0');
|
||
elsif rising_edge(clock) then
|
||
symbolValid <= '0';
|
||
if morseChanged = '1' then
|
||
symbolValue <= not morseCode;
|
||
symbolValid <= '0';
|
||
symbolDuration <= (others => '0');
|
||
if (durationCounter >= 2*shortDuration-1) and
|
||
(durationCounter <= 2*shortDuration+1) then
|
||
symbolValid <= '1';
|
||
symbolDuration <= to_unsigned(shortDuration, symbolDuration'length);
|
||
end if;
|
||
if (durationCounter >= 2*longDuration-1) and
|
||
(durationCounter <= 2*longDuration+1) then
|
||
symbolValid <= '1';
|
||
symbolDuration <= to_unsigned(longDuration, symbolDuration'length);
|
||
end if;
|
||
end if;
|
||
if (durationCounter = 2*veryLongDuration-1) and (unitDone = '1') then
|
||
symbolValue <= morseCode;
|
||
symbolValid <= '1';
|
||
symbolDuration <= to_unsigned(
|
||
veryLongDuration, symbolDuration'length
|
||
);
|
||
end if;
|
||
end if;
|
||
end process provideSymbolInformation;
|
||
|
||
END ARCHITECTURE masterVersion;
|
||
|
||
|
||
|
||
|
||
-- VHDL Entity RS232.serialPortTransmitter.symbol
|
||
--
|
||
-- Created:
|
||
-- by - francois.francois (Aphelia)
|
||
-- at - 13:45:48 08/28/19
|
||
--
|
||
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
||
--
|
||
LIBRARY ieee;
|
||
USE ieee.std_logic_1164.all;
|
||
USE ieee.numeric_std.all;
|
||
|
||
ENTITY serialPortTransmitter IS
|
||
GENERIC(
|
||
dataBitNb : positive := 8;
|
||
baudRateDivide : positive := 2083
|
||
);
|
||
PORT(
|
||
TxD : OUT std_ulogic;
|
||
clock : IN std_ulogic;
|
||
reset : IN std_ulogic;
|
||
dataIn : IN std_ulogic_vector (dataBitNb-1 DOWNTO 0);
|
||
send : IN std_ulogic;
|
||
busy : OUT std_ulogic
|
||
);
|
||
|
||
-- Declarations
|
||
|
||
END serialPortTransmitter ;
|
||
|
||
|
||
|
||
|
||
|
||
-- library Common;
|
||
use work.CommonLib.all;
|
||
|
||
architecture RTL of serialPortTransmitter is
|
||
|
||
signal dividerCounter: unsigned(requiredBitNb(baudRateDivide)-1 downto 0);
|
||
signal dividerCounterReset: std_uLogic;
|
||
signal txData: std_ulogic_vector(dataBitNb-1 downto 0);
|
||
signal send1: std_uLogic;
|
||
signal txShiftEnable: std_uLogic;
|
||
signal txShiftReg: std_ulogic_vector(dataBitNb+1 downto 0);
|
||
signal txSendingByte: std_uLogic;
|
||
signal txSendingByteAndStop: std_uLogic;
|
||
|
||
begin
|
||
|
||
divide: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
dividerCounter <= (others => '0');
|
||
elsif rising_edge(clock) then
|
||
if dividerCounterReset = '1' then
|
||
dividerCounter <= to_unsigned(1, dividerCounter'length);
|
||
else
|
||
dividerCounter <= dividerCounter + 1;
|
||
end if;
|
||
end if;
|
||
end process divide;
|
||
|
||
endOfCount: process(dividerCounter, send1)
|
||
begin
|
||
if dividerCounter = baudRateDivide then
|
||
dividerCounterReset <= '1';
|
||
elsif send1 = '1' then
|
||
dividerCounterReset <= '1';
|
||
else
|
||
dividerCounterReset <= '0';
|
||
end if;
|
||
end process endOfCount;
|
||
|
||
txShiftEnable <= dividerCounterReset;
|
||
|
||
storeData: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
txData <= (others => '1');
|
||
elsif rising_edge(clock) then
|
||
if send = '1' then
|
||
txData <= dataIn;
|
||
end if;
|
||
end if;
|
||
end process storeData;
|
||
|
||
delaySend: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
send1 <= '0';
|
||
elsif rising_edge(clock) then
|
||
send1 <= send;
|
||
end if;
|
||
end process delaySend;
|
||
|
||
shiftReg: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
txShiftReg <= (others => '1');
|
||
elsif rising_edge(clock) then
|
||
if txShiftEnable = '1' then
|
||
if send1 = '1' then
|
||
txShiftReg <= '0' & txData & '0';
|
||
else
|
||
txShiftReg(txShiftReg'high-1 downto 0) <= txShiftReg(txShiftReg'high downto 1);
|
||
txShiftReg(txShiftReg'high) <= '1';
|
||
end if;
|
||
end if;
|
||
end if;
|
||
end process shiftReg;
|
||
|
||
txSendingByte <= '1' when (txShiftReg(txShiftReg'high downto 1) /= (txShiftReg'high downto 1 => '1'))
|
||
else '0';
|
||
|
||
txSendingByteAndStop <= '1' when txShiftReg /= (txShiftReg'high downto 0 => '1')
|
||
else '0';
|
||
|
||
TxD <= txShiftReg(0) when txSendingByte = '1' else '1';
|
||
busy <= txSendingByteAndStop or send1 or send;
|
||
|
||
end RTL;
|
||
|
||
|
||
|
||
|
||
|
||
--
|
||
-- VHDL Architecture Morse.morseDecoder.struct
|
||
--
|
||
-- Created:
|
||
-- by - axel.amand.UNKNOWN (WE7860)
|
||
-- at - 08:02:13 08.05.2023
|
||
--
|
||
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
||
--
|
||
LIBRARY ieee;
|
||
USE ieee.std_logic_1164.all;
|
||
USE ieee.numeric_std.all;
|
||
|
||
-- LIBRARY Memory;
|
||
-- LIBRARY Morse;
|
||
-- LIBRARY RS232;
|
||
|
||
ARCHITECTURE struct OF morseDecoder IS
|
||
|
||
-- Architecture declarations
|
||
constant unitCountBitNb: positive := 3;
|
||
constant fifoDepth : positive := 8;
|
||
|
||
-- Internal signal declarations
|
||
SIGNAL symbolValue : std_ulogic;
|
||
SIGNAL symbolValid : std_ulogic;
|
||
SIGNAL symbolDuration : unsigned(unitCountBitNb-1 DOWNTO 0);
|
||
SIGNAL charValid : std_ulogic;
|
||
SIGNAL charOut : std_ulogic_vector(uartDataBitNb-1 DOWNTO 0);
|
||
SIGNAL txWord : std_ulogic_vector(uartDataBitNb-1 DOWNTO 0);
|
||
SIGNAL txBusy : std_ulogic;
|
||
SIGNAL txSend : std_ulogic;
|
||
SIGNAL txFifoEmpty : std_ulogic;
|
||
|
||
-- Implicit buffer signal declarations
|
||
SIGNAL morseEnvelope_internal : std_ulogic;
|
||
|
||
|
||
-- Component Declarations
|
||
COMPONENT FIFO_bram
|
||
GENERIC (
|
||
dataBitNb : positive := 8;
|
||
depth : positive := 8
|
||
);
|
||
PORT (
|
||
write : IN std_ulogic ;
|
||
clock : IN std_ulogic ;
|
||
reset : IN std_ulogic ;
|
||
dataOut : OUT std_ulogic_vector (dataBitNb-1 DOWNTO 0);
|
||
read : IN std_ulogic ;
|
||
dataIn : IN std_ulogic_vector (dataBitNb-1 DOWNTO 0);
|
||
empty : OUT std_ulogic ;
|
||
full : OUT std_ulogic
|
||
);
|
||
END COMPONENT;
|
||
COMPONENT envelopeRetreiver
|
||
GENERIC (
|
||
toneDivide : positive := 100E3;
|
||
deglitchBitNb : positive := 8
|
||
);
|
||
PORT (
|
||
clock : IN std_ulogic ;
|
||
reset : IN std_ulogic ;
|
||
morseWithTone : IN std_ulogic ;
|
||
morseEnvelope : OUT std_ulogic
|
||
);
|
||
END COMPONENT;
|
||
COMPONENT morseToCharDecoder
|
||
GENERIC (
|
||
unitCountDivide : positive := 100;
|
||
unitCountBitNb : positive := 2;
|
||
characterBitNb : positive := 8
|
||
);
|
||
PORT (
|
||
clock : IN std_ulogic ;
|
||
reset : IN std_ulogic ;
|
||
charValid : OUT std_ulogic ;
|
||
symbolDuration : IN unsigned (unitCountBitNb-1 DOWNTO 0);
|
||
symbolValid : IN std_ulogic ;
|
||
symbolValue : IN std_ulogic ;
|
||
charOut : OUT std_ulogic_vector (characterBitNb-1 DOWNTO 0)
|
||
);
|
||
END COMPONENT;
|
||
COMPONENT symbolLengthCounter
|
||
GENERIC (
|
||
unitCountDivide : positive := 100;
|
||
unitCountBitNb : positive := 2
|
||
);
|
||
PORT (
|
||
clock : IN std_ulogic ;
|
||
reset : IN std_ulogic ;
|
||
morseCode : IN std_ulogic ;
|
||
symbolDuration : OUT unsigned (unitCountBitNb-1 DOWNTO 0);
|
||
symbolValid : OUT std_ulogic ;
|
||
symbolValue : OUT std_ulogic
|
||
);
|
||
END COMPONENT;
|
||
COMPONENT serialPortTransmitter
|
||
GENERIC (
|
||
dataBitNb : positive := 8;
|
||
baudRateDivide : positive := 2083
|
||
);
|
||
PORT (
|
||
TxD : OUT std_ulogic ;
|
||
clock : IN std_ulogic ;
|
||
reset : IN std_ulogic ;
|
||
dataIn : IN std_ulogic_vector (dataBitNb-1 DOWNTO 0);
|
||
send : IN std_ulogic ;
|
||
busy : OUT std_ulogic
|
||
);
|
||
END COMPONENT;
|
||
|
||
-- Optional embedded configurations
|
||
-- pragma synthesis_off
|
||
-- FOR ALL : FIFO_bram USE ENTITY Memory.FIFO_bram;
|
||
-- FOR ALL : envelopeRetreiver USE ENTITY Morse.envelopeRetreiver;
|
||
-- FOR ALL : morseToCharDecoder USE ENTITY Morse.morseToCharDecoder;
|
||
-- FOR ALL : serialPortTransmitter USE ENTITY RS232.serialPortTransmitter;
|
||
-- FOR ALL : symbolLengthCounter USE ENTITY Morse.symbolLengthCounter;
|
||
-- pragma synthesis_on
|
||
|
||
|
||
BEGIN
|
||
-- Architecture concurrent statements
|
||
-- HDL Embedded Text Block 2 eb2
|
||
process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
txSend <= '0';
|
||
elsif rising_edge(clock) then
|
||
if ( (txFifoEmpty = '0') and (txBusy = '0') ) then
|
||
txSend <= '1';
|
||
else
|
||
txSend <= '0';
|
||
end if;
|
||
end if;
|
||
end process;
|
||
|
||
|
||
|
||
-- Instance port mappings.
|
||
I0 : FIFO_bram
|
||
GENERIC MAP (
|
||
dataBitNb => uartDataBitNb,
|
||
depth => fifoDepth
|
||
)
|
||
PORT MAP (
|
||
write => charValid,
|
||
clock => clock,
|
||
reset => reset,
|
||
dataOut => txWord,
|
||
read => txSend,
|
||
dataIn => charOut,
|
||
empty => txFifoEmpty,
|
||
full => OPEN
|
||
);
|
||
I_env : envelopeRetreiver
|
||
GENERIC MAP (
|
||
toneDivide => integer(clockFrequency/toneFrequency + 0.5),
|
||
deglitchBitNb => deglitchBitNb
|
||
)
|
||
PORT MAP (
|
||
clock => clock,
|
||
reset => reset,
|
||
morseWithTone => morseCode,
|
||
morseEnvelope => morseEnvelope_internal
|
||
);
|
||
I_dec : morseToCharDecoder
|
||
GENERIC MAP (
|
||
unitCountDivide => integer(clockFrequency*unitDuration + 0.5),
|
||
unitCountBitNb => unitCountBitNb,
|
||
characterBitNb => uartDataBitNb
|
||
)
|
||
PORT MAP (
|
||
clock => clock,
|
||
reset => reset,
|
||
charValid => charValid,
|
||
symbolDuration => symbolDuration,
|
||
symbolValid => symbolValid,
|
||
symbolValue => symbolValue,
|
||
charOut => charOut
|
||
);
|
||
I_len : symbolLengthCounter
|
||
GENERIC MAP (
|
||
unitCountDivide => integer(clockFrequency*unitDuration + 0.5),
|
||
unitCountBitNb => unitCountBitNb
|
||
)
|
||
PORT MAP (
|
||
clock => clock,
|
||
reset => reset,
|
||
morseCode => morseEnvelope_internal,
|
||
symbolDuration => symbolDuration,
|
||
symbolValid => symbolValid,
|
||
symbolValue => symbolValue
|
||
);
|
||
I_tx : serialPortTransmitter
|
||
GENERIC MAP (
|
||
dataBitNb => uartDataBitNb,
|
||
baudRateDivide => integer(clockFrequency/uartBaudRate + 0.5)
|
||
)
|
||
PORT MAP (
|
||
TxD => TxD,
|
||
clock => clock,
|
||
reset => reset,
|
||
dataIn => txWord,
|
||
send => txSend,
|
||
busy => txBusy
|
||
);
|
||
|
||
-- Implicit buffered output assignments
|
||
morseEnvelope <= morseEnvelope_internal;
|
||
|
||
END struct;
|
||
|
||
|
||
|
||
|
||
-- VHDL Entity Morse.morseEncoder.symbol
|
||
--
|
||
-- Created:
|
||
-- by - francois.francois (Aphelia)
|
||
-- at - 09:13:01 03/29/19
|
||
--
|
||
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
||
--
|
||
LIBRARY ieee;
|
||
USE ieee.std_logic_1164.all;
|
||
USE ieee.numeric_std.all;
|
||
|
||
ENTITY morseEncoder IS
|
||
GENERIC(
|
||
clockFrequency : real := 100.0E6;
|
||
uartBaudRate : real := 115.2E3;
|
||
uartDataBitNb : positive := 8;
|
||
unitDuration : real := 100.0E-3;
|
||
toneFrequency : real := 300.0
|
||
);
|
||
PORT(
|
||
morseCode : OUT std_ulogic;
|
||
clock : IN std_ulogic;
|
||
reset : IN std_ulogic;
|
||
RxD : IN std_ulogic
|
||
);
|
||
|
||
-- Declarations
|
||
|
||
END morseEncoder ;
|
||
|
||
|
||
|
||
|
||
|
||
-- VHDL Entity Morse.charToMorse.symbol
|
||
--
|
||
-- Created:
|
||
-- by - axel.amand.UNKNOWN (WE7860)
|
||
-- at - 14:49:52 28.04.2023
|
||
--
|
||
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
||
--
|
||
LIBRARY ieee;
|
||
USE ieee.std_logic_1164.all;
|
||
USE ieee.numeric_std.all;
|
||
|
||
ENTITY charToMorse IS
|
||
GENERIC(
|
||
characterBitNb : positive := 8;
|
||
unitCountDivide : positive := 10E3
|
||
);
|
||
PORT(
|
||
morseOut : OUT std_ulogic;
|
||
clock : IN std_ulogic;
|
||
reset : IN std_ulogic;
|
||
charIn : IN std_ulogic_vector (characterBitNb-1 DOWNTO 0);
|
||
readChar : OUT std_ulogic;
|
||
charNotReady : IN std_ulogic
|
||
);
|
||
|
||
-- Declarations
|
||
|
||
END charToMorse ;
|
||
|
||
|
||
|
||
|
||
|
||
-- VHDL Entity Morse.unitCounter.symbol
|
||
--
|
||
-- Created:
|
||
-- by - francois.francois (Aphelia)
|
||
-- at - 09:13:01 03/29/19
|
||
--
|
||
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
||
--
|
||
LIBRARY ieee;
|
||
USE ieee.std_logic_1164.all;
|
||
USE ieee.numeric_std.all;
|
||
|
||
ENTITY unitCounter IS
|
||
GENERIC(
|
||
unitCountDivide : positive := 10E3;
|
||
unitCountBitNb : positive := 3
|
||
);
|
||
PORT(
|
||
clock : IN std_ulogic;
|
||
reset : IN std_ulogic;
|
||
startCounter : IN std_ulogic;
|
||
unitNb : IN unsigned (unitCountBitNb-1 DOWNTO 0);
|
||
done : OUT std_ulogic
|
||
);
|
||
|
||
-- Declarations
|
||
|
||
END unitCounter ;
|
||
|
||
|
||
|
||
|
||
|
||
-- library Common;
|
||
use work.CommonLib.all;
|
||
|
||
ARCHITECTURE masterVersion OF unitCounter IS
|
||
|
||
signal unitCounter: unsigned(requiredBitNb(unitCountDivide)-1 downto 0);
|
||
signal unitCountDone: std_ulogic;
|
||
signal unitNbCounter: unsigned(unitnB'range);
|
||
signal unitNbCountDone: std_ulogic;
|
||
|
||
BEGIN
|
||
-- count unit base period
|
||
countUnitDuration: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
unitCounter <= (others => '0');
|
||
elsif rising_edge(clock) then
|
||
if unitCounter = 0 then
|
||
if (startCounter = '1') or (unitNbCounter > 0) then
|
||
unitCounter <= unitCounter + 1;
|
||
end if;
|
||
else
|
||
if unitCountDone = '0' then
|
||
unitCounter <= unitCounter + 1;
|
||
else
|
||
unitCounter <= (others => '0');
|
||
end if;
|
||
end if;
|
||
end if;
|
||
end process countUnitDuration;
|
||
|
||
unitCountDone <= '1' when unitCounter = unitCountDivide
|
||
else '0';
|
||
-- count unit period number
|
||
countPeriods: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
unitNbCounter <= (others => '0');
|
||
elsif rising_edge(clock) then
|
||
if unitNbCounter = 0 then
|
||
if startCounter = '1' then
|
||
unitNbCounter <= unitNbCounter + 1;
|
||
end if;
|
||
else
|
||
if unitNbCountDone = '0' then
|
||
if unitCountDone = '1' then
|
||
unitNbCounter <= unitNbCounter + 1;
|
||
end if;
|
||
else
|
||
unitNbCounter <= (others => '0');
|
||
end if;
|
||
end if;
|
||
end if;
|
||
end process countPeriods;
|
||
|
||
unitNbCountDone <= '1' when (unitNbCounter = unitNb) and (unitCountDone = '1')
|
||
else '0';
|
||
|
||
done <= unitNbCountDone;
|
||
|
||
END ARCHITECTURE masterVersion;
|
||
|
||
|
||
|
||
|
||
-- VHDL Entity Morse.charToMorseController.symbol
|
||
--
|
||
-- Created:
|
||
-- by - francois.francois (Aphelia)
|
||
-- at - 09:13:01 03/29/19
|
||
--
|
||
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
||
--
|
||
LIBRARY ieee;
|
||
USE ieee.std_logic_1164.all;
|
||
USE ieee.numeric_std.all;
|
||
|
||
ENTITY charToMorseController IS
|
||
GENERIC(
|
||
characterBitNb : positive := 8;
|
||
unitCountBitNb : positive := 3
|
||
);
|
||
PORT(
|
||
morseOut : OUT std_ulogic;
|
||
clock : IN std_ulogic;
|
||
reset : IN std_ulogic;
|
||
charNotReady : IN std_ulogic;
|
||
char : IN std_ulogic_vector (characterBitNb-1 DOWNTO 0);
|
||
startCounter : OUT std_ulogic;
|
||
unitNb : OUT unsigned (unitCountBitNb-1 DOWNTO 0);
|
||
counterDone : IN std_ulogic;
|
||
readChar : OUT std_ulogic
|
||
);
|
||
|
||
-- Declarations
|
||
|
||
END charToMorseController ;
|
||
|
||
|
||
|
||
|
||
|
||
ARCHITECTURE masterVersion OF charToMorseController IS
|
||
-- sequence for characters
|
||
type characterStateType is (
|
||
idle, waitReg,
|
||
sA, sB, sC, sD, sE, sF, sG, sH, sI, sJ, sK, sL, sM, sN, sO, sP,
|
||
sQ, sR, sS, sT, sU, sV, sW, sX, sY, sZ,
|
||
s0, s1, s2, s3, s4, s5, s6, s7, s8, s9,
|
||
s2a, s8a, s9a,
|
||
popChar, waitEndOfChar
|
||
);
|
||
signal characterState : characterStateType;
|
||
signal isA, isB, isC, isD, isE, isF, isG, isH,
|
||
isI, isJ, isK, isL, isM, isN, isO, isP,
|
||
isQ, isR, isS, isT, isU, isV, isW, isX,
|
||
isY, isZ,
|
||
is0, is1, is2, is3, is4, is5, is6, is7,
|
||
is8, is9 : std_ulogic;
|
||
signal gotoE, gotoI, gotoS, gotoH, goto5,
|
||
gotoF,
|
||
gotoL, gotoR,
|
||
gotoP,
|
||
gotoN, gotoD, gotoB, goto6,
|
||
gotoC,
|
||
gotoG, gotoZ, goto7,
|
||
goto8,
|
||
goto9,
|
||
gotoT : std_ulogic;
|
||
-- inter-FSM signalling
|
||
signal sendDot, sendDash, sendSeparator, sendDotDashDone: std_ulogic;
|
||
-- sequence for morse units
|
||
type sequencerStateType is (
|
||
idle,
|
||
startDot, sendingDot, startDash, sendingDash,
|
||
startSeparator, waitingSeparator, startSeparator2, waitingSeparator2,
|
||
dotDashDone
|
||
);
|
||
signal sequencerState : sequencerStateType;
|
||
|
||
BEGIN
|
||
------------------------------------------------------------------------------
|
||
-- conditions for morse units
|
||
isA <= '1' when std_match(unsigned(char), "1-0" & x"1") else '0';
|
||
isB <= '1' when std_match(unsigned(char), "1-0" & x"2") else '0';
|
||
isC <= '1' when std_match(unsigned(char), "1-0" & x"3") else '0';
|
||
isD <= '1' when std_match(unsigned(char), "1-0" & x"4") else '0';
|
||
isE <= '1' when std_match(unsigned(char), "1-0" & x"5") else '0';
|
||
isF <= '1' when std_match(unsigned(char), "1-0" & x"6") else '0';
|
||
isG <= '1' when std_match(unsigned(char), "1-0" & x"7") else '0';
|
||
isH <= '1' when std_match(unsigned(char), "1-0" & x"8") else '0';
|
||
isI <= '1' when std_match(unsigned(char), "1-0" & x"9") else '0';
|
||
isJ <= '1' when std_match(unsigned(char), "1-0" & x"A") else '0';
|
||
isK <= '1' when std_match(unsigned(char), "1-0" & x"B") else '0';
|
||
isL <= '1' when std_match(unsigned(char), "1-0" & x"C") else '0';
|
||
isM <= '1' when std_match(unsigned(char), "1-0" & x"D") else '0';
|
||
isN <= '1' when std_match(unsigned(char), "1-0" & x"E") else '0';
|
||
isO <= '1' when std_match(unsigned(char), "1-0" & x"F") else '0';
|
||
isP <= '1' when std_match(unsigned(char), "1-1" & x"0") else '0';
|
||
isQ <= '1' when std_match(unsigned(char), "1-1" & x"1") else '0';
|
||
isR <= '1' when std_match(unsigned(char), "1-1" & x"2") else '0';
|
||
isS <= '1' when std_match(unsigned(char), "1-1" & x"3") else '0';
|
||
isT <= '1' when std_match(unsigned(char), "1-1" & x"4") else '0';
|
||
isU <= '1' when std_match(unsigned(char), "1-1" & x"5") else '0';
|
||
isV <= '1' when std_match(unsigned(char), "1-1" & x"6") else '0';
|
||
isW <= '1' when std_match(unsigned(char), "1-1" & x"7") else '0';
|
||
isX <= '1' when std_match(unsigned(char), "1-1" & x"8") else '0';
|
||
isY <= '1' when std_match(unsigned(char), "1-1" & x"9") else '0';
|
||
isZ <= '1' when std_match(unsigned(char), "1-1" & x"A") else '0';
|
||
is0 <= '1' when std_match(unsigned(char), "011" & x"0") else '0';
|
||
is1 <= '1' when std_match(unsigned(char), "011" & x"1") else '0';
|
||
is2 <= '1' when std_match(unsigned(char), "011" & x"2") else '0';
|
||
is3 <= '1' when std_match(unsigned(char), "011" & x"3") else '0';
|
||
is4 <= '1' when std_match(unsigned(char), "011" & x"4") else '0';
|
||
is5 <= '1' when std_match(unsigned(char), "011" & x"5") else '0';
|
||
is6 <= '1' when std_match(unsigned(char), "011" & x"6") else '0';
|
||
is7 <= '1' when std_match(unsigned(char), "011" & x"7") else '0';
|
||
is8 <= '1' when std_match(unsigned(char), "011" & x"8") else '0';
|
||
is9 <= '1' when std_match(unsigned(char), "011" & x"9") else '0';
|
||
goto5 <= is5;
|
||
gotoH <= ish or goto5 or is4;
|
||
gotoS <= isS or gotoH or isV or is3;
|
||
gotoF <= isF;
|
||
gotoI <= isI or gotoS or isU or gotoF or is2;
|
||
gotoL <= isL;
|
||
gotoR <= isR or gotoL;
|
||
gotoP <= isP;
|
||
gotoE <= isE or gotoI or isA or gotoR or isW or gotoP or isJ or is1;
|
||
goto6 <= is6;
|
||
gotoB <= isB or goto6;
|
||
gotoD <= isD or gotoB or isX;
|
||
gotoC <= isC;
|
||
gotoN <= isN or gotoD or isK or gotoC or isY;
|
||
goto7 <= is7;
|
||
gotoZ <= isZ or goto7;
|
||
gotoG <= isG or gotoZ or isQ;
|
||
goto8 <= is8;
|
||
goto9 <= is9;
|
||
gotoT <= isT or gotoN or isM or gotoG or isO or goto8 or goto9 or is0;
|
||
-- sequence for morse units
|
||
sendCharacterState: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
characterState <= idle;
|
||
elsif rising_edge(clock) then
|
||
case characterState is
|
||
-- start
|
||
when idle =>
|
||
if charnotReady = '0' then
|
||
characterState <= waitReg;
|
||
end if;
|
||
when waitReg =>
|
||
if gotoE = '1' then
|
||
characterState <= sE;
|
||
elsif gotoT = '1' then
|
||
characterState <= sT;
|
||
else
|
||
characterState <= popChar;
|
||
end if;
|
||
-- level 1
|
||
when sE =>
|
||
if sendDotDashDone = '1' then
|
||
if isE = '1' then
|
||
characterState <= popChar;
|
||
elsif gotoI = '1' then
|
||
characterState <= sI;
|
||
else
|
||
characterState <= sA;
|
||
end if;
|
||
end if;
|
||
when sT =>
|
||
if sendDotDashDone = '1' then
|
||
if isT = '1' then
|
||
characterState <= popChar;
|
||
elsif gotoN = '1' then
|
||
characterState <= sN;
|
||
else
|
||
characterState <= sM;
|
||
end if;
|
||
end if;
|
||
-- level 2
|
||
when sI =>
|
||
if sendDotDashDone = '1' then
|
||
if isI = '1' then
|
||
characterState <= popChar;
|
||
elsif gotoS = '1' then
|
||
characterState <= sS;
|
||
else
|
||
characterState <= sU;
|
||
end if;
|
||
end if;
|
||
when sA =>
|
||
if sendDotDashDone = '1' then
|
||
if isA = '1' then
|
||
characterState <= popChar;
|
||
elsif gotoR = '1' then
|
||
characterState <= sR;
|
||
else
|
||
characterState <= sW;
|
||
end if;
|
||
end if;
|
||
when sN =>
|
||
if sendDotDashDone = '1' then
|
||
if isN = '1' then
|
||
characterState <= popChar;
|
||
elsif gotoD = '1' then
|
||
characterState <= sD;
|
||
else
|
||
characterState <= sK;
|
||
end if;
|
||
end if;
|
||
when sM =>
|
||
if sendDotDashDone = '1' then
|
||
if isM = '1' then
|
||
characterState <= popChar;
|
||
elsif gotoG = '1' then
|
||
characterState <= sG;
|
||
else
|
||
characterState <= sO;
|
||
end if;
|
||
end if;
|
||
-- level 3a
|
||
when sS =>
|
||
if sendDotDashDone = '1' then
|
||
if isS = '1' then
|
||
characterState <= popChar;
|
||
elsif gotoH = '1' then
|
||
characterState <= sH;
|
||
else
|
||
characterState <= sV;
|
||
end if;
|
||
end if;
|
||
when sU =>
|
||
if sendDotDashDone = '1' then
|
||
if isU = '1' then
|
||
characterState <= popChar;
|
||
elsif gotoF = '1' then
|
||
characterState <= sF;
|
||
else
|
||
characterState <= s2a;
|
||
end if;
|
||
end if;
|
||
when sR =>
|
||
if sendDotDashDone = '1' then
|
||
if isR = '1' then
|
||
characterState <= popChar;
|
||
elsif gotoL = '1' then
|
||
characterState <= sL;
|
||
else
|
||
characterState <= popChar;
|
||
end if;
|
||
end if;
|
||
when sW =>
|
||
if sendDotDashDone = '1' then
|
||
if isW = '1' then
|
||
characterState <= popChar;
|
||
elsif gotoP = '1' then
|
||
characterState <= sP;
|
||
else
|
||
characterState <= sJ;
|
||
end if;
|
||
end if;
|
||
-- level 3b
|
||
when sD =>
|
||
if sendDotDashDone = '1' then
|
||
if isD = '1' then
|
||
characterState <= popChar;
|
||
elsif gotoB = '1' then
|
||
characterState <= sB;
|
||
else
|
||
characterState <= sX;
|
||
end if;
|
||
end if;
|
||
when sK =>
|
||
if sendDotDashDone = '1' then
|
||
if isK = '1' then
|
||
characterState <= popChar;
|
||
elsif gotoC = '1' then
|
||
characterState <= sC;
|
||
else
|
||
characterState <= sY;
|
||
end if;
|
||
end if;
|
||
when sG =>
|
||
if sendDotDashDone = '1' then
|
||
if isG = '1' then
|
||
characterState <= popChar;
|
||
elsif gotoZ = '1' then
|
||
characterState <= sZ;
|
||
else
|
||
characterState <= sQ;
|
||
end if;
|
||
end if;
|
||
when sO =>
|
||
if sendDotDashDone = '1' then
|
||
if isO = '1' then
|
||
characterState <= popChar;
|
||
elsif goto8 = '1' then
|
||
characterState <= s8a;
|
||
else
|
||
characterState <= s9a;
|
||
end if;
|
||
end if;
|
||
-- level 4a
|
||
when sH =>
|
||
if sendDotDashDone = '1' then
|
||
if isH = '1' then
|
||
characterState <= popChar;
|
||
elsif goto5 = '1' then
|
||
characterState <= s5;
|
||
else
|
||
characterState <= s4;
|
||
end if;
|
||
end if;
|
||
when sV =>
|
||
if sendDotDashDone = '1' then
|
||
if isV = '1' then
|
||
characterState <= popChar;
|
||
else
|
||
characterState <= s3;
|
||
end if;
|
||
end if;
|
||
when sF =>
|
||
if sendDotDashDone = '1' then
|
||
characterState <= popChar;
|
||
end if;
|
||
when s2a =>
|
||
if sendDotDashDone = '1' then
|
||
characterState <= s2;
|
||
end if;
|
||
-- level 4b
|
||
when sL =>
|
||
if sendDotDashDone = '1' then
|
||
characterState <= popChar;
|
||
end if;
|
||
when sP =>
|
||
if sendDotDashDone = '1' then
|
||
characterState <= popChar;
|
||
end if;
|
||
when sJ =>
|
||
if sendDotDashDone = '1' then
|
||
if isJ = '1' then
|
||
characterState <= popChar;
|
||
else
|
||
characterState <= s1;
|
||
end if;
|
||
end if;
|
||
-- level 4c
|
||
when sB =>
|
||
if sendDotDashDone = '1' then
|
||
if isB = '1' then
|
||
characterState <= popChar;
|
||
elsif goto6 = '1' then
|
||
characterState <= s6;
|
||
else
|
||
characterState <= popChar;
|
||
end if;
|
||
end if;
|
||
when sX =>
|
||
if sendDotDashDone = '1' then
|
||
characterState <= popChar;
|
||
end if;
|
||
when sC =>
|
||
if sendDotDashDone = '1' then
|
||
characterState <= popChar;
|
||
end if;
|
||
when sY =>
|
||
if sendDotDashDone = '1' then
|
||
characterState <= popChar;
|
||
end if;
|
||
-- level 4d
|
||
when sZ =>
|
||
if sendDotDashDone = '1' then
|
||
if isZ = '1' then
|
||
characterState <= popChar;
|
||
elsif goto7 = '1' then
|
||
characterState <= s7;
|
||
else
|
||
characterState <= popChar;
|
||
end if;
|
||
end if;
|
||
when sQ =>
|
||
if sendDotDashDone = '1' then
|
||
characterState <= popChar;
|
||
end if;
|
||
when s8a =>
|
||
if sendDotDashDone = '1' then
|
||
characterState <= s8;
|
||
end if;
|
||
when s9a =>
|
||
if sendDotDashDone = '1' then
|
||
if goto9 = '1' then
|
||
characterState <= s9;
|
||
else
|
||
characterState <= s0;
|
||
end if;
|
||
end if;
|
||
-- level 5
|
||
when s5 | s4 | s3 | s2 | s1 | s6 | s7 | s8 | s9 | s0 =>
|
||
if sendDotDashDone = '1' then
|
||
characterState <= popChar;
|
||
end if;
|
||
-- end of character
|
||
when popChar => characterState <= waitEndOfChar;
|
||
when waitEndOfChar =>
|
||
if sendDotDashDone = '1' then
|
||
characterState <= idle;
|
||
end if;
|
||
when others => characterState <= idle;
|
||
end case;
|
||
end if;
|
||
end process sendCharacterState;
|
||
|
||
sendCharacterOutput: process(characterState)
|
||
begin
|
||
sendDot <= '0';
|
||
sendDash <= '0';
|
||
sendSeparator <= '0';
|
||
readChar <= '0';
|
||
case characterState is
|
||
-- level 1
|
||
when sE =>
|
||
sendDot <= '1';
|
||
when sT =>
|
||
sendDash <= '1';
|
||
-- level 2
|
||
when sI =>
|
||
sendDot <= '1';
|
||
when sA =>
|
||
sendDash <= '1';
|
||
when sN =>
|
||
sendDot <= '1';
|
||
when sM =>
|
||
sendDash <= '1';
|
||
-- level 3a
|
||
when sS =>
|
||
sendDot <= '1';
|
||
when sU =>
|
||
sendDash <= '1';
|
||
when sR =>
|
||
sendDot <= '1';
|
||
when sW =>
|
||
sendDash <= '1';
|
||
-- level 3b
|
||
when sD =>
|
||
sendDot <= '1';
|
||
when sK =>
|
||
sendDash <= '1';
|
||
when sG =>
|
||
sendDot <= '1';
|
||
when sO =>
|
||
sendDash <= '1';
|
||
-- level 4a
|
||
when sH =>
|
||
sendDot <= '1';
|
||
when sV =>
|
||
sendDash <= '1';
|
||
when sF =>
|
||
sendDot <= '1';
|
||
when s2a =>
|
||
sendDash <= '1';
|
||
-- level 4b
|
||
when sL =>
|
||
sendDot <= '1';
|
||
when sP =>
|
||
sendDot <= '1';
|
||
when sJ =>
|
||
sendDash <= '1';
|
||
-- level 4c
|
||
when sB =>
|
||
sendDot <= '1';
|
||
when sX =>
|
||
sendDash <= '1';
|
||
when sC =>
|
||
sendDot <= '1';
|
||
when sY =>
|
||
sendDash <= '1';
|
||
-- level 4d
|
||
when sZ =>
|
||
sendDot <= '1';
|
||
when sQ =>
|
||
sendDash <= '1';
|
||
when s8a =>
|
||
sendDot <= '1';
|
||
when s9a =>
|
||
sendDash <= '1';
|
||
-- level 5
|
||
when s5 =>
|
||
sendDot <= '1';
|
||
when s4 =>
|
||
sendDash <= '1';
|
||
when s3 =>
|
||
sendDash <= '1';
|
||
when s2 =>
|
||
sendDash <= '1';
|
||
when s1 =>
|
||
sendDash <= '1';
|
||
when s6 =>
|
||
sendDot <= '1';
|
||
when s7 =>
|
||
sendDot <= '1';
|
||
when s8 =>
|
||
sendDot <= '1';
|
||
when s9 =>
|
||
sendDot <= '1';
|
||
when s0 =>
|
||
sendDash <= '1';
|
||
-- end of character
|
||
when popChar =>
|
||
readChar <= '1';
|
||
sendSeparator <= '1';
|
||
when others => null;
|
||
end case;
|
||
end process sendCharacterOutput;
|
||
|
||
------------------------------------------------------------------------------
|
||
-- sequence for morse units
|
||
sendDotDashState: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
sequencerState <= idle;
|
||
elsif rising_edge(clock) then
|
||
case sequencerState is
|
||
-- idle
|
||
when idle =>
|
||
if sendDot = '1' then
|
||
sequencerState <= startDot;
|
||
elsif sendDash = '1' then
|
||
sequencerState <= startDash;
|
||
elsif sendSeparator = '1' then
|
||
sequencerState <= startSeparator2;
|
||
end if;
|
||
-- dot
|
||
when startDot =>
|
||
sequencerState <= sendingDot;
|
||
when sendingDot =>
|
||
if counterDone = '1' then
|
||
sequencerState <= startSeparator;
|
||
end if;
|
||
-- dash
|
||
when startDash =>
|
||
sequencerState <= sendingDash;
|
||
when sendingDash =>
|
||
if counterDone = '1' then
|
||
sequencerState <= startSeparator;
|
||
end if;
|
||
-- morse symbol separator
|
||
when startSeparator =>
|
||
sequencerState <= waitingSeparator;
|
||
when waitingSeparator =>
|
||
if counterDone = '1' then
|
||
sequencerState <= dotDashDone;
|
||
end if;
|
||
-- character separator
|
||
when startSeparator2 =>
|
||
sequencerState <= waitingSeparator2;
|
||
when waitingSeparator2 =>
|
||
if counterDone = '1' then
|
||
sequencerState <= dotDashDone;
|
||
end if;
|
||
-- done
|
||
when dotDashDone =>
|
||
sequencerState <= idle;
|
||
end case;
|
||
end if;
|
||
end process sendDotDashState;
|
||
|
||
sendDotDashOutput: process(sequencerState)
|
||
begin
|
||
startCounter <= '0';
|
||
unitNb <= (others => '-');
|
||
sendDotDashDone <= '0';
|
||
morseOut <= '0';
|
||
case sequencerState is
|
||
when startDot | startDash =>
|
||
startCounter <= '1';
|
||
morseOut <= '1';
|
||
when sendingDot =>
|
||
morseOut <= '1';
|
||
unitNb <= to_unsigned(1, unitNb'length);
|
||
when sendingDash =>
|
||
morseOut <= '1';
|
||
unitNb <= to_unsigned(3, unitNb'length);
|
||
when startSeparator =>
|
||
startCounter <= '1';
|
||
when waitingSeparator =>
|
||
unitNb <= to_unsigned(1, unitNb'length);
|
||
when startSeparator2 =>
|
||
startCounter <= '1';
|
||
when waitingSeparator2 =>
|
||
unitNb <= to_unsigned(2, unitNb'length);
|
||
when dotDashDone =>
|
||
sendDotDashDone <= '1';
|
||
when others => null;
|
||
end case;
|
||
end process sendDotDashOutput;
|
||
|
||
END ARCHITECTURE masterVersion;
|
||
|
||
|
||
|
||
|
||
--
|
||
-- VHDL Architecture Morse.charToMorse.struct
|
||
--
|
||
-- Created:
|
||
-- by - axel.amand.UNKNOWN (WE7860)
|
||
-- at - 14:49:52 28.04.2023
|
||
--
|
||
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
||
--
|
||
LIBRARY ieee;
|
||
USE ieee.std_logic_1164.all;
|
||
USE ieee.numeric_std.all;
|
||
|
||
-- LIBRARY Morse;
|
||
|
||
ARCHITECTURE struct OF charToMorse IS
|
||
|
||
-- Architecture declarations
|
||
constant unitCountBitNb: positive := 3;
|
||
|
||
-- Internal signal declarations
|
||
SIGNAL startCounter : std_ulogic;
|
||
SIGNAL done : std_ulogic;
|
||
SIGNAL unitNb : unsigned(unitCountBitNb-1 DOWNTO 0);
|
||
|
||
|
||
-- Component Declarations
|
||
COMPONENT charToMorseController
|
||
GENERIC (
|
||
characterBitNb : positive := 8;
|
||
unitCountBitNb : positive := 3
|
||
);
|
||
PORT (
|
||
morseOut : OUT std_ulogic ;
|
||
clock : IN std_ulogic ;
|
||
reset : IN std_ulogic ;
|
||
charNotReady : IN std_ulogic ;
|
||
char : IN std_ulogic_vector (characterBitNb-1 DOWNTO 0);
|
||
startCounter : OUT std_ulogic ;
|
||
unitNb : OUT unsigned (unitCountBitNb-1 DOWNTO 0);
|
||
counterDone : IN std_ulogic ;
|
||
readChar : OUT std_ulogic
|
||
);
|
||
END COMPONENT;
|
||
COMPONENT unitCounter
|
||
GENERIC (
|
||
unitCountDivide : positive := 10E3;
|
||
unitCountBitNb : positive := 3
|
||
);
|
||
PORT (
|
||
clock : IN std_ulogic ;
|
||
reset : IN std_ulogic ;
|
||
startCounter : IN std_ulogic ;
|
||
unitNb : IN unsigned (unitCountBitNb-1 DOWNTO 0);
|
||
done : OUT std_ulogic
|
||
);
|
||
END COMPONENT;
|
||
|
||
-- Optional embedded configurations
|
||
-- pragma synthesis_off
|
||
-- FOR ALL : charToMorseController USE ENTITY Morse.charToMorseController;
|
||
-- FOR ALL : unitCounter USE ENTITY Morse.unitCounter;
|
||
-- pragma synthesis_on
|
||
|
||
|
||
BEGIN
|
||
|
||
-- Instance port mappings.
|
||
I_ctl : charToMorseController
|
||
GENERIC MAP (
|
||
characterBitNb => characterBitNb,
|
||
unitCountBitNb => unitCountBitNb
|
||
)
|
||
PORT MAP (
|
||
morseOut => morseOut,
|
||
clock => clock,
|
||
reset => reset,
|
||
charNotReady => charNotReady,
|
||
char => charIn,
|
||
startCounter => startCounter,
|
||
unitNb => unitNb,
|
||
counterDone => done,
|
||
readChar => readChar
|
||
);
|
||
I_cnt : unitCounter
|
||
GENERIC MAP (
|
||
unitCountDivide => unitCountDivide,
|
||
unitCountBitNb => unitCountBitNb
|
||
)
|
||
PORT MAP (
|
||
clock => clock,
|
||
reset => reset,
|
||
startCounter => startCounter,
|
||
unitNb => unitNb,
|
||
done => done
|
||
);
|
||
|
||
END struct;
|
||
|
||
|
||
|
||
|
||
-- VHDL Entity Morse.toneGenerator.symbol
|
||
--
|
||
-- Created:
|
||
-- by - francois.francois (Aphelia)
|
||
-- at - 09:13:01 03/29/19
|
||
--
|
||
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
||
--
|
||
LIBRARY ieee;
|
||
USE ieee.std_logic_1164.all;
|
||
USE ieee.numeric_std.all;
|
||
|
||
ENTITY toneGenerator IS
|
||
GENERIC(
|
||
toneDivide : positive := 100E3
|
||
);
|
||
PORT(
|
||
tone : OUT std_ulogic;
|
||
clock : IN std_ulogic;
|
||
reset : IN std_ulogic
|
||
);
|
||
|
||
-- Declarations
|
||
|
||
END toneGenerator ;
|
||
|
||
|
||
|
||
|
||
|
||
-- library Common;
|
||
use work.CommonLib.all;
|
||
|
||
ARCHITECTURE masterVersion OF toneGenerator IS
|
||
|
||
constant toneCounterBitNb: positive := requiredBitNb(toneDivide-1);
|
||
signal toneCounter: unsigned(toneCounterBitNb-1 downto 0);
|
||
constant toneMin : natural := (2**toneCounterBitNb - toneDivide) / 2;
|
||
constant toneMax : natural := toneMin + toneDivide;
|
||
|
||
BEGIN
|
||
|
||
divide: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
toneCounter <= to_unsigned(toneMin, toneCounter'length);
|
||
elsif rising_edge(clock) then
|
||
if toneCounter = toneMax then
|
||
toneCounter <= to_unsigned(toneMin, toneCounter'length);
|
||
else
|
||
toneCounter <= toneCounter + 1;
|
||
end if;
|
||
end if;
|
||
end process divide;
|
||
|
||
tone <= toneCounter(toneCounter'high);
|
||
|
||
END ARCHITECTURE masterVersion;
|
||
|
||
|
||
|
||
|
||
-- VHDL Entity RS232.serialPortReceiver.symbol
|
||
--
|
||
-- Created:
|
||
-- by - francois.francois (Aphelia)
|
||
-- at - 13:45:48 08/28/19
|
||
--
|
||
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
||
--
|
||
LIBRARY ieee;
|
||
USE ieee.std_logic_1164.all;
|
||
USE ieee.numeric_std.all;
|
||
|
||
ENTITY serialPortReceiver IS
|
||
GENERIC(
|
||
dataBitNb : positive := 8;
|
||
baudRateDivide : positive := 2083
|
||
);
|
||
PORT(
|
||
RxD : IN std_ulogic;
|
||
clock : IN std_ulogic;
|
||
reset : IN std_ulogic;
|
||
dataOut : OUT std_ulogic_vector (dataBitNb-1 DOWNTO 0);
|
||
dataValid : OUT std_ulogic
|
||
);
|
||
|
||
-- Declarations
|
||
|
||
END serialPortReceiver ;
|
||
|
||
|
||
|
||
|
||
|
||
-- library Common;
|
||
use work.CommonLib.all;
|
||
|
||
architecture RTL of serialPortReceiver is
|
||
|
||
signal dividerCounter: unsigned(requiredBitNb(baudRateDivide-1)-1 downto 0);
|
||
signal dividerCounterReset: std_uLogic;
|
||
signal rxDelayed: std_uLogic;
|
||
signal dividerCounterSynchronize: std_uLogic;
|
||
signal rxSample: std_uLogic;
|
||
signal rxShiftReg: std_ulogic_vector(dataBitNb-1 downto 0);
|
||
signal rxReceiving: std_uLogic;
|
||
signal rxDataValid: std_uLogic;
|
||
signal rxCounter: unsigned(requiredBitNb(dataBitNb)-1 downto 0);
|
||
|
||
begin
|
||
|
||
divide: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
dividerCounter <= (others => '0');
|
||
elsif rising_edge(clock) then
|
||
if dividerCounterSynchronize = '1' then
|
||
dividerCounter <= to_unsigned(baudRateDivide/2, dividerCounter'length);
|
||
elsif dividerCounterReset = '1' then
|
||
dividerCounter <= (others => '0');
|
||
else
|
||
dividerCounter <= dividerCounter + 1;
|
||
end if;
|
||
end if;
|
||
end process divide;
|
||
|
||
endOfCount: process(dividerCounter)
|
||
begin
|
||
if dividerCounter = baudRateDivide-1 then
|
||
dividerCounterReset <= '1';
|
||
else
|
||
dividerCounterReset <= '0';
|
||
end if;
|
||
end process endOfCount;
|
||
|
||
delayRx: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
rxDelayed <= '0';
|
||
elsif rising_edge(clock) then
|
||
rxDelayed <= RxD;
|
||
end if;
|
||
end process delayRx;
|
||
|
||
rxSynchronize: process(RxD, rxDelayed)
|
||
begin
|
||
if RxD /= rxDelayed then
|
||
dividerCounterSynchronize <= '1';
|
||
else
|
||
dividerCounterSynchronize <= '0';
|
||
end if;
|
||
end process rxSynchronize;
|
||
|
||
rxSample <= dividerCounterReset and not dividerCounterSynchronize;
|
||
|
||
shiftReg: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
rxShiftReg <= (others => '0');
|
||
elsif rising_edge(clock) then
|
||
if rxSample = '1' then
|
||
rxShiftReg(rxShiftReg'high-1 downto 0) <= rxShiftReg(rxShiftReg'high downto 1);
|
||
rxShiftReg(rxShiftReg'high) <= RxD;
|
||
end if;
|
||
end if;
|
||
end process shiftReg;
|
||
|
||
detectReceive: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
rxReceiving <= '0';
|
||
rxDataValid <= '0';
|
||
elsif rising_edge(clock) then
|
||
if rxSample = '1' then
|
||
if rxCounter = dataBitNb-1 then
|
||
rxDataValid <= '1';
|
||
elsif RxD = '0' then
|
||
rxReceiving <= '1';
|
||
end if;
|
||
elsif rxDataValid = '1' then
|
||
rxReceiving <= '0';
|
||
rxDataValid <= '0';
|
||
end if;
|
||
end if;
|
||
end process detectReceive;
|
||
|
||
countRxBitNb: process(reset, clock)
|
||
begin
|
||
if reset = '1' then
|
||
rxCounter <= (others => '0');
|
||
elsif rising_edge(clock) then
|
||
if rxSample = '1' then
|
||
if rxReceiving = '1' then
|
||
rxCounter <= rxCounter + 1;
|
||
else
|
||
rxCounter <= (others => '0');
|
||
end if;
|
||
end if;
|
||
end if;
|
||
end process countRxBitNb;
|
||
|
||
dataOut <= rxShiftReg;
|
||
dataValid <= rxDataValid;
|
||
|
||
end RTL;
|
||
|
||
|
||
|
||
|
||
|
||
--
|
||
-- VHDL Architecture Morse.morseEncoder.struct
|
||
--
|
||
-- Created:
|
||
-- by - axel.amand.UNKNOWN (WE7860)
|
||
-- at - 14:50:20 28.04.2023
|
||
--
|
||
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
||
--
|
||
LIBRARY ieee;
|
||
USE ieee.std_logic_1164.all;
|
||
USE ieee.numeric_std.all;
|
||
|
||
-- LIBRARY Memory;
|
||
-- LIBRARY Morse;
|
||
-- LIBRARY RS232;
|
||
|
||
ARCHITECTURE struct OF morseEncoder IS
|
||
|
||
-- Architecture declarations
|
||
constant fifoDepth : positive := 100;
|
||
|
||
-- Internal signal declarations
|
||
SIGNAL characterReg : std_ulogic_vector(uartDataBitNb-1 DOWNTO 0);
|
||
SIGNAL characterIn : std_ulogic_vector(uartDataBitNb-1 DOWNTO 0);
|
||
SIGNAL characterValid : std_ulogic;
|
||
SIGNAL morseOut : std_ulogic;
|
||
SIGNAL tone : std_ulogic;
|
||
SIGNAL charNotReady : std_ulogic;
|
||
SIGNAL readChar : std_ulogic;
|
||
|
||
|
||
-- Component Declarations
|
||
COMPONENT FIFO_bram
|
||
GENERIC (
|
||
dataBitNb : positive := 8;
|
||
depth : positive := 8
|
||
);
|
||
PORT (
|
||
write : IN std_ulogic ;
|
||
clock : IN std_ulogic ;
|
||
reset : IN std_ulogic ;
|
||
dataOut : OUT std_ulogic_vector (dataBitNb-1 DOWNTO 0);
|
||
read : IN std_ulogic ;
|
||
dataIn : IN std_ulogic_vector (dataBitNb-1 DOWNTO 0);
|
||
empty : OUT std_ulogic ;
|
||
full : OUT std_ulogic
|
||
);
|
||
END COMPONENT;
|
||
COMPONENT charToMorse
|
||
GENERIC (
|
||
characterBitNb : positive := 8;
|
||
unitCountDivide : positive := 10E3
|
||
);
|
||
PORT (
|
||
morseOut : OUT std_ulogic ;
|
||
clock : IN std_ulogic ;
|
||
reset : IN std_ulogic ;
|
||
charIn : IN std_ulogic_vector (characterBitNb-1 DOWNTO 0);
|
||
readChar : OUT std_ulogic ;
|
||
charNotReady : IN std_ulogic
|
||
);
|
||
END COMPONENT;
|
||
COMPONENT toneGenerator
|
||
GENERIC (
|
||
toneDivide : positive := 100E3
|
||
);
|
||
PORT (
|
||
tone : OUT std_ulogic ;
|
||
clock : IN std_ulogic ;
|
||
reset : IN std_ulogic
|
||
);
|
||
END COMPONENT;
|
||
COMPONENT serialPortReceiver
|
||
GENERIC (
|
||
dataBitNb : positive := 8;
|
||
baudRateDivide : positive := 2083
|
||
);
|
||
PORT (
|
||
RxD : IN std_ulogic ;
|
||
clock : IN std_ulogic ;
|
||
reset : IN std_ulogic ;
|
||
dataOut : OUT std_ulogic_vector (dataBitNb-1 DOWNTO 0);
|
||
dataValid : OUT std_ulogic
|
||
);
|
||
END COMPONENT;
|
||
|
||
-- Optional embedded configurations
|
||
-- pragma synthesis_off
|
||
-- FOR ALL : FIFO_bram USE ENTITY Memory.FIFO_bram;
|
||
-- FOR ALL : charToMorse USE ENTITY Morse.charToMorse;
|
||
-- FOR ALL : serialPortReceiver USE ENTITY RS232.serialPortReceiver;
|
||
-- FOR ALL : toneGenerator USE ENTITY Morse.toneGenerator;
|
||
-- pragma synthesis_on
|
||
|
||
|
||
BEGIN
|
||
-- Architecture concurrent statements
|
||
-- HDL Embedded Text Block 1 eb1
|
||
morseCode <= morseOut and tone;
|
||
|
||
|
||
-- Instance port mappings.
|
||
I_FIFO : FIFO_bram
|
||
GENERIC MAP (
|
||
dataBitNb => uartDataBitNb,
|
||
depth => fifoDepth
|
||
)
|
||
PORT MAP (
|
||
write => characterValid,
|
||
clock => clock,
|
||
reset => reset,
|
||
dataOut => characterReg,
|
||
read => readChar,
|
||
dataIn => characterIn,
|
||
empty => charNotReady,
|
||
full => OPEN
|
||
);
|
||
I_enc : charToMorse
|
||
GENERIC MAP (
|
||
characterBitNb => uartDataBitNb,
|
||
unitCountDivide => integer(clockFrequency*unitDuration + 0.5)
|
||
)
|
||
PORT MAP (
|
||
morseOut => morseOut,
|
||
clock => clock,
|
||
reset => reset,
|
||
charNotReady => charNotReady,
|
||
charIn => characterReg,
|
||
readChar => readChar
|
||
);
|
||
I_tone : toneGenerator
|
||
GENERIC MAP (
|
||
toneDivide => integer(clockFrequency/toneFrequency + 0.5)
|
||
)
|
||
PORT MAP (
|
||
tone => tone,
|
||
clock => clock,
|
||
reset => reset
|
||
);
|
||
I_UART : serialPortReceiver
|
||
GENERIC MAP (
|
||
dataBitNb => uartDataBitNb,
|
||
baudRateDivide => integer(clockFrequency/uartBaudRate + 0.5)
|
||
)
|
||
PORT MAP (
|
||
RxD => RxD,
|
||
clock => clock,
|
||
reset => reset,
|
||
dataOut => characterIn,
|
||
dataValid => characterValid
|
||
);
|
||
|
||
END struct;
|
||
|
||
|
||
|
||
|
||
-- VHDL netlist generated by SCUBA Diamond (64-bit) 3.12.1.454
|
||
-- Module Version: 5.7
|
||
--C:\lscc\diamond\3.12\ispfpga\bin\nt64\scuba.exe -w -n pll -lang vhdl -synth synplify -bus_exp 7 -bb -arch sa5p00 -type pll -fin 100.00 -fclkop 60 -fclkop_tol 10.0 -fclkos 75 -fclkos_tol 10.0 -phases 0 -fclkos2 50 -fclkos2_tol 10.0 -phases2 0 -fclkos3 10 -fclkos3_tol 10.0 -phases3 0 -phase_cntl STATIC -enable_s -enable_s2 -enable_s3 -pllLocked -fb_mode 1 -fdc C:/temp/clocker/pll/pll.fdc
|
||
|
||
-- Offers 10MHz, 50MHz, 60MHz and 75MHz clocks
|
||
|
||
library IEEE;
|
||
use IEEE.std_logic_1164.all;
|
||
library ECP5U;
|
||
use ECP5U.components.all;
|
||
|
||
ENTITY pll IS
|
||
PORT(
|
||
clkIn100M : IN std_ulogic;
|
||
en75M : IN std_ulogic;
|
||
en50M : IN std_ulogic;
|
||
en10M : IN std_ulogic;
|
||
clk60MHz : OUT std_ulogic;
|
||
clk75MHz : OUT std_ulogic;
|
||
clk50MHz : OUT std_ulogic;
|
||
clk10MHz : OUT std_ulogic;
|
||
pllLocked : OUT std_ulogic
|
||
);
|
||
|
||
-- Declarations
|
||
|
||
END pll ;
|
||
|
||
architecture rtl of pll is
|
||
|
||
-- internal signal declarations
|
||
signal REFCLK: std_logic;
|
||
signal CLKOS3_t: std_logic;
|
||
signal CLKOS2_t: std_logic;
|
||
signal CLKOS_t: std_logic;
|
||
signal CLKOP_t: std_logic;
|
||
signal scuba_vhi: std_logic;
|
||
signal scuba_vlo: std_logic;
|
||
|
||
attribute FREQUENCY_PIN_CLKOS3 : string;
|
||
attribute FREQUENCY_PIN_CLKOS2 : string;
|
||
attribute FREQUENCY_PIN_CLKOS : string;
|
||
attribute FREQUENCY_PIN_CLKOP : string;
|
||
attribute FREQUENCY_PIN_CLKI : string;
|
||
attribute ICP_CURRENT : string;
|
||
attribute LPF_RESISTOR : string;
|
||
attribute FREQUENCY_PIN_CLKOS3 of PLLInst_0 : label is "10.000000";
|
||
attribute FREQUENCY_PIN_CLKOS2 of PLLInst_0 : label is "50.000000";
|
||
attribute FREQUENCY_PIN_CLKOS of PLLInst_0 : label is "75.000000";
|
||
attribute FREQUENCY_PIN_CLKOP of PLLInst_0 : label is "60.000000";
|
||
attribute FREQUENCY_PIN_CLKI of PLLInst_0 : label is "100.000000";
|
||
attribute ICP_CURRENT of PLLInst_0 : label is "5";
|
||
attribute LPF_RESISTOR of PLLInst_0 : label is "16";
|
||
attribute syn_keep : boolean;
|
||
attribute NGD_DRC_MASK : integer;
|
||
attribute NGD_DRC_MASK of rtl : architecture is 1;
|
||
|
||
begin
|
||
-- component instantiation statements
|
||
scuba_vhi_inst: VHI
|
||
port map (Z=>scuba_vhi);
|
||
|
||
scuba_vlo_inst: VLO
|
||
port map (Z=>scuba_vlo);
|
||
|
||
PLLInst_0: EHXPLLL
|
||
generic map (PLLRST_ENA=> "DISABLED", INTFB_WAKE=> "DISABLED",
|
||
STDBY_ENABLE=> "DISABLED", DPHASE_SOURCE=> "DISABLED",
|
||
CLKOS3_FPHASE=> 0, CLKOS3_CPHASE=> 59, CLKOS2_FPHASE=> 0,
|
||
CLKOS2_CPHASE=> 11, CLKOS_FPHASE=> 0, CLKOS_CPHASE=> 7,
|
||
CLKOP_FPHASE=> 0, CLKOP_CPHASE=> 9, PLL_LOCK_MODE=> 0,
|
||
CLKOS_TRIM_DELAY=> 0, CLKOS_TRIM_POL=> "FALLING",
|
||
CLKOP_TRIM_DELAY=> 0, CLKOP_TRIM_POL=> "FALLING",
|
||
OUTDIVIDER_MUXD=> "DIVD", CLKOS3_ENABLE=> "DISABLED",
|
||
OUTDIVIDER_MUXC=> "DIVC", CLKOS2_ENABLE=> "DISABLED",
|
||
OUTDIVIDER_MUXB=> "DIVB", CLKOS_ENABLE=> "DISABLED",
|
||
OUTDIVIDER_MUXA=> "DIVA", CLKOP_ENABLE=> "ENABLED", CLKOS3_DIV=> 60,
|
||
CLKOS2_DIV=> 12, CLKOS_DIV=> 8, CLKOP_DIV=> 10, CLKFB_DIV=> 3,
|
||
CLKI_DIV=> 5, FEEDBK_PATH=> "CLKOP")
|
||
port map (CLKI=>clkIn100M, CLKFB=>CLKOP_t, PHASESEL1=>scuba_vlo,
|
||
PHASESEL0=>scuba_vlo, PHASEDIR=>scuba_vlo,
|
||
PHASESTEP=>scuba_vlo, PHASELOADREG=>scuba_vlo,
|
||
STDBY=>scuba_vlo, PLLWAKESYNC=>scuba_vlo, RST=>scuba_vlo,
|
||
ENCLKOP=>scuba_vlo, ENCLKOS=>en75M, ENCLKOS2=>en50M,
|
||
ENCLKOS3=>en10M, CLKOP=>CLKOP_t, CLKOS=>CLKOS_t,
|
||
CLKOS2=>CLKOS2_t, CLKOS3=>CLKOS3_t, LOCK=>pllLocked,
|
||
INTLOCK=>open, REFCLK=>REFCLK, CLKINTFB=>open);
|
||
|
||
clk10MHz <= CLKOS3_t;
|
||
clk50MHz <= CLKOS2_t;
|
||
clk75MHz <= CLKOS_t;
|
||
clk60MHz <= CLKOP_t;
|
||
end rtl;
|
||
|
||
|
||
|
||
|
||
--
|
||
-- VHDL Architecture Board.morse_ebs3.struct
|
||
--
|
||
-- Created:
|
||
-- by - axel.amand.UNKNOWN (WE7860)
|
||
-- at - 08:06:36 08.05.2023
|
||
--
|
||
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
||
--
|
||
LIBRARY ieee;
|
||
USE ieee.std_logic_1164.all;
|
||
USE ieee.numeric_std.all;
|
||
|
||
-- LIBRARY Board;
|
||
-- LIBRARY Lattice;
|
||
-- LIBRARY Morse;
|
||
|
||
ARCHITECTURE struct OF morse_ebs3 IS
|
||
|
||
-- Architecture declarations
|
||
constant clockFrequency: real := 60.0E6;
|
||
constant uartBaudRate: real := 9.6E3;
|
||
constant uartDataBitNb: positive := 7;
|
||
constant morseUnitDuration: real := 100.0E-3; -- 1/2 * 10 Hz
|
||
constant morseToneFrequency: real := 3135.96; -- sol 3eme octave
|
||
constant deglitchBitNb: positive := 16;
|
||
|
||
-- Internal signal declarations
|
||
SIGNAL clk_sys : std_ulogic;
|
||
SIGNAL logic0 : std_ulogic;
|
||
SIGNAL logic1 : std_uLogic;
|
||
SIGNAL morseIn_synch : std_uLogic;
|
||
SIGNAL reset1 : std_ulogic;
|
||
SIGNAL resetSynch : std_ulogic;
|
||
SIGNAL resetSynch_n : std_ulogic;
|
||
|
||
-- Implicit buffer signal declarations
|
||
SIGNAL RxD_synch_internal : std_ulogic;
|
||
|
||
|
||
-- Component Declarations
|
||
COMPONENT DFF
|
||
PORT (
|
||
CLK : IN std_uLogic ;
|
||
CLR : IN std_uLogic ;
|
||
D : IN std_uLogic ;
|
||
Q : OUT std_uLogic
|
||
);
|
||
END COMPONENT;
|
||
COMPONENT inverterIn
|
||
PORT (
|
||
in1 : IN std_uLogic ;
|
||
out1 : OUT std_uLogic
|
||
);
|
||
END COMPONENT;
|
||
COMPONENT pll
|
||
PORT (
|
||
clkIn100M : IN std_ulogic ;
|
||
en75M : IN std_ulogic ;
|
||
en50M : IN std_ulogic ;
|
||
en10M : IN std_ulogic ;
|
||
clk60MHz : OUT std_ulogic ;
|
||
clk75MHz : OUT std_ulogic ;
|
||
clk50MHz : OUT std_ulogic ;
|
||
clk10MHz : OUT std_ulogic ;
|
||
pllLocked : OUT std_ulogic
|
||
);
|
||
END COMPONENT;
|
||
COMPONENT morseDecoder
|
||
GENERIC (
|
||
clockFrequency : real := 100.0E6;
|
||
uartBaudRate : real := 115.2E3;
|
||
uartDataBitNb : positive := 8;
|
||
unitDuration : real := 100.0E-3;
|
||
toneFrequency : real := 300.0;
|
||
deglitchBitNb : natural := 8
|
||
);
|
||
PORT (
|
||
morseCode : IN std_ulogic ;
|
||
clock : IN std_ulogic ;
|
||
reset : IN std_ulogic ;
|
||
TxD : OUT std_ulogic ;
|
||
morseEnvelope : OUT std_ulogic
|
||
);
|
||
END COMPONENT;
|
||
COMPONENT morseEncoder
|
||
GENERIC (
|
||
clockFrequency : real := 100.0E6;
|
||
uartBaudRate : real := 115.2E3;
|
||
uartDataBitNb : positive := 8;
|
||
unitDuration : real := 100.0E-3;
|
||
toneFrequency : real := 300.0
|
||
);
|
||
PORT (
|
||
morseCode : OUT std_ulogic ;
|
||
clock : IN std_ulogic ;
|
||
reset : IN std_ulogic ;
|
||
RxD : IN std_ulogic
|
||
);
|
||
END COMPONENT;
|
||
|
||
-- Optional embedded configurations
|
||
-- pragma synthesis_off
|
||
-- FOR ALL : DFF USE ENTITY Board.DFF;
|
||
-- FOR ALL : inverterIn USE ENTITY Board.inverterIn;
|
||
-- FOR ALL : morseDecoder USE ENTITY Morse.morseDecoder;
|
||
-- FOR ALL : morseEncoder USE ENTITY Morse.morseEncoder;
|
||
-- FOR ALL : pll USE ENTITY Lattice.pll;
|
||
-- pragma synthesis_on
|
||
|
||
|
||
BEGIN
|
||
-- Architecture concurrent statements
|
||
-- HDL Embedded Text Block 6 eb6
|
||
logic1 <= '1';
|
||
|
||
-- HDL Embedded Text Block 7 eb7
|
||
logic0 <= '0';
|
||
|
||
|
||
-- Instance port mappings.
|
||
I7 : DFF
|
||
PORT MAP (
|
||
CLK => clk_sys,
|
||
CLR => resetSynch,
|
||
D => RxD,
|
||
Q => RxD_synch_internal
|
||
);
|
||
I8 : DFF
|
||
PORT MAP (
|
||
CLK => clock,
|
||
CLR => reset1,
|
||
D => logic1,
|
||
Q => resetSynch_n
|
||
);
|
||
I9 : DFF
|
||
PORT MAP (
|
||
CLK => clk_sys,
|
||
CLR => resetSynch,
|
||
D => morseIn,
|
||
Q => morseIn_synch
|
||
);
|
||
I3 : inverterIn
|
||
PORT MAP (
|
||
in1 => reset_n,
|
||
out1 => reset1
|
||
);
|
||
I4 : inverterIn
|
||
PORT MAP (
|
||
in1 => resetSynch_n,
|
||
out1 => resetSynch
|
||
);
|
||
I_pll : pll
|
||
PORT MAP (
|
||
clkIn100M => clock,
|
||
en75M => logic0,
|
||
en50M => logic0,
|
||
en10M => logic0,
|
||
clk60MHz => clk_sys,
|
||
clk75MHz => OPEN,
|
||
clk50MHz => OPEN,
|
||
clk10MHz => OPEN,
|
||
pllLocked => OPEN
|
||
);
|
||
I_dec : morseDecoder
|
||
GENERIC MAP (
|
||
clockFrequency => clockFrequency,
|
||
uartBaudRate => uartBaudRate,
|
||
uartDataBitNb => uartDataBitNb,
|
||
unitDuration => morseUnitDuration,
|
||
toneFrequency => morseToneFrequency,
|
||
deglitchBitNb => deglitchBitNb
|
||
)
|
||
PORT MAP (
|
||
morseCode => morseIn_synch,
|
||
clock => clk_sys,
|
||
reset => resetSynch,
|
||
TxD => TxD,
|
||
morseEnvelope => morseEnvelope
|
||
);
|
||
I_enc : morseEncoder
|
||
GENERIC MAP (
|
||
clockFrequency => clockFrequency,
|
||
uartBaudRate => uartBaudRate,
|
||
uartDataBitNb => uartDataBitNb,
|
||
unitDuration => morseUnitDuration,
|
||
toneFrequency => morseToneFrequency
|
||
)
|
||
PORT MAP (
|
||
morseCode => morseOut,
|
||
clock => clk_sys,
|
||
reset => resetSynch,
|
||
RxD => RxD_synch_internal
|
||
);
|
||
|
||
-- Implicit buffered output assignments
|
||
RxD_synch <= RxD_synch_internal;
|
||
|
||
END struct;
|
||
|
||
|
||
|
||
|