方波发生器实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
方波发生器及其调制
一、实验内容
设计一方波信号发生器,采用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