📄 pcm.vhd
字号:
--码率500kb/s 、字长8位、帧长128位、帧同步码为EB90H的PCM采编器
--地址分配
--帧同步码0~1路
--模拟通道 2~100路
--数字通道 101~127路
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
ENTITY pcm IS
--GENERIC(__parameter_name : string := __default_value;
-- __parameter_name : integer:= __default_value);
PORT(
clk : IN STD_LOGIC; --外部时钟
databus : IN STD_LOGIC_VECTOR(7 downto 0);--数据总线
serial_data : OUT STD_LOGIC; --串行数据输出
--__bidir_name, __bidir_name : INOUT STD_LOGIC;
addr : OUT STD_LOGIC_VECTOR(6 downto 0); --地址输出
ad_select : OUT STD_LOGIC; --AD 片选
ser_clk : OUT STD_LOGIC; --串行数据输出时钟
digit_select: OUT STD_LOGIC); --数字 片选
END pcm;
ARCHITECTURE pcm_arch OF pcm IS
SIGNAL data : STD_LOGIC_VECTOR(7 downto 0); --24选8多路数据选择器输出
SIGNAL cnt8 : STD_LOGIC_VECTOR(2 downto 0); --位计数器
SIGNAL cnt128 : STD_LOGIC_VECTOR(6 downto 0); --字计数器
SIGNAL divide1 : STD_LOGIC_VECTOR(3 downto 0); --码率分频器分频值
SIGNAL serial_clk : STD_LOGIC; --码率
SIGNAL work_clk : STD_LOGIC; --字计数器时钟
SIGNAL serial_out : STD_LOGIC; --8选1数据选择器输出
BEGIN
GetCodeRata: --从12MHz分频得到500KHz码率
PROCESS (clk)
BEGIN
if(clk'event and clk='1') then
if(divide1="1011") then
divide1<="0000";
serial_clk<=not serial_clk; --500KHz时钟
else divide1<=divide1+1;
end if;
end if;
END PROCESS;
BitCounter: --位计数器与D触发器
PROCESS (serial_clk)
BEGIN
if(serial_clk'event and serial_clk='1') then
--if(divide1="1011") then
cnt8<=cnt8+1;
serial_data<=serial_out;
--else divide1<=divide1+1;
--end if;
end if;
END PROCESS;
WorkClkGenerate: --产生字计数器时钟
PROCESS (cnt8)
BEGIN
if(cnt8="000") then work_clk<='1'; --500KHz/8 字时钟
else work_clk<='0';
--end if;
end if;
END PROCESS;
Mux8_to_1: --8选1数据选择器
PROCESS (cnt8,data)
BEGIN
CASE cnt8 IS
WHEN "000" =>serial_out<=data(7);
WHEN "001" =>serial_out<=data(6);
WHEN "010" =>serial_out<=data(5);
WHEN "011" =>serial_out<=data(4);
WHEN "100" =>serial_out<=data(3);
WHEN "101" =>serial_out<=data(2);
WHEN "110" =>serial_out<=data(1);
WHEN others =>serial_out<=data(0);
END CASE;
END PROCESS;
workCounter: --字计数
PROCESS (work_clk)
BEGIN
if(work_clk'event and work_clk='1') then cnt128<=cnt128+1;
--else work_clk<='0';
--end if;
end if;
END PROCESS;
Mux24_to_8: --24选8多路数据选择器
PROCESS (cnt128,databus)
BEGIN
if(cnt128<"1100101" and cnt128>"0000001") then ad_select<='1';
else ad_select<='0';
--end if;
end if;
if(cnt128>"1100100") then digit_select<='1';
else digit_select<='0';
--end if;
end if;
if(cnt128="0000000") then data<="11101011"; --同步码高字节EBH
elsif (cnt128="0000001") then data<="10010000"; --同步码低字节90H
else data<=databus; --外部数据
end if;
END PROCESS;
addr<=cnt128;
ser_clk<=serial_clk;
END pcm_arch;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -