data2
clr result q
clk
图 5。1 频率预置与调节电路示意图
下面是程序的关键部分功能的阐述:
这个程序主要用了三个过程来实现,分别为P1,P2,P3;
p1:process(clk,clear,en,result)
begin
if(clear='1')then
q<="00000000";
elsif(clk'event and clk='1')then
if(en='1')then
q<=result;
end if;
end if;
end process p1;
P1程序部分是用于确定系统是否已清零。如果系统已清零,就把计数器置零;如果系统没有处在清零状态,那么就在时钟信号上升沿时刻,把暂存值赋值给输出。
p2: process(q,data2)
variable result9,p:unsigned(8 downto 0);
variable data1: unsigned (7 downto 0);
begin
data1:=q;
result9:=’0’data1+data2;
p:=”011111111”;
if(result9<=9)then
result<=result((7 downto 0);
else
result<=”00000000”;
flag<=not flag;
end if;
end process p2;
P2程序部分,采取了添加一个中间变量比较的方式,把中间变量和中间结果比较,这样可以防止累加过程中结果产生溢出。如果得到的数值超出范围,那么就进行清零,并把零赋值到输出端。通过这种方式,我们能够完成频率控制。
p3:process(flag)
variable i:integer;
begin
if(flag'event and flag=('1'or'0'))then
for i in 0 to 15 loop
end loop;
end if;
if (i=16)then
q<="00000000";
end if;
end process p3;
end leijia;
在完成程序编写并能够编译运行后,打开QUARTUS中FILES栏的CREAT SYMBOL FILES FOR CURRENT FILE 命令得到一个封装好的模块(如图5。2所示),这样这个模块就可以在BLOCK原理图中使用。文献综述
图5。2频率预置与调节电路模块
5。3相位累加器的实现
相位累加器的VHDL语言程序如下:
process(datapha)
variable result9:std_logic_vector(8 downto 0);
constant b:std_logic_vector:="011111111";
begin
if(clear='1')then
output<="00000000";
elsif(clear='0')then
result9:='0'&input+datapha;
if(result9>b)then
result9:=result9-b;
output<=result9(7 downto 0);
else output<=result9(7 downto 0);
end if;
end if;
end process;
process(clk)
begin
if(clk'event and clk='1')then
p<=output;
end if;
end process;
end add;
在相位累加器中,datapha为频率控制字;result1为中间暂存变量;b为引入的比较量;clear为清零端;clk为时钟端;output为最终输出结果。给清零端赋值为1时,那么系统处于清零状态,输出为0,给清零端赋值0,不断累加频率控制字,如果产生了溢出,就减去模值。不断循环,最终能够获得稳定的输出。