1
0
SEm-Labos/05-Morse/Board/concat/morse.vhd

3248 lines
95 KiB
VHDL
Raw Normal View History

2024-02-23 13:01:05 +00:00
-- 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;