基于FPGA的信号发生器设计
打开Mega Wizard Plug_In Manager 初始对话框, 选择Create a new custom… 项。单击Next 按钮后,选择Storage 项下的LPM_ROM, 再选择ACEX1K 器件和VHDL 语言方式;最后输入ROM 文件存放的路径和文件名:F:sing_gntdata_rom (定制的ROM 元件文件名),单击Next 按钮,选择ROM 控制线、地址线和数据线。这里选择地址线位宽和ROM 中数据数分别为6 和64; 选择地址锁存控制信号inclock。
对于地址信号发生器的设计。方法一:用VHDL 语言设计6 位计数器,产生其元件符号;方法二:仍采用LPM 定制的方法。
1.3 完成顶层设计
按图3 画出顶层原理图,然后进行编译,波形仿真如图4所示。
图3 简易正弦信号发生器顶层电路设计
图4 当前工程仿真波形输出
对当前设计通过执行Quartus II 的命令Create ∠ Update/ Create Symbol Files for Current File,可以为设计电路建立一个元件符号,以便被顶层设计多功能信号发生器所调用。
2 其他信号部分原程序
其他各信号发生器可参照正弦信号发生器的设计方法设计或直接采用VHDL 硬件描述语言进行设计。
LIBRARY IEEE;--递增锯齿波的设计
USE IEEE.STD LOGIC 1164.ALL;
USE IEEE.STD LOGIC UNSIGNED.ALL;
ENTITY signal2 IS --递增锯齿波signal1
PORT(clk,reset:IN std_logic;--复位信号reset, 时钟信号clk
q:OUT std_logic_vector (7 DOWNTO 0));--输出信号q
END signal2;
ARCHITECTURE b OF signal2 IS
BEGIN
PROCESS(clk,reset)
VARIABLE tmp:std_logic_vector(7 DOWNTO 0);
BEGIN
IF reset='0' THEN
tmp:=00000000;
ELSIT rising_ege(clk)THEN
IF tmp=11111111THEN
tmp:=00000000;
ELSE
tmp:=tmp+1; --递增信号的变化
END IF;
END IF;
q=tmp:
END PROCESS;
END b;
LIBRARY IEEE;--方波的设计
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
entity signal5 is --方波signal5
PORT(clk,reset:in std_logic; --复位信号reset,时钟信号clk
q:out std_logic_vector (7 DOWNTO 0)); --输出信号q,8 位数字信号
END signal5;
ARCHITEECTURE a OF signal5 IS
SIGNAL; a:std_logic;
BEGIN
PROCESS(clk,reset)
YARIABLE tmp:std_logic_vector(7 downto 0);
BEQIN
IF reset='0' then
a='0';
elsif rising_edge(clk)THEN
IF tmp=11111111 THEN
tmp:=00000000;
ELSE
tmp:=tmp+1;
END IF;
if tmp=10000000 then
a='1';
else
a='0';
END IF;
END IF;
END PROCESS;
PROCESS(clk,a)
BEGIN
IF rising_edge(clk)THEN
IF a='1' THEN
q=11111111;
ELSE
q=00000000;
END IF;
END IF;
END PROCESS;
END a;
3 顶层电路的设计
将上述6 个模块生成符号,供顶层电路调用。这些模块分别是:递减锯齿波信号产生模块signall、递增锯齿波信号产生模块signal2、三角波信号产生模块signal3、阶梯波信号产生模块signal4、方波信号产生模块signal5 和数据选择器mux51。顶层电路的连接如图5 所示。
图5 信号发生器顶层电路
评论