⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcm.vhd

📁 语音编码的VHDL源码,已经调试通过.压缩文件中包括调试过程代码.
💻 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 + -