基于可编程逻辑器件的dds设计_毕业设计论文任务书(编辑修改稿)内容摘要:

比, VHDL 具有更强的行为描述能力,从而决定了它成为系统设计领域最佳的硬件描述语言。 强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证。 就目前流行的 EDA 工具和 VHDL 综合器而言,将基于抽象的行为描述风格的 VHDL 程序综合成为具体的 FPGA 和 CPLD 等目标器件的网表文件己不成问题。 频率控制 频率控制用于对基准频率的改变 ,以控制 DDS 发生信号的频率。 为了更直观的看到当前频率 ,本文 采用 直接 采集频率输 出 到数码管显示。 频率控制原理 当基准 频率输入时 ,分频器实现了频率的变化 ,以下 程序 实现了基准频率的 116 分频。 频率的变化由外围的四个按键开关控制 ,当按键值为 00001111(按键按下为 1) ,可实现基准频率的 116 分频。 具体实现程序 如下 : LIBRARY IEEE。 USE。 USE。 ENTITY fenpinqi is PORT ( iclk : IN STD_LOGIC。 key:IN STD_LOGIC_VECTOR(3 DOWNTO 0)。 oclk : OUT STD_LOGIC)。 END fenpinqi。 ARCHITECTURE one OF fenpinqi IS signal clk_i :std_logic。 SIGNAL count :STD_LOGIC_VECTOR(3 DOWNTO 0)。 BEGIN PROCESS (iclk) BEGIN IF iclk39。 EVENT AND iclk=39。 139。 THEN IF count =key THEN count =0000。 clk_i= not clk_i。 ELSE count = count +1。 END IF。 END IF。 END PROCESS。 oclk= clk_i。 END one。 生成的模块如图 41: 13 图 41 注 : ICLK;输入基准频率, OCLK: 输出频率, KEY:按键控制分频,为四位二进制数。 仿真 的时序图 如图 : 图 42 说明:当按键显示为 0001 时,输出频率是基准频率的二分之一, 实现二分频。 当为 0010时,频率为基准的三分之一,实现三分频。 以此按键就能实现分频了, 直至十六分频 为止。 频率采集原理 为了采集即时频率 ,本文 专门产生一个秒信号 ,用来计录 脉冲个数。 脉冲计数用八 位十进制计数器 ,计数器在 START 置一时, 秒信号的计数脉冲数清零同时计数器清零 ,当 STARE置零时秒信号与计数器同时开始工 作。 当一秒时间到时 ( STOP 为 1 ) 计数器把数据送出去以供显示。 具体实现程序如下 , 频率采集 程序: library ieee。 use。 use。 entity selec is port( num1,num2,num3,num4,num5,num6,num7,num8:out std_logic_vector(3 downto 0)。 stop:in std_logic。 start: in std_logic。 reset: in std_logic。 clk:in std_logic)。 14 end selec。 architecture dacc of selec is signal q1,q2,q3,q4,q5,q6,q7,q8: std_logic_vector(3 downto 0)。 signal tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8: std_logic_vector(3 downto 0)。 begin process(clk,start,reset) begin if start=39。 139。 or reset = 39。 139。 then q1=0000。 q2=0000。 q3=0000。 q4=0000。 q5=0000。 q6=0000。 q7=0000。 elsif clk39。 event and clk=39。 139。 then if q1=1001 then q1=0000。 if q2=1001 then q2=0000。 if q3=1001 then q3=0000。 if q4=1001 then q4=0000。 if q5=1001 then q5=0000。 if q6=1001 then q6=0000。 if q7=1001 then q7=0000。 if q8=1001 then q8=0000。 else q8=q8+1。 end if。 else q7=q7+1。 end if。 else q6=q6+1。 end if。 else q5=q5+1。 end if。 else q4=q4+1。 end if。 else q3=q3+1。 end if。 else q2=q2+1。 end if。 else q1=q1+1。 end if。 end if。 end process。 process(stop) begin if stop=39。 139。 then tem1=q1。 tem2=q2。 tem3=q3。 tem4=q4。 tem5=q5。 tem6=q6。 tem7=q7。 tem8=q8。 end if。 end process。 num1=tem1。 num2=tem2。 num3=tem3。 num4=tem4。 num5=tem5。 num6=tem6。 num7=tem7。 num8=tem8。 end dacc。 程序说明:当 reset 或 start 为 1 时,计数器 q1q8 清零,然后开始计数,当秒信号计数结束标志位 stop 为 1 时停止计数,此时把当前的计数值保存到寄存器中,以备显示用。 秒信号产生程序: use library ieee。 15 use。 use。 entity second is port( clk : in std_logic。 start : in std_logic。 reset :in std_logic。 stop : out std_logic)。 end second。 architecture dacc of second is signal q: integer range 0 to 100。 signal tem: std_logic。 begin process(clk,reset,start) begin if (reset=39。 139。 )or(reset=39。 039。 and start=39。 139。 ) then q=0。 elsif clk39。 event and clk=39。 139。 then if q=100 then tem=39。 139。 else q=q+1。 tem=39。 039。 end if。 end if。 end process。 stop=tem。 end architecture。 程序说明: reset 为复位信号, start 为另一次秒信号的开始标志。 当 reset 为 1 或者当 start为 1 时计数信号清零。 开始秒信号的计数,当计数个数到达预定的 100 时使 stop(秒结束标志位)信号置 1。 再重新开始计数。 程序生成模块 下图所示 43: 生成的 频率采集模块: 生成的 秒信号模块: 图 43 频率采集模块时序仿真图 如图 44: 16 图 44 A 说明 : 由图可知, 当 stop 置 1 时, num1 至 num8 就会把脉冲个数送 进寄存器,而当 stop为 0 时,内部计数, 此时寄存器内保存的是上一个秒内的计数值。 秒信号 时序仿真图 如图 45: 图 44B 分析 :上图显示的是 reset(复位信号 )为 1 时, q(计数信号 )清零,即重新开始计数。 直到 reset或 start 为 1 停止计数。 17 图 44C 说明: stop 信号为秒计数结束信号,置 1 时,表示计时到,当计数信号计数到预定个数(根据基准频率而定) ,此仿真图为了检测程序的正确,以 1100011 为例进行仿真,stop 信号值 1,此时应该使 记当前频率时钟脉冲个数的计数器停止计数。 并采集当前计数 值。 图 44D 说明: 当 start 信号为 1 时,开始下一秒的计数,并重新开始采集频率个数。 数码显示数据处理 数码显示 的数据为采集的频率值。 采集的是十进制数 ,所以需要把它们转换成段显信号。 由于 设计 中采用了闪烁点亮 二极管的方式 ,所以还需要对位选进行处理。 数码位选信号 数码位选信号是用 对当前工作数码管与当前显示数据进行选择 ,由于本文 采用八位数码管 ,所以需要产生三位二进制数。 具体实现程序如下 : library ieee。 use。 use。 entity regist is port( num1,num2,num3,num4,num5,num6,num7,num8:in std_logic_vector(3 downto 0)。 start: out std_logic。 stop: in std_logic。 numb:out std_logic_vector(3 downto 0)。 sec:in std_logic_vector(2 downto 0))。 end。 architecture dacc of regist is signal temp: std_logic_vector(3 downto 0)。 signal tem: std_logic。 begin process(sec,stop) 18 begin if stop = 39。 139。 then tem=39。 139。 case sec is when 000 =temp=num1。 when 001 =temp=num2。 when 010 =temp=num3。 when 011 =temp=num4。 when 100 =temp=num5。 when 101 =temp=num6。 when 110 =temp=num7。 when 111 =temp=num8。 when others=null。 end case。 else temp=0000。 tem=39。 039。 end if。 end process。 numb=temp。 start=tem。 end dacc。 生成模块 如图 45: 图 45 时序 仿真结果如图 46 所示。 图 46 说明:随着脉冲的到来,可以实现位选信号 sec 从 0 到 7 的变化, sec 的变化经译码器可产生只有一位为零的低电平信号。 译码 19 由于我们采集的频率值为十进制 数所以我们需要把十进制数转换为二进制段显信号。 具体转换见程序如下所示:。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。