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

📄 qpsk.vhd

📁 qpsk vhdl code ue to impelemented on fpga kits
💻 VHD
字号:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;


entity qpsk is
	port(
		ClkxCI		: in std_logic;
		ResetxRBI	: in std_logic;
				
		
		DataInxDI		: in std_logic_vector(23 downto 0);
		DataInReqxSI	: in std_logic;
		DataInAckxSO	: out std_logic;
		
		DataOutxDO		: out std_logic_vector(23 downto 0);
		DataOutReqxSO	: out std_logic;
		DataOutAckxSI	: in std_logic
		
		);
end qpsk;

architecture rtl of qpsk is

component LUT_Odd
	generic (
		width : integer;
		aw	  : integer);
		
	port (

	AddrxDIO : in std_logic_vector(aw-1 downto 0);
	DataxDOO : out std_logic_vector(width-1 downto 0));
end component;

component LUT_Even
	generic (
		width : integer;
		aw	  : integer);
		
	port (

	AddrxDIE : in std_logic_vector(aw-1 downto 0);
	DataxDOE : out std_logic_vector(width-1 downto 0));
end component;

component RAM_Odd
	generic (
		width : integer;
		aw	  : integer);
		
	port (

	AddrxDIO : in std_logic_vector(aw-1 downto 0);
	WExSIO	 : in std_logic;
	EnxSIO	 : in std_logic;
	WClkxCI	 : in std_logic;
	DinxDIO	 : in std_logic_vector(width-1 downto 0);
	DoutxDOO : out std_logic_vector(width-1 downto 0));
end component;

component RAM_Even
	generic (
		width : integer;
		aw	  : integer);
		
	port (

	AddrxDIE : in std_logic_vector(aw-1 downto 0);
	WExSIE	 : in std_logic;
	EnxSIE	 : in std_logic;
	WClkxCI	 : in std_logic;
	DinxDIE	 : in std_logic_vector(width-1 downto 0);
	DoutxDOE : out std_logic_vector(width-1 downto 0));
end component;

signal InRegEnxS				: std_logic;
signal InRegxDP, InRegxDN		: std_logic_vector(23 downto 0);


--counters
signal OffsetDecxSO				: std_logic;
signal OffsetxDPO, OffsetxDNO	: unsigned(11 downto 0);
signal CounterIncxSO			: std_logic;
signal CounterxDPO, CounterxDNO	: unsigned(11 downto 0);
signal OffsetDecxSE				: std_logic;
signal OffsetxDPE, OffsetxDNE	: unsigned(11 downto 0);
signal CounterIncxSE			: std_logic;
signal CounterxDPE, CounterxDNE	: unsigned(11 downto 0);
signal RamAddrxDO				: std_logic_vector(11 downto 0);
signal LutAddrxDO				: std_logic_vector(11 downto 0);
signal RamAddrxDE				: std_logic_vector(11 downto 0);
signal LutAddrxDE				: std_logic_vector(11 downto 0);
signal RamWriteEnxSO			: std_logic;
signal RamWriteEnxSE			: std_logic;
signal RamWritexSE				: std_logic;
signal RamWritexSO				: std_logic;
signal CounterIncxS				: std_logic;
signal OffsetxDecxS				: std_logic;
signal Count, Count1			: unsigned(1 downto 0);
signal wala, wala1				: unsigned(11 downto 0);
signal Countdown				: std_logic;
signal Odd, Even				: std_logic;

--alu signals
signal SumxD					: signed(35 downto 0);
signal SumxO					: signed(35 downto 0);
signal SumxE					: signed(35 downto 0);
signal RamSignedxDO				: signed(23 downto 0);
signal RamSignedxDE				: signed(23 downto 0);
signal LutSignedxDO				: signed(11 downto 0);
signal LutSignedxDE				: signed(11 downto 0);
signal RamReadxDO				: std_logic_vector(23 downto 0);
signal RamReadxDE				: std_logic_vector(23 downto 0);
signal LutReadxDO				: std_logic_vector(11 downto 0);
signal LutReadxDE				: std_logic_vector(11 downto 0);
signal SumStdxD					: std_logic_vector(35 downto 0);

--out signal
signal OutRegENxS				: std_logic;
signal OutRegxDP, OutRegxDN		: std_logic_vector(23 downto 0);
signal DataOutReqxS				: std_logic;

--fsm
type state_type is (idle, new_data, run, data_out);
signal StatexDP, StatexDN : state_type;

begin

	InRegxDN <= DataInxDI;
	
p_inreg : process (ClkxCI, ResetxRBI)

		begin
			if ResetxRBI = '0' then
				InRegxDP <= (others => '0');
				
			elsif ClkxCI'event and ClkxCI = '1' then
				if InRegEnxS = '1' then
					InRegxDP <= InRegxDN;
				end if;
			end if;
		end process p_inreg;
		
p_select: process (Countdown, wala, wala1, Count, Count1, Odd, Even) 
		
		begin
		wala <= wala1;
		
				if Countdown <='1' then
					
					Count <= Count1;
					
						if Count <= "01" then
							Odd <= '1';
							Even <= '0';
							Count <= Count1 + "01";
						elsif Count = "10" then
							Even <= '1';
							Odd <= '0';
							Count <= Count1 - "01";
						
						end if;
					
					wala <= wala1 + "000000000001";
				end if;
			
		end process p_select;
		
p_dataOdd: process (OffsetxDPO, OffsetDecxSO, OffsetxDPE, OffsetDecxSE)

		begin
			OffsetxDNO <= OffsetxDPO;
			OffsetxDNE <= OffsetxDPE;
			if OffsetDecxSO = '1' then
				OffsetxDNO <= OffsetxDPO - "000000000001";
			elsif OffsetDecxSE = '1' then
				OffsetxDNE <= OffsetxDPE - "000000000001";
			end if;
		end process p_dataOdd;
		
p_lutOdd: process (CounterxDPO, CounterIncxSO, CounterxDPE, CounterIncxSE)

		begin 
			CounterxDNO <= CounterxDPO;
			CounterxDNE <= CounterxDPE;
			if CounterIncxSO = '1' then
				CounterxDNO <= CounterxDPO + "000000000001";
			elsif CounterIncxSE = '1' then
				CounterxDNE <= CounterxDPE + "000000000001";
			end if;
		end process p_lutOdd;

p_addclkOdd: process (ClkxCI, ResetxRBI)

		begin
			if ResetxRBI = '0' then
				CounterxDPO <= (others => '0');
				OffsetxDPO <= (others => '0');
				CounterxDPE <= (others => '0');
				OffsetxDPE <= (others => '0');

				
			elsif ClkxCI'event and ClkxCI = '1' then
				wala1 <= wala;
				CounterxDPO <= CounterxDNO;
				OffsetxDPO <= OffsetxDNO;
				CounterxDPE <= CounterxDNE;
				OffsetxDPE <= OffsetxDNE;
			end if;
		end process p_addclkOdd;

RamAddrxDO <= std_logic_vector(OffsetxDPO + CounterxDPO);
LutAddrxDO <= std_logic_vector(CounterxDPO);
RamAddrxDE <= std_logic_vector(OffsetxDPE + CounterxDPE);
LutAddrxDE <= std_logic_vector(CounterxDPE);

--alu

RamSignedxDO <= signed(RamReadxDO);
RamSignedxDE <= signed(RamReadxDE);
LutSignedxDO <= signed(LutReadxDO);
LutSignedxDE <= signed(LutReadxDE);

SumxO <= RamSignedxDO *  LutSignedxDO; 
SumxE <= RamSignedxDE *  LutSignedxDE; 

SumxD <= SumxO + SumxE;

SumStdxD <= std_logic_vector(SumxD);

OutRegxDN <= SumStdxD(35 downto 12);

p_outreg: process (ClkxCI, ResetxRBI)

			begin
				if ResetxRBI = '0' then
					OutRegxDP <= (others => '0');
				elsif ClkxCI'event and ClkxCI = '1' then
					if OutRegENxS = '1' then
						OutRegxDP <= OutRegxDN;
					end if;
				end if;
			end process p_outreg;
			
DataOutxDO <= OutRegxDP;

--fsm

p_fsm: process(StatexDP, DataInReqxSI, DataOutAckxSI, CounterxDPO)
			begin
			
			InRegEnxS		<= '0';
			OutRegEnxS		<= '0';
			OffsetDecxSO	<= '0';
			CounterIncxSO	<= '0';
			OffsetDecxSE	<= '0';
			CounterIncxSE	<= '0';
			RamWriteEnxSO	<= '0';
			RamWriteEnxSE	<= '0';
			DataInAckxSO	<= '0';
			DataOutReqxS	<= '0';
			Countdown		<= '0';
			
			StatexDN <= StatexDP;
			
			case StatexDP is
				when idle =>
					if DataInReqxSI = '1' then
						InRegEnxS <= '1';
						StatexDN <= new_data;
					end if;
					
				when new_data =>
		
						Countdown <= '1';
						RamWriteEnxSO <= '1';
						RamWriteEnxSE <= '1';
						DataInAckxSO <= '1';
						RamWritexSO <= Odd;
						RamWritexSE <= Even;
						
					if wala = "111111111111" then	
						StatexDN <= run;
					end if;
				when run =>
					CounterIncxS <= '1';
					if CounterxDPE = "111111111111" then
						OutRegEnxS <= '1';
						OffsetxDecxS <= '1';
						StatexDN <= data_out;
					end if;
					
				when data_out =>
					DataOutReqxSO <= '1';
					if DataOutAckxSI = '1' then
						StatexDN <= idle;
					end if;
				
				when others => null;
			end case;
			end process p_fsm;
			
p_clk: process(ClkxCI, ResetxRBI)
			begin
				if ResetxRBI = '0' then
					StatexDP <= idle;
				elsif ClkxCI'event and ClkxCI = '1' then
					StatexDP <= StatexDN;
				end if;
			end process p_clk;

i_LUT_Odd : LUT_Odd
			
			generic map (
				width => 12 ,
				aw	  => 12 )
				
			port map (
				AddrxDIO => LutAddrxDO,
				DataxDOO => LutReadxDO);

i_LUT_Even : LUT_Even
			
			generic map (
				width => 12,
				aw	  => 12)
				
			port map (
				AddrxDIE => LutAddrxDE,
				DataxDOE => LutReadxDE);

i_RAM_Odd : RAM_Odd

			generic map (
				width => 24,
				aw	  => 12)
				
			port map (
				AddrxDIO => RamAddrxDO,
				WExSIO	 => RamWriteEnxSO,
				EnxSIO	 => RamWritexSO,
				WClkxCI	 => ClkxCI,
				DinxDIO	 => InRegxDP,
				DoutxDOO => RamReadxDO);

i_RAM_Even : RAM_Even

			generic map (
				width => 24,
				aw	  => 12)
				
			port map (
				AddrxDIE => RamAddrxDE,
				WExSIE	 => RamWriteEnxSE,
				EnxSIE	 => RamWritexSE,
				WClkxCI	 => ClkxCI,
				DinxDIE	 => InRegxDP,
				DoutxDOE => RamReadxDE);
								
end rtl; 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -