Beruflich Dokumente
Kultur Dokumente
TO OUR
BELOVED PARENTS
ABSTRACT
ABSTRACT
rate (BER) for odd bit QAM using symmetry properties of Gray code is
Like all modulation schemes, QAM conveys data by changing some aspect of a
carrier signal, or the carrier wave, in response to a data signal. In the case of QAM,
the amplitude of two waves, 90 degrees out-of-phase with each other (in
Quadrature) are changed (modulated or keyed) to represent the data signal.
Amplitude modulating two carriers in Quadrature can be equivalently viewed as
both amplitude modulating and phase modulating a single carrier.
Phase modulation (analog PM) and phase-shift keying (digital PSK) can be
regarded as a special case of QAM, where the magnitude of the modulating signal
is a constant, with only the phase varying. This can also be extended to frequency
modulation (FM) and frequency-shift keying (FSK), for these can be regarded as a
special case of phase modulation.
2. Analog QAM:
When transmitting two signals by modulating them with QAM, the transmitted
signal will be of the form:
where I(t) and Q(t) are the modulating signals and f0 is the carrier frequency.
At the receiver, these two modulating signals can be demodulated using a coherent
demodulator. Such a receiver multiplies the received signal separately with both a
cosine and sine signal to produce the received estimates of I(t) and Q(t)
respectively. Because of the orthogonality property of the carrier signals, it is
possible to detect the modulating signals independently.
Low-pass filtering ri(t) removes the high frequency terms (containing 4πf0t),
leaving only the I(t) term. This filtered signal is unaffected by Q(t), showing that
the in-phase component can be received independently of the Quadrature
component. Similarly, we may multiply s(t) by a sine wave and then low-pass filter
to extract Q(t).
The phase of the received signal is assumed to be known accurately at the receiver.
If the demodulating phase is even a little off, it results in crosstalk between the
modulated signals. This issue of carrier synchronization at the receiver must be
handled somehow in QAM systems. The coherent demodulator needs to be exactly
in phase with the received signal, or otherwise the modulated signals cannot be
independently received. For example analog television systems transmit a burst of
the transmitting colour subcarrier after each horizontal synchronization pulse for
reference.
Analog QAM is used in NTSC and PAL television systems, where the I- and Q-
signals carry the components of chroma (colour) information. "Compatible QAM"
or C-QUAM is used in AM stereo radio to carry the stereo difference information.
where S(f), MI(f) and MQ(f) are the Fourier transforms (frequency-domain
representations) of s(t), I(t) and Q(t), respectively.
Quantized QAM:
The following picture shows the ideal structure of a QAM transmitter, with a
carrier frequency f0 and the frequency response of the transmitter's filter Ht:
First the flow of bits to be transmitted is split into two equal parts: this process
generates two independent signals to be transmitted. They are encoded separately
just like they were in an amplitude-shift keying (ASK) modulator. Then one
channel (the one "in phase") is multiplied by a cosine, while the other channel (in
"Quadrature") is multiplied by a sine. This way there is a phase of 90° between
them. They are simply added one to the other and sent through the real channel.
Where vc[n] and vs[n] are the voltages applied in response to the nth symbol to the
cosine and sine waves respectively.
Receiver:
The receiver simply performs the inverse process of the transmitter. Its ideal
structure is shown in the picture below with Hr the receive filter's frequency
response:
In practice, there is an unknown phase delay between the transmitter and receiver
that must be compensated by synchronization of the receivers local oscillator, i.e.
the sine and cosine functions in the above figure. In mobile applications, there will
often be an offset in the relative frequency as well, due to the possible presence of
a Doppler shift proportional to the relative velocity of the transmitter and receiver.
Both the phase and frequency variations introduced by the channel must be
compensated by properly tuning the sine and cosine components, which requires a
phase reference, and is typically accomplished using a Phase-Locked Loop (PLL).
Quantized QAM performance:
.
The error rates quoted here are those in additive white Gaussian noise (AWGN).
Where coordinates for constellation points are given in this article, note that they
represent a non-normalized constellation. That is, if a particular mean average
energy were required (e.g. unit average energy), the constellation would need to be
linearly scaled.
Rectangular QAM:
so
The bit-error rate depends on the bit to symbol mapping, but for and a
Gray-coded assignment -- so that we can assume each symbol error causes only
one bit error -- the bit-error rate is approximately
Since the carriers are independent, the overall bit error rate is the same as the per-
carrier error rate, just like BPSK and QPSK.
.
Interference and noise:
In moving to a higher order QAM constellation (higher data rate and mode) in
hostile RF/microwave QAM application environments, such as in broadcasting or
telecommunications, interference typically increases. Reduced noise immunity due
to constellation separation makes it difficult to achieve theoretical performance
thresholds. There are several test parameter measurements which help determine
an optimal QAM mode for a specific operating environment.
Carrier/interference ratio.
Carrier-to-noise ratio.
Threshold-to-noise ratio,
Applications:
TO
FPGA
FPGA
5. INTRODUCTION
Individually defining the many switch connections and cell logic functions
would be a daunting task. Fortunately, this task is handled by special software.
The software translates a user's schematic diagrams or textual hardware description
language code then places and routes the translated design. Most of the software
packages have hooks to allow the user to influence implementation, placement and
routing to obtain better performance and utilization of the device. Libraries of
more complex function macros (eg. adders) further simplify the design process by
providing common circuits that are already optimized for speed or area.
Short for Field-Programmable Gate Array, a type of logic chip that can be
programmed. An FPGA is similar to a PLD, but whereas PLDs are generally
limited to hundreds of gates, FPGAs support thousands of gates. They are
especially popular for prototyping integrated circuit designs. Once the design is set,
hardwired chips are produced for faster performance.
5.2 What are FPGAs?
You use a computer to describe a "logic function" that you want. You
might draw a schematic, or create a text file describing the function, doesn't matter.
The designs can run much faster than if you were to design a board with
discrete components, since everything runs within the FPGA, on its silicon die.
FPGAs loose their functionality when the power goes away (like RAM
in a computer that looses its content). You have to re-download them when power
goes back up to restore the functionality.
There are (at least) 5 companies making FPGAs in the world. The
first two (Xilinx and Altera) hold the bulk of the market.
Lattice, Actel, Quick logic are much smaller and are the "specialty shops".
5.6 Xilinx
Altera philosophy is to provide the features that most people want while
keeping their devices easy to use.
Lean and efficient devices architecture.
Powerful devices.
Lattice, Actel and Quick logic.
These companies have specialty products.
Lattice, better known for its CPLDs, have also an "instant-on" FPGA family.
INTRODUCTION TO
VLSI
6. VLSI
Therefore, the current trend of integration will also continue in the foreseeable
future. Advances in device manufacturing technology and especially the steady
reduction of minimum feature size support this trend. A minimum size of 0.25
microns was readily achieved.
Although the design process has been described in linear fashion for
simplicity, in reality there are much iteration back and forth, especially between
any to neighboring steps, and occasionally even. Remotely separated pairs.
Although top-down design flow provides and excellent process control, in
reality, there is no truly unidirectional top down design flow. Both top-down
and bottom-up approaches have to be combined. For instance, if a chip designer
defined architecture without close estimation of the corresponding chip area
then it is very likely that the resulting chip layout exceeds the area limit of the
available technology. In such a case, in order to fit the architecture into the
allowable chip area, some functions may have to be removed and the design
process must be repeated. Such changes may require significant modification of
the original requirements. Thus, it is very important to feed forward low-level
information to higher level as early as possible.
INTRODUCTION TO
VHDL
7. VHDL
7.1 INTRODUCTION
The resulting VHDL simulation models can then be used as building blocks
in larger circuits (using schematics, block diagrams or system-level VHDL
descriptions) for the purpose of simulation.
Test benches should be an integral part of any VHDL project and should be
created in tandem with other descriptions of the circuit.
One of the most compelling reasons for you to become experienced with and
knowledgeable in VHDL is its adoption as a standard in the electronic design
community. Using a standard language such as VHDL virtually guarantees that
you will not have to throw away and recapture design concepts simply because the
design entry method you have chosen is not supported in a newer generation of
design tools.
Using a standard language also means that you are more likely to be able to
take advantage of the most up-to-date design tools and that you will have access
to a knowledge base of thousands of other engineers, many of whom are solving
problems similar to your own.
7.3 FEATURE OF VHDL
Concurrent languages
Sequential languages
Net - list languages
Timing specification
Simulation languages
Test languages
Why choose to use VHDL for your design efforts? There are many likely reasons.
If you ask most VHDL tool vendors this question, the first answer you will get is,
“It will improve your productivity. “But just what does this mean? Can you really
expect to get your projects done faster using VHDL than by using your existing
design methods?
The answer is yes, but probably not the first time you use it, and only if you apply
VHDL in a structured manner, VHDL (like a structured software design language)
is most beneficial when you use a structured, top-down approach to design. Real
increases in productivity will come later, when you have climbed higher on the
VHDL learning curve and have accumulated a library of reusable VHDL
components.
Productivity increases will also occur when you begin to use VHDL to
enhance communication between team members and when you take advantage of
the more powerful tools for simulation and design verification that are available. In
addition, VHDL allows you to design at a more abstract level. Instead of focusing
on a gate-level implementation, you can address the behavioral function of the
design. How will VHDL increase your productivity? By making it easy to build
and use libraries of commonly used VHDL modules. VHDL makes design reuse
feel natural. As you discover the benefits of reusable code, you will soon find
yourself thinking of ways to write your VHDL statements in ways that make them
general purpose. Writing portable code will become an automatic reflex.
Another important reason to use VHDL is the rapid pace of development in
electronic design automation (EDA) tools and in target technologies. Using a
standard language such as VHDL can greatly improve your chances of moving into
more advanced tools (for example, from a basic low-cost simulator to a more
advanced one) without having to re-enter your circuit descriptions. Your ability to
retarget circuits to new types of device targets (for example, ASICs, FPGAs, and
complex PLDs) will also be improved by using a standard design entry method.
One more note: In the above context, the VHDL symbol <= is an assignment
operator that assigns the value on its right to the signal on its left. Any text that
follows “--” is a comment and is used for documentation only.
SOURCE CODING
TRANSMITTER SECTION:
ADDGEN:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity addgen is
port(
clk : in std_logic;
en: in std_logic;
rst: in std_logic;
addout: out std_logic_vector(1 downto 0));
end entity;
architecture addgen1 of addgen is
---signal en: std_logic;
signal addsign: std_logic_vector(1 downto 0);
begin
if(rst='0') then
addsign<= "00";
end if;
end if;
addout<= addsign;
end process;
end;
COS WAVE:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY cos_tb IS
END;
SINE WAVE:
library ieee;
Use ieee.std_logic_1164.all;
Entity halfsine is
port (
clk : in std_logic;
rst : in std_logic;
fg1 : out std_logic;
sinout1 : out std_logic_vector(7 downto 0)
);
end;
begin
process(clk,rst)
begin
if(rst='0')then
ps<=s0;
elsif(clk='1' and clk'event)then
ps<=ns;
end if;
end process;
process(ps,rst)
begin
case ps is
when s0=>
sinout1<=X"00";
fg1 <='0';
if(rst='0')then
ns <=s0;
else
ns<=s1;
end if;
when s1=>
sinout1<=X"0c";
fg1 <='0';
if(rst='0')then
ns <=s0;
else
ns<=s2;
end if;
when s2=>
sinout1<=X"18";
fg1 <='0';
if(rst='0')then
ns <=s0;
else
ns<=s3;
end if;
when s3=>
sinout1<=X"23";
fg1 <='0';
if(rst='0')then
ns <=s0;
else
ns<=s4;
end if;
when s4=>
sinout1<=X"2d";
fg1 <='0';
if(rst='0')then
ns <=s0;
else
ns<=s5;
end if;
when s5=>
sinout1<=X"35";
fg1 <='0';
if(rst='0')then
ns <=s0;
else
ns<=s6;
end if;
when s6=>
sinout1<=X"3b";
fg1 <='0';
if(rst='0')then
ns <=s0;
else
ns<=s7;
end if;
when s7=>
sinout1<=X"3e";
fg1 <='0';
if(rst='0')then
ns <=s0;
else
ns<=s8;
end if;
when s8=>
sinout1<=X"3f";
fg1 <='0';
if(rst='0')then
ns <=s0;
else
ns<=s9;
end if;
when s9=>
sinout1<=X"3e";
fg1 <='0';
if(rst='0')then
ns <=s0;
else
ns<=s10;
end if;
when s10=>
sinout1<=X"3b";
fg1 <='0';
if(rst='0')then
ns <=s0;
else
ns<=s11;
end if;
when s11=>
sinout1<=X"35";
fg1 <='0';
if(rst='0')then
ns <=s0;
else
ns<=s12;
end if;
when s12=>
sinout1<=X"2d";
fg1 <='0';
if(rst='0')then
ns <=s0;
else
ns<=s13;
end if;
when s13=>
sinout1<=X"23";
fg1 <='0';
if(rst='0')then
ns <=s0;
else
ns<=s14;
end if;
when s14=>
sinout1<=X"18";
fg1 <='0';
if(rst='0')then
ns <=s0;
else
ns<=s15;
end if;
when s15=>
sinout1<=X"0c";
fg1 <='1';
if(rst='0')then
ns <=s0;
else
ns<=s0;
end if;
end case;
end process;
end;
MUX SHIFT:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity muxshift is
port(
din : in std_logic_vector(7 downto 0);
sel : in std_logic;
muxshiftout: out std_logic_vector(7 downto 0));
end entity;
process(din, sel) is
begin
case(sel) is
when '0'=>
muxshiftout<= din;
when others=>
null;
end case;
end process;
end;
TOP:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity toptx is
port(
clk: in std_logic;
rst: in std_logic;
datain: in std_logic_vector(11 downto 0);
cs: out std_logic;
dac_data: out std_logic_vector(7 downto 0));
end entity;
--component clk_div is
--
-- port ( nreset : in std_logic; -- Reset
-- clk_in : in std_logic; -- Clock Input
-- clk_out : out std_logic);-- Clock Output
--
--end component;
component splitter is
port(
end component;
component addgen is
port(
clk : in std_logic;
rst: in std_logic;
addout: out std_logic_vector(1 downto 0);
en: in std_logic);
end component;
component sine is
port (
clk : in std_logic;
rst : in std_logic;
fg2 : out std_logic;
sinout : out std_logic_vector(7 downto 0)
);
end component;
component cos is
port (
clk : in std_logic;
rst : in std_logic;
fg4 : out std_logic;
cosout : out std_logic_vector(7 downto 0)
);
end component;
component invsin is
port (
clk : in std_logic;
rst : in std_logic;
fg6 : out std_logic;
invsinout : out std_logic_vector(7 downto 0)
);
end component;
component invcos is
port (
clk : in std_logic;
rst : in std_logic;
fg8 : out std_logic;
invcosout : out std_logic_vector(7 downto 0)
);
end component;
component mux is
port(
end component;
component muxshift is
port(
din : in std_logic_vector(7 downto 0);
sel : in std_logic;
muxshiftout: out std_logic_vector(7 downto 0));
end component;
--component dac is
-- generic ( width : integer := 8);
--
-- port ( clk_in : in std_logic;
-- nreset : in std_logic;
-- Data_in : in std_logic_vector(width-1 downto 0);
-- cs : out std_logic; -- Chip select of the DAC
-- Data : out std_logic_vector(width-1 downto 0)); -- Data for
DAC
--end component;
begin
--u1: clk_div
--
--port map(
--
-- nreset=> rst,
-- clk_in => clk,
-- clk_out=> clkmain);
--
u2: splitter
port map(
din=> datain,
sel=> addout,
shiftout=> shiftout);
u3: addgen
port map(
clk=> clk,
en=> enable,
rst=>rst,
addout=> addout);
u4: sine
port map(
clk=> clk,
rst=> rst_sin,
fg2=>fg2,
sinout=> sinout);
u5: cos
port map(
clk=> clk,
rst=> rst_cos,
fg4=> fg4,
cosout=> cosout);
u6: invsin
port map(
clk=> clk,
rst=> rst_invsin,
fg6=>fg6,
invsinout=> invsinout);
u7: invcos
port map(
clk=> clk,
rst=> rst_invcos,
fg8=> fg8,
invcosout=> invcosout);
u8: mux
port map(
sinein=> sinout,
cosin=> cosout,
invsin=> invsinout,
invcos=> invcosout,
qpskout=> qpskout,
sel=> s2);
u9: muxshift
port map(
din=>qpskout,
sel=>sig,
muxshiftout=>shiftout1);
--u10: dac
--
-- generic map ( width => 8)
--
-- port map( clk_in => clkmain,
-- nreset => rst,
-- Data_in => shiftout1,
-- cs => cs,
-- Data => temp_data);
--
end;
RECEIVER SECTION:
COMPARATOR:
Library ieee;
Use ieee.std_logic_1164.all;
Entity comparator is
port(
from_sine_full : in std_logic_vector(19 downto 0);
from_cos_full : in std_logic_vector(19 downto 0);
from_inv_sine_full : in std_logic_vector(19 downto 0);
from_inv_cos_full : in std_logic_vector(19 downto 0);
from_sine_half : in std_logic_vector(19 downto 0);
from_cos_half : in std_logic_vector(19 downto 0);
from_inv_sine_half : in std_logic_vector(19 downto 0);
from_inv_cos_half : in std_logic_vector(19 downto 0);
output : out std_logic_vector(2 downto 0)
);
End Entity;
process(from_sine_full,from_cos_full,from_inv_sine_full,from_inv_cos_full,from
_sine_half,from_cos_half,from_inv_sine_half,from_inv_cos_half)is
begin
if(from_sine_full =X"192FB")then
output <= "000";
elsif(from_sine_half= X"207DB")then
output <= "001";
elsif(from_cos_full= X"192FB")then
output <= "010";
elsif(from_cos_half= X"207DB")then
output <= "011";
elsif(from_inv_sine_full= X"192FB")then
output <= "100";
elsif(from_inv_sine_half= X"207DB")then
output <= "101";
elsif(from_inv_cos_full= X"192FB")then
output <= "110";
elsif(from_inv_cos_half= X"207DB")then
output <= "111";
end if;
end process;
end architecture;
MULTIPLIER:
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_unsigned.all;
Entity multiplier is
port(
ip_sample : in std_logic_vector(63 downto 0);
op_sine_full : out std_logic_vector(19 downto 0);
op_Inv_sine_full : out std_logic_vector(19 downto 0);
op_cos_full : out std_logic_vector(19 downto 0);
op_Inv_cos_full : out std_logic_vector(19 downto 0);
op_sine_half : out std_logic_vector(19 downto 0);
op_Inv_sine_half : out std_logic_vector(19 downto 0);
op_cos_half : out std_logic_vector(19 downto 0);
op_Inv_cos_half : out std_logic_vector(19 downto 0)
);
End Entity;
begin
process(ip_sample)is
begin
end process;
process(inter1,inter2,inter3,inter4,inter5,inter6,inter7,inter8)is
begin
op_sine_full <=("0000"&inter1)+("0000"&inter2)+("0000"&inter3)+
("0000"&inter4)+("0000"&inter5)+("0000"&inter6)+("0000"&inter7)+
("0000"&inter8);
end process;
process(ip_sample)is
begin
end process;
process(inter_cos1,inter_cos2,inter_cos3,inter_cos4,inter_cos5,inter_cos6,inter_co
s7,inter_cos8)is
begin
process(ip_sample)is
begin
end process;
process(inter_inv_sine1,inter_inv_sine2,inter_inv_sine3,inter_inv_sine4,inter_inv_
sine5,inter_inv_sine6,inter_inv_sine7,inter_inv_sine8)
begin
op_inv_sine_full <= ("0000"&inter_inv_sine1)+("0000"&inter_inv_sine2)+
("0000"&inter_inv_sine3)+("0000"&inter_inv_sine4)+("0000"&inter_inv_sine5)+
("0000"&inter_inv_sine6)+("0000"&inter_inv_sine7)+("0000"&inter_inv_sine8);
end process;
end process;
process(inter_inv_cos1,inter_inv_cos2,inter_inv_cos3,inter_inv_cos4,inter_inv_co
s5,inter_inv_cos6,inter_inv_cos7,inter_inv_cos8)
begin
process(ip_sample)is
begin
end process;
process(inter1_half,inter2_half,inter3_half,inter4_half,inter5_half,inter6_half,inter
7_half,inter8_half)is
begin
op_sine_half <=("0000"&inter1_half)+("0000"&inter2_half)+
("0000"&inter3_half)+("0000"&inter4_half)+("0000"&inter5_half)+
("0000"&inter6_half)+("0000"&inter7_half)+("0000"&inter8_half);
end process;
process(ip_sample)is
begin
end process;
process(inter_cos1_half,inter_cos2_half,inter_cos3_half,inter_cos4_half,inter_cos5
_half,inter_cos6_half,inter_cos7_half,inter_cos8_half)is
begin
end process;
process(inter_inv_sine1_half,inter_inv_sine2_half,inter_inv_sine3_half,inter_inv_s
ine4_half,inter_inv_sine5_half,inter_inv_sine6_half,inter_inv_sine7_half,inter_inv
_sine8_half)
begin
process(inter_inv_cos1_half,inter_inv_cos2_half,inter_inv_cos3_half,inter_inv_co
s4_half,inter_inv_cos5_half,inter_inv_cos6_half,inter_inv_cos7_half,inter_inv_cos
8_half)
begin
end architecture;
ADC:
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_unsigned.all;
Entity from_adc is
port(
clk : in std_logic;
rst : in std_logic;
sample : out std_logic_vector(63 downto 0)
);
End entity;
begin
process(clk,rst)is
variable cnt :integer;
begin
if(rst='0')then
sample <= (others =>'Z');
cnt := -1;
if(cnt /= 3)then
cnt := cnt + 1;
else
cnt := cnt;
end if;
end if;
count <= cnt;
end process;
process(count,sample_store)is
begin
case count is
end case;
end process;
end architecture;
SIMULATION
OUTPUT
BIBILOGRAPHY
Digital system design using VHDL by Charles Roth.
www.xilinx.com
www.fpga4fun.com
www.vlsi.ee.upatras.com
www.science101.com