当前位置:文档之家› 方波发生器实验报告

方波发生器实验报告

方波发生器及其调制
一、实验内容
设计一方波信号发生器,采用ROM进行一个周期数据存储,并通过地址发生器产生方波信号。

并通过控制端输入a对方波信号进行调幅和调频。

ROM(4位地址16位数据)
二、实验原理
方波信号发生器是由地址发生器和方波数据存储器ROM两块构成,输入为时钟脉冲,输出为8位二进制。

1地址发生器的原理
地址发生器实质上就是计数器,ROM 的地址是4位数据,相当于16位循环计数器。

2.只读存储器ROM 的设计
(1)、VHDL 编程的实现
①基本原理:为每一个存储单元编写一个地址,只有地址指定的存储单元才能与公共的I/O 相连,然后进行存储数据的读写操作。

②逻辑功能:地址信号的选择下,从指定存储单元中读取相应数据。

3.调幅与调频
通过输入信号a(3位数据),选择不同调制,如
a=000,2分频
a=001,4分频
a=010,8分频
a=011,16分频
a=100,2倍调幅
a=101,4倍调幅
a=110,8倍调幅
a=111,16倍调幅
分频原理:偶数分频,即分频系数N=2n (n=1,2,…),若输入的信号频率为f ,那么分频器的输出信号的频率为f/2n(n=1,2,…)。

调幅原理:通过移位寄存器改变方波幅值(左移)。

三、 设计方案
1. 基于VHDL 编程的设计
在地址信号的选择下,从指定存储单元中读取相应数据 ,系统框图如下:
FPGA
四、 原理图
1、VHDL 编程的实现
地址发生器
方波数据存储ROM 分频和调幅
(1)、顶层原理图
(2)、地址发生器的VHDL语言的实现library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity addr_count is
port
(
clk1khz: in std_logic;
qout: out integer range 0 to 15
);
end addr_count;
architecture behave of addr_count is signal temp: integer range 0 to 15;
begin
process(clk1khz)
begin
if(clk1khz'event and clk1khz='1') then
if(temp=15) then
temp<=0;
else
temp<=temp+1;
end if;
end if;
qout<=temp;
end process;
end behave;
(3)ROM的VHDL语言的实现
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity rom is
port
(
addr:in std_logic_vector(3 downto 0);
en:in std_logic;
qout:out std_logic_vector(7 downto 0)
);
end rom;
architecture behave of rom is
type memory is array(0 to 15) of std_logic_vector(7 downto 0);
constant
rom:memory:=("00000000","00000000","00000000","00000000","00000000","00000000","0000 0000","00000000",
"00000010","00000010","00000010","00000010","00000010","00000010","00000010","0000001 0");
begin
process(en,addr)
variable temp:integer range 0 to 15;
begin
if(en='1')then
temp:=conv_integer(addr);
qout<=rom(temp);
else
qout<=(others=>'Z');
end if;
end process;
end behave;
(4)调幅与调频程序
entity tiaozhi is
port(
data:in std_logic_vector(7 downto 0);
a:in std_logic_vector(2 downto 0);
clk:in std_logic;
sl_in :in std_logic;
clk1:out std_logic;
qout:out std_logic_vector(7 downto 0)
);
end tiaozhi;
architecture behave of tiaozhi is
signal count:std_logic_vector(15 downto 0); signal q1:std_logic_vector(7 downto 0); signal q2:std_logic_vector(7 downto 0); signal q3:std_logic_vector(7 downto 0); signal q4:std_logic_vector(7 downto 0); begin
process(clk,count,a,q1,q2,q3,q4)
begin
if(clk'event and clk='1') then
count<=count+1;
q1<=data(6 downto 0)& sl_in;
q2<=q1(6 downto 0) & sl_in;
q3<=q2(6 downto 0) & sl_in;
q4<=q3(6 downto 0) & sl_in;
end if;
end process;
process (a)
begin
case a is
when "000"=> clk1<=count(1);
when "001"=> clk1<=count(2);
when "010"=> clk1<=count(3);
when "011"=> clk1<=count(4);
when "100"=> qout<=q1;
when "101"=> qout<=q2;
when "110"=> qout<=q3;
when "111"=> qout<=q4;
end case;
end process;
end behave;
(5)仿真结果如下产生的方波信号
当控制端输入为100时,2倍调幅
当控制端输入为111时,16倍调幅
当控制端输入为001时,4分频
当控制端输入为011时,16分频
五设计总结
1. 评估
在这次EDA实验设计中,我们完成的是一个方波信号发生器的设计,在这次设计中,让我们了解到了ROM,地址发生器,分频和调幅的设计方法,进一步掌握了Quartus‖的常见使用方法,并掌握了方波信号发生器的设计原理,对我们来说,此次实验的收获在于数据存储器ROM的设计,我们相信,这对于以后的实验将会有很大的帮助。

此次的实验还算成功,从电路模块的设计到电路的仿真成功能独立完成,这是对自己的一次很大的鼓励,我们相信,以后的课程将会学的更好。

2.
问题:不能对信号clk进行调幅,要重新产生一个方波信号才能调幅
解决:通过循环计数器产生多电平方波,再对其进行移位,得到调幅信号。

相关主题