Верхний уровень, ограничения и проект Gowin
Выводы микрофона в .cst пока закомментированы: номера подставим при разводке. Бит1 STATUS кадра занят насыщением выхода дециматора.
This commit is contained in:
+20
@@ -0,0 +1,20 @@
|
||||
<?xml version="1" encoding="UTF-8"?>
|
||||
<!DOCTYPE gowin-fpga-project>
|
||||
<Project>
|
||||
<Template>FPGA</Template>
|
||||
<Version>5</Version>
|
||||
<Device name="" pn="">gw5a25b-003</Device>
|
||||
<FileList>
|
||||
<File path="src/UART.vhd" type="file.vhdl" enable="1"/>
|
||||
<File path="src/led_status.vhd" type="file.vhdl" enable="1"/>
|
||||
<File path="src/pdm_rx.vhd" type="file.vhdl" enable="1"/>
|
||||
<File path="src/cic_decim.vhd" type="file.vhdl" enable="1"/>
|
||||
<File path="src/fir_coefs_pkg.vhd" type="file.vhdl" enable="1"/>
|
||||
<File path="src/fir_decim.vhd" type="file.vhdl" enable="1"/>
|
||||
<File path="src/fifo_top.vhd" type="file.vhdl" enable="1"/>
|
||||
<File path="src/Packets_creator.vhd" type="file.vhdl" enable="1"/>
|
||||
<File path="src/Top.vhd" type="file.vhdl" enable="1"/>
|
||||
<File path="src/DigMic.cst" type="file.cst" enable="1"/>
|
||||
<File path="src/DigMic.sdc" type="file.sdc" enable="1"/>
|
||||
</FileList>
|
||||
</Project>
|
||||
@@ -0,0 +1,21 @@
|
||||
//Copyright (C)2014-2025 Gowin Semiconductor Corporation.
|
||||
//File Title: Physical Constraints file
|
||||
//Part Number: GW5A-LV25MG121NC1/I0
|
||||
//Device: GW5A-25
|
||||
|
||||
// Служебные цепи платы Tang Primer 25K
|
||||
IO_LOC "clk" E2;
|
||||
IO_PORT "clk" IO_TYPE=LVCMOS33 PULL_MODE=NONE BANK_VCCIO=3.3;
|
||||
IO_LOC "UART_TX" G5;
|
||||
IO_PORT "UART_TX" IO_TYPE=LVCMOS33 PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
|
||||
IO_LOC "LED" E8;
|
||||
IO_PORT "LED" IO_TYPE=LVCMOS33 PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
|
||||
|
||||
// Микрофон: выводы выбираются при разводке, банк 3.3 В (Vdd микрофона до 3.6 В).
|
||||
// Раскомментировать и подставить номера.
|
||||
//IO_LOC "MIC_CLK" ??;
|
||||
//IO_PORT "MIC_CLK" IO_TYPE=LVCMOS33 PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
|
||||
//IO_LOC "MIC_DAT" ??;
|
||||
//IO_PORT "MIC_DAT" IO_TYPE=LVCMOS33 PULL_MODE=NONE BANK_VCCIO=3.3;
|
||||
//IO_LOC "MIC_SEL" ??;
|
||||
//IO_PORT "MIC_SEL" IO_TYPE=LVCMOS33 PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
|
||||
@@ -0,0 +1,3 @@
|
||||
// Тактовый генератор платы: 50 МГц -> период 20 нс.
|
||||
// Без этого статический анализ не проверяет ни одного пути и выдаёт TA1132.
|
||||
create_clock -name clk -period 20 -waveform {0 10} [get_ports {clk}]
|
||||
+201
@@ -0,0 +1,201 @@
|
||||
----------------------------------------------------------------------------------
|
||||
-- Company:
|
||||
-- Engineer:
|
||||
-- Create Date:
|
||||
-- Design Name:
|
||||
-- Module Name: Top - Behavioral
|
||||
-- Project Name: DigMic_prj
|
||||
-- Target Devices: Gowin GW5A-25
|
||||
-- Description:
|
||||
-- Цифровой микрофон SPH9855 -> UART.
|
||||
-- MIC_CLK 3.125 МГц (50/16, Normal mode) -> CIC sinc^4 /50 -> 62.5 кГц ->
|
||||
-- ФНЧ /5 -> 12 500 Гц, 24 бита -> кадры по 50 отсчётов -> UART 921600.
|
||||
--
|
||||
-- Постоянная '1' на выводе данных микрофона даёт полную шкалу 24 бит,
|
||||
-- так что шкала выхода -- dBFS, как её задаёт даташит микрофона.
|
||||
----------------------------------------------------------------------------------
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.numeric_std.all;
|
||||
|
||||
entity Top is
|
||||
generic (
|
||||
SYS_CLK_HZ : integer := 50_000_000;
|
||||
BAUD_RATE : integer := 921600
|
||||
);
|
||||
port (
|
||||
clk : in std_logic;
|
||||
|
||||
-- Микрофон
|
||||
MIC_DAT : in std_logic;
|
||||
MIC_CLK : out std_logic;
|
||||
MIC_SEL : out std_logic;
|
||||
|
||||
-- UART на внешний USB-мост
|
||||
UART_TX : out std_logic;
|
||||
|
||||
LED : out std_logic
|
||||
);
|
||||
end entity Top;
|
||||
|
||||
architecture Behavioral of Top is
|
||||
|
||||
constant PDM_DIV : integer := 16; -- 50 МГц / 16 = 3.125 МГц
|
||||
constant CIC_R : integer := 50; -- 3.125 МГц / 50 = 62.5 кГц
|
||||
constant CIC_N : integer := 4;
|
||||
constant CIC_W : integer := 26;
|
||||
constant FIR_DEC : integer := 5; -- 62.5 кГц / 5 = 12.5 кГц
|
||||
|
||||
signal rst_n : std_logic := '1';
|
||||
|
||||
signal pdm_bit : std_logic;
|
||||
signal pdm_valid : std_logic;
|
||||
|
||||
signal cic_data : signed(CIC_W - 1 downto 0);
|
||||
signal cic_valid : std_logic;
|
||||
|
||||
signal fir_data : signed(23 downto 0);
|
||||
signal fir_valid : std_logic;
|
||||
signal fir_sat : std_logic;
|
||||
|
||||
signal fifo_q : std_logic_vector(23 downto 0);
|
||||
signal fifo_rd_en : std_logic;
|
||||
signal fifo_dready : std_logic;
|
||||
signal fifo_full : std_logic;
|
||||
|
||||
signal uart_ena : std_logic;
|
||||
signal uart_data : std_logic_vector(7 downto 0);
|
||||
signal uart_busy : std_logic;
|
||||
|
||||
begin
|
||||
|
||||
rst_n <= '1';
|
||||
|
||||
pdm_rx_inst : entity work.pdm_rx(rtl)
|
||||
generic map(
|
||||
CLK_DIV => PDM_DIV,
|
||||
SEL_HIGH => '0' -- микрофон отдаёт бит по спаду MIC_CLK
|
||||
)
|
||||
port map
|
||||
(
|
||||
clk => clk,
|
||||
rst_n => rst_n,
|
||||
mic_dat => MIC_DAT,
|
||||
mic_clk => MIC_CLK,
|
||||
mic_sel => MIC_SEL,
|
||||
bit_out => pdm_bit,
|
||||
bit_valid => pdm_valid
|
||||
);
|
||||
|
||||
cic_decim_inst : entity work.cic_decim(rtl)
|
||||
generic map(
|
||||
ORDER => CIC_N,
|
||||
DECIM => CIC_R,
|
||||
ACC_W => CIC_W
|
||||
)
|
||||
port map
|
||||
(
|
||||
clk => clk,
|
||||
rst_n => rst_n,
|
||||
din => pdm_bit,
|
||||
din_valid => pdm_valid,
|
||||
dout => cic_data,
|
||||
dout_valid => cic_valid
|
||||
);
|
||||
|
||||
fir_decim_inst : entity work.fir_decim(rtl)
|
||||
generic map(
|
||||
DIN_W => CIC_W,
|
||||
DOUT_W => 24,
|
||||
DECIM => FIR_DEC,
|
||||
BUF_AW => 8,
|
||||
ACC_W => 48
|
||||
)
|
||||
port map
|
||||
(
|
||||
clk => clk,
|
||||
rst_n => rst_n,
|
||||
din => cic_data,
|
||||
din_valid => cic_valid,
|
||||
dout => fir_data,
|
||||
dout_valid => fir_valid,
|
||||
sat => fir_sat
|
||||
);
|
||||
|
||||
fifo_top_inst : entity work.fifo_top(rtl)
|
||||
generic map(
|
||||
DWIDTH => 24,
|
||||
DEPTH => 128,
|
||||
AF_LEVEL => 50 -- порог начала кадра
|
||||
)
|
||||
port map
|
||||
(
|
||||
Data => std_logic_vector(fir_data),
|
||||
WrClk => clk,
|
||||
RdClk => clk,
|
||||
WrEn => fir_valid,
|
||||
RdEn => fifo_rd_en,
|
||||
Q => fifo_q,
|
||||
Empty => open,
|
||||
Almost_Full => fifo_dready,
|
||||
Full => fifo_full
|
||||
);
|
||||
|
||||
packets_creator_inst : entity work.Packets_creator(Behavioral)
|
||||
generic map(
|
||||
SAMPLES_PER_FRAME => 50
|
||||
)
|
||||
port map
|
||||
(
|
||||
clk => clk,
|
||||
rst_n => rst_n,
|
||||
data_ADC => fifo_q,
|
||||
dready => fifo_dready,
|
||||
rd_en => fifo_rd_en,
|
||||
wr_en => fir_valid,
|
||||
fifo_full => fifo_full,
|
||||
err_overrun => fir_sat, -- бит1 STATUS: выход упирался в шкалу
|
||||
busy_uart => uart_busy,
|
||||
ena_uart => uart_ena,
|
||||
dout => uart_data,
|
||||
fault => open
|
||||
);
|
||||
|
||||
uart_inst : entity work.uart(logic)
|
||||
generic map(
|
||||
clk_freq => SYS_CLK_HZ,
|
||||
baud_rate => BAUD_RATE,
|
||||
os_rate => 16,
|
||||
d_width => 8,
|
||||
parity => 0,
|
||||
parity_eo => '0'
|
||||
)
|
||||
port map
|
||||
(
|
||||
clk => clk,
|
||||
reset_n => rst_n,
|
||||
tx_ena => uart_ena,
|
||||
tx_data => uart_data,
|
||||
rx => '1',
|
||||
rx_busy => open,
|
||||
rx_error => open,
|
||||
rx_data => open,
|
||||
tx_busy => uart_busy,
|
||||
tx => UART_TX
|
||||
);
|
||||
|
||||
led_status_inst : entity work.led_status(rtl)
|
||||
generic map(
|
||||
SYS_CLK_HZ => SYS_CLK_HZ,
|
||||
SLOW_HZ => 2,
|
||||
FAST_HZ => 10,
|
||||
ALIVE_MS => 200
|
||||
)
|
||||
port map
|
||||
(
|
||||
clk => clk,
|
||||
data_event => fir_valid,
|
||||
led => LED
|
||||
);
|
||||
|
||||
end architecture Behavioral;
|
||||
Reference in New Issue
Block a user