Guest
Hello folks,
In my entity i am getting serial-bit input and my expected output shld
hve odd bit at one port and even bit at other port. the clk for input
is twice as compared to output data rate(eg.Input clk:X Mhz,Output clk:
X/2 Mhz). I wrote the code but i am not getting the result as expected
Initally in the waveform (for first cycle with reference to input clk).
can anybody tell me where i went wrong ?
Thanks in advance,
ALI
CODE FOR SERIAL-BIT TO 2-BIT PARALLEL
------------------------------------------------------------------
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.NUMERIC_STD.ALL;
ENTITY STOP IS
PORT
(
CLK_A : IN STD_LOGIC;
CLK_B : IN STD_LOGIC;
RST : IN STD_LOGIC;
EN_STOP : IN STD_LOGIC;
S_IN : IN STD_LOGIC;
I_CHAN : OUT STD_LOGIC;
Q_CHAN : OUT STD_LOGIC
);
END STOP;
-------------------------------------------------------------------
ARCHITECTURE ARCH_STOP OF STOP IS
SIGNAL I_CLK_B : STD_LOGIC;
SIGNAL Q_CLK_B : STD_LOGIC;
SIGNAL DFF_CLK_A : STD_LOGIC_VECTOR(1 DOWNTO 0);
-------------------------------------------------------------------
BEGIN
PROCESS_CLKA : PROCESS (CLK_A,RST)
BEGIN -- PROCESS_22MHZ
IF RST = '0' THEN
DFF_CLK_A <= "11";
ELSIF (CLK_A'EVENT AND CLK_A = '1') THEN
IF (EN_STOP = '0' ) THEN
DFF_CLK_A <= "11";
ELSE
DFF_CLK_A(1) <= S_IN;
DFF_CLK_A(0) <= DFF_CLK_A(1);
END IF;
END IF;
END PROCESS PROCESS_CLKA;
-----------------------------------------------------------
PROCESS_CLKB : PROCESS(CLK_B,RST)
BEGIN -- PROCESS_11MHZ
IF RST = '0' THEN
I_CLK_B <= '1';
Q_CLK_B <= '1';
ELSIF (CLK_B'EVENT AND CLK_B = '1') THEN
IF (EN_STOP = '0') THEN
I_CLK_B <= '1';
Q_CLK_B <= '1';
ELSE
I_CLK_B <= DFF_CLK_A(0);
Q_CLK_B <= DFF_CLK_A(1);
END IF;
END IF;
END PROCESS PROCESS_CLKB;
-------------------------------------------------------------------
I_CHAN <= I_CLK_B;
Q_CHAN <= Q_CLK_B;
END ARCH_STOP;
-------------------------------------------------------------------
TEST BENCH FOR THE ABOVE ENTITY:
-------------------------------------------------------------------
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.NUMERIC_STD.ALL;
-------------------------------------------------------------------
ENTITY TB_STOP IS
END TB_STOP;
-------------------------------------------------------------------
ARCHITECTURE ARCH_TB_STOP OF TB_STOP IS
-------------------------------------------------------------------
COMPONENT STOP
PORT
(
CLK_A : IN STD_LOGIC;
CLK_B : IN STD_LOGIC;
RST : IN STD_LOGIC;
EN_STOP : IN STD_LOGIC;
S_IN : IN STD_LOGIC;
I_CHAN : OUT STD_LOGIC;
Q_CHAN : OUT STD_LOGIC
);
END COMPONENT;
-------------------------------------------------------------------
SIGNAL CLK_A : STD_LOGIC := '0';
SIGNAL CLK_B : STD_LOGIC := '0';
SIGNAL RST : STD_LOGIC := '1';
SIGNAL EN_STOP : STD_LOGIC := '0';
SIGNAL S_IN : STD_LOGIC;
SIGNAL I_CHAN : STD_LOGIC;
SIGNAL Q_CHAN : STD_LOGIC;
CONSTANT INPUT : STD_LOGIC_VECTOR(31 DOWNTO 0)
:= "00110011001100110011001100110011";
-------------------------------------------------------------------
BEGIN
UUT : STOP
PORT MAP
(
CLK_A => CLK_A,
CLK_B => CLK_B,
RST => RST,
EN_STOP => EN_STOP,
S_IN => S_IN,
I_CHAN => I_CHAN,
Q_CHAN => Q_CHAN
);
--STIMULUS
CLK_A <= NOT CLK_A AFTER 4 NS;
CLK_B <= NOT CLK_B AFTER 8 NS;
RST <= '0','1' AFTER 2 NS;
EN_STOP <= '0','1' AFTER 3 NS;
DRIVE_BITROCESS
BEGIN
FOR I IN INPUT'RANGE LOOP
S_IN <= INPUT(I);
WAIT UNTIL RISING_EDGE(CLK_A);
END LOOP;
END PROCESS DRIVE_BIT;
END ARCH_TB_STOP;
-------------------------------------------------------------------
In my entity i am getting serial-bit input and my expected output shld
hve odd bit at one port and even bit at other port. the clk for input
is twice as compared to output data rate(eg.Input clk:X Mhz,Output clk:
X/2 Mhz). I wrote the code but i am not getting the result as expected
Initally in the waveform (for first cycle with reference to input clk).
can anybody tell me where i went wrong ?
Thanks in advance,
ALI
CODE FOR SERIAL-BIT TO 2-BIT PARALLEL
------------------------------------------------------------------
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.NUMERIC_STD.ALL;
ENTITY STOP IS
PORT
(
CLK_A : IN STD_LOGIC;
CLK_B : IN STD_LOGIC;
RST : IN STD_LOGIC;
EN_STOP : IN STD_LOGIC;
S_IN : IN STD_LOGIC;
I_CHAN : OUT STD_LOGIC;
Q_CHAN : OUT STD_LOGIC
);
END STOP;
-------------------------------------------------------------------
ARCHITECTURE ARCH_STOP OF STOP IS
SIGNAL I_CLK_B : STD_LOGIC;
SIGNAL Q_CLK_B : STD_LOGIC;
SIGNAL DFF_CLK_A : STD_LOGIC_VECTOR(1 DOWNTO 0);
-------------------------------------------------------------------
BEGIN
PROCESS_CLKA : PROCESS (CLK_A,RST)
BEGIN -- PROCESS_22MHZ
IF RST = '0' THEN
DFF_CLK_A <= "11";
ELSIF (CLK_A'EVENT AND CLK_A = '1') THEN
IF (EN_STOP = '0' ) THEN
DFF_CLK_A <= "11";
ELSE
DFF_CLK_A(1) <= S_IN;
DFF_CLK_A(0) <= DFF_CLK_A(1);
END IF;
END IF;
END PROCESS PROCESS_CLKA;
-----------------------------------------------------------
PROCESS_CLKB : PROCESS(CLK_B,RST)
BEGIN -- PROCESS_11MHZ
IF RST = '0' THEN
I_CLK_B <= '1';
Q_CLK_B <= '1';
ELSIF (CLK_B'EVENT AND CLK_B = '1') THEN
IF (EN_STOP = '0') THEN
I_CLK_B <= '1';
Q_CLK_B <= '1';
ELSE
I_CLK_B <= DFF_CLK_A(0);
Q_CLK_B <= DFF_CLK_A(1);
END IF;
END IF;
END PROCESS PROCESS_CLKB;
-------------------------------------------------------------------
I_CHAN <= I_CLK_B;
Q_CHAN <= Q_CLK_B;
END ARCH_STOP;
-------------------------------------------------------------------
TEST BENCH FOR THE ABOVE ENTITY:
-------------------------------------------------------------------
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.NUMERIC_STD.ALL;
-------------------------------------------------------------------
ENTITY TB_STOP IS
END TB_STOP;
-------------------------------------------------------------------
ARCHITECTURE ARCH_TB_STOP OF TB_STOP IS
-------------------------------------------------------------------
COMPONENT STOP
PORT
(
CLK_A : IN STD_LOGIC;
CLK_B : IN STD_LOGIC;
RST : IN STD_LOGIC;
EN_STOP : IN STD_LOGIC;
S_IN : IN STD_LOGIC;
I_CHAN : OUT STD_LOGIC;
Q_CHAN : OUT STD_LOGIC
);
END COMPONENT;
-------------------------------------------------------------------
SIGNAL CLK_A : STD_LOGIC := '0';
SIGNAL CLK_B : STD_LOGIC := '0';
SIGNAL RST : STD_LOGIC := '1';
SIGNAL EN_STOP : STD_LOGIC := '0';
SIGNAL S_IN : STD_LOGIC;
SIGNAL I_CHAN : STD_LOGIC;
SIGNAL Q_CHAN : STD_LOGIC;
CONSTANT INPUT : STD_LOGIC_VECTOR(31 DOWNTO 0)
:= "00110011001100110011001100110011";
-------------------------------------------------------------------
BEGIN
UUT : STOP
PORT MAP
(
CLK_A => CLK_A,
CLK_B => CLK_B,
RST => RST,
EN_STOP => EN_STOP,
S_IN => S_IN,
I_CHAN => I_CHAN,
Q_CHAN => Q_CHAN
);
--STIMULUS
CLK_A <= NOT CLK_A AFTER 4 NS;
CLK_B <= NOT CLK_B AFTER 8 NS;
RST <= '0','1' AFTER 2 NS;
EN_STOP <= '0','1' AFTER 3 NS;
DRIVE_BITROCESS
BEGIN
FOR I IN INPUT'RANGE LOOP
S_IN <= INPUT(I);
WAIT UNTIL RISING_EDGE(CLK_A);
END LOOP;
END PROCESS DRIVE_BIT;
END ARCH_TB_STOP;
-------------------------------------------------------------------