当前位置:文档之家› VHDL课程设计_函数信号发生器

VHDL课程设计_函数信号发生器

VHDL课程设计_函数信号发生器
VHDL课程设计_函数信号发生器

学生姓名:

学号:

专业:

年级班级:

课程名称: 可编程数字系统设计

实验项目: VHDL设计一信号发生器

试验时间: 2014年5月24日

指导老师:

一、实验目的:

熟悉EDA工具,掌握用VHDL语言进行数字系统设计的基本方法和流程,提高工程实践能力

二、设计任务

设计信号发生器,用VHDL语言描述,用QuartusII工具编译和综合,并在实验板上调试并实现所要求功能和技术指标,撰写实验报告,最后提交验收并答辩。

题目一:设计正弦波发生器

题目二:设计锯齿波发生器

题目三:设计三角波发生器

三、功能要求与技术指标

基本功能:

(1 )模拟输出:由于FPGA上无D/A转换模块,因此设计中必须包含PWM发生模块,PWM输出后经过RC低通波电路转换为电压幅值正比于占空比的模拟电压。滤波电路需自行设计。

(2)可以通过按键设定波形的频率,频率可以显示在数码管上。

(3)按钮开关输入须消抖处理。

在完成以上功能的前提下,可增加其它一些实用的功能。

要求:

1、每个同学必须完成基本功能,在完成基本功能的前提下可自由发挥。

2、实验报告主要内容包含:设计原理、系统分析、程序设计、仿真/实验结果(例如波形图和实验板运行时的照片)、结论或分析、使用说明等,在最后附上主要源程序。

3、程序代码结构清晰,可读性强,关键语句应注释。

四、设计原理:

原理图:

原理图(PS:RESTA按键已被删除)NMUA 计数键数码管模块

1、利用ROM、数组或使用CASE语句将计算的正弦波采样的占空比数据存储。由分频器将FPGA上的晶振进行分频所得的时钟信号作为计数时钟。最后进行利用比较的方式得到占空比可调的脉冲波。同时,分频器的分频系数可由键盘和数码管配合的显示数值进行运算反馈回PWM模块,达到频率可调的目的。此外,另设一输出接至LED2,无法测量波形的情况下,利用呼吸灯的效果可检测PWM模块的完成与频率可调的成功性。

2、键盘设移位复位键,数码管计数键与频率传送键。同时设立消抖计数值,当按键按下以后进行计数,在按键退出后,停止计数,取最后一次计数作为按键信号完成按键消抖。按下移位复位键,数码管位选下一位,同时示数复位清零,并且循环移位,当按完4次按键后,数码管全部清零。按下数码管计数键,数码管计数,按一次计一次,采用十进制循环计数。按下频率传送键,将数码管所显示的数值作为频率传送到PWM 模块,设频率理论值范围10hz~99990hz。

3、用于按键显示的数码管计数的计数采用十进制。设定的计数值由四位数码管动态显示,并且被设定的位选数码管‘.’点亮,表明该数码管被选中。同时通电后,需利用移位复位功能将数码管清零。

五、系统分析:

1、根据原理图与原理框图:系统电路可分成4个主干模块:PWM模块、按键消抖模块、按键设定模块、数码管模块。

PWM:通过对正弦波采样存储并利用时钟分频再进行比较获得PWM波,同时分频系数由按键与数码管陪和共同反馈运算结果进行分频。

按键消抖:按键按下是会产生不稳定,设定何时的计数时间,再取按键拔起后获得的最后一次计数作为按键信号。

按键设定:按键计数,按下后数码管进行计数。移位复位,按下后数码管位选再移位与复位下一位数码管。频率传送,将数码管示数作为频率传送到PWM模块。

数码管:动态扫描,频率值显示在数码管上。

2、说明:数码管显示不稳定,使用前先用移位复位键将示数清零。测

六、程序设计:

LIBRARY IEEE;

USE IEEE. STD_LOGIC_1164.ALL;

USE IEEE. STD_LOGIC_UNSIGNED.ALL;

USE IEEE.NUMERIC_STD.ALL;

ENTITY zxb_mao IS

PORT( CLK :IN STD_LOGIC;

RIGHTA :IN STD_LOGIC;--右移输入键

CNTFILT :IN STD_LOGIC;--频率选择键

RESTA :IN STD_LOGIC;--复位输入键

NUMA :IN STD_LOGIC;--按键计数输入键

PWM :OUT STD_LOGIC;

PWM_LED :OUT STD_LOGIC;--LED亮灯

SMG :OUT STD_LOGIC_VECTOR (7 DOWNTO 0); --数码管的段数据

DEN :OUT STD_LOGIC_VECTOR (3 DOWNTO 0));

--数码管的选通信号

END zxb_mao;

ARCHITECTURE syn OF zxb_mao IS

signal a,b,c,d :integer range 0 to 9;--输入数

signal cnt :integer range 0 to 50000000;--调频频信号

signal num :integer range 0 to 9; --数码管显示计数

signal num_1 :integer range 0 to 3; --数码管位移数

signal count :integer range 0 to 50000000; --晶振分频计数

signal count_key :integer range 0 to 2499;--键盘扫描分频

signal clkcnt :std_logic; --可调分频时钟

signal cout1 :integer range 0 to 255;

signal COM :integer range 0 to 255;--采样数据

signal tmp :std_logic_vector(5 downto 0);

signal key1filt : std_logic; --按键NUMA消抖后得到的信号

signal key1cnt : integer range 0 to 50000000; --用于对NUMA按键输入有效时间进行计数

signal key2filt : std_logic; --按键RIGHTA消抖后得到的信号

signal key2cnt : Integer range 0 to 50000000; --用于对RIGHT_按键输入有效时间进行计数

signal key3filt : std_logic; --按键CNTFILT消抖后得到的信号

signal key3cnt : integer range 0 to 50000000; --用于对LIFT_按键输入有效时间进行计数

signal count1 :integer range 0 to 500000000;

signal cout2 :std_logic_vector(3 downto 0);

signal clk1hz :std_logic;

signal clk100khz :std_logic;

BEGIN

--------------------------------- --PWM模块

PROCESS(CLK)

variable tmp :integer; --时钟分频实现频率可调BEGIN

tmp:=tmp;

IF rISing_edge(CLK) THEN

IF count=cnt then

count<=0;

CLKCNT<='1';

ELSE

count<=count+1;

CLKCNT<='0';

END IF;

END IF;

END PROCESS;

PROCESS(CLKCNT)

BEGIN

IF rISing_edge(CLKCNT) THEN

IF cout1=255 THEN

cout1<=0;

tmp<=tmp+1;

IF tmp="111111" then

tmp<="000000";

END IF;

ELSE

cout1<=cout1+1;

END IF;

END IF;

END PROCESS;

process(tmp) --正弦波数据采样存储

begin

case conv_integer(tmp) is

when 00=>COM<=255; when 01=>COM<=254; when 02=>COM<=252; when 03=>COM<=249;

when 04=>COM<=245; when 05=>COM<=239; when 06=>COM<=233; when

07=>COM<=225;

when 08=>COM<=217; when 09=>COM<=207; when 10=>COM<=197; when

11=>COM<=186;

when 12=>COM<=174; when 13=>COM<=162; when 14=>COM<=150; when

15=>COM<=137;

when 16=>COM<=124; when 17=>COM<=112; when 18=>COM<=99; when

19=>COM<=87;

when 20=>COM<=75; when 21=>COM<=64; when 22=>COM<=53; when

23=>COM<=43;

when 24=>COM<=34; when 25=>COM<=26; when 26=>COM<=19; when

27=>COM<=13;

when 28=>COM<=8; when 29=>COM<=4; when 30=>COM<=1; when

31=>COM<=0;

when 63=>COM<=255; when 62=>COM<=254; when 61=>COM<=252; when

60=>COM<=249;

when 59=>COM<=245; when 58=>COM<=239; when 57=>COM<=233; when

56=>COM<=225;

when 55=>COM<=217; when 54=>COM<=207; when 53=>COM<=197; when

52=>COM<=186;

when 51=>COM<=174; when 50=>COM<=162; when 49=>COM<=150; when

48=>COM<=137;

when 47=>COM<=124; when 46=>COM<=112; when 45=>COM<= 99; when

44=>COM<=87;

when 43=>COM<=75; when 42=>COM<=64; when 41=>COM<= 53; when

40=>COM<=43;

when 39=>COM<=34; when 38=>COM<=26; when 37=>COM<= 19; when

36=>COM<=13;

when 35=>COM<=8; when 34=>COM<=4; when 33=>COM<= 1; when

32=>COM<=0;

when others=>null;

end case;

END PROCESS;

PROCESS(CLK)

BEGIN

IF rISing_edge(CLK) THEN

IF cout1 > COM THEN --比较计数采样PWM

PWM <='0';

PWM_LED <='0'; --LED实现PWM检测

ELSE

PWM <='1';

PWM_LED <='1'; --LED实现PWM检测

END IF;

END IF;

END PROCESS;

---------------------------------- --按键消抖模块

PROCESS (NUMA)--NUMA按键消抖

constant N :integer := 5000000; --消抖时间,对于50Mhz的基准时钟,这相当于0.1S BEGIN

IF CLK'event and CLK = '1' THEN

IF NUMA = '0' THEN --当key1 输入低电平,即按键按下

IF key1cnt /= N THEN --一直计数到N

key1cnt <= key1cnt + 1;

END IF;

IF key1cnt = N-1 THEN --最后一个计数时输出key1filt脉冲

key1filt <= '1';

ELSE

key1filt <= '0';

END IF;

ELSE --若key1 输入高电平,表明按键被释放

key1cnt <= 0;

END IF;

END IF;

END PROCESS;

PROCESS (RIGHTA) --RIGHTA按键消抖

constant N :integer := 5000000;

BEGIN

IF CLK'event and CLK = '1' THEN

IF RIGHTA= '0' THEN

IF key2cnt /= N THEN

key2cnt <= key2cnt + 1;

END IF;

IF key2cnt = N-1 THEN

key2filt <= '1';

ELSE

key2filt <= '0';

END IF;

ELSE

key2cnt <= 0;

END IF;

END IF;

END PROCESS;

PROCESS (CNTFILT) --CNTFILT按键消抖constant N :integer := 5000000;

BEGIN

IF CLK'event and CLK = '1' THEN

IF CNTFILT = '0' THEN

IF key3cnt /= N THEN

key3cnt <= key3cnt + 1;

END IF;

IF key3cnt = N-1 THEN

key3filt <= '1';

ELSE

key3filt <= '0';

END IF;

ELSE

key3cnt <= 0;

END IF;

END IF;

END PROCESS;

---------------------------------- --四进制计数移动模块RIGHTA PROCESS (key2filt)

BEGIN

IF (key2filt='1') THEN --按键RIGHTA经消抖处理后

IF num_1 = 3 THEN

num_1 <= 0;

ELSE

num_1 <= num_1 + 1;

END IF;

END IF;

END PROCESS;

-------------------------------------- --十进制计数模块NUMA,RIGHT_,LIFT_ PROCESS(CLK)

BEGIN

IF rISing_edge(CLK) THEN

IF count_key=249 THEN

count_key<=0;

clk100khz<='1';

ELSE

count_key<=count_key+1;

clk100khz<='0';

END IF;

END IF;

END PROCESS;

PROCESS (clk100khz,key1filt,key2filt)

BEGIN

IF CLK'event and CLK = '1' THEN

IF key2filt='1'THEN --复位与移位复位

num <= 0 after 50ns;

ELSE

IF (key1filt = '1') THEN --按键NUMA 经消抖处理后

IF num = 9 THEN

num <= 0;

ELSE

num <= num + 1;

END IF;

END IF;

END IF;

END IF;

END PROCESS;

------------------------------------- --输入寄存模块

PROCESS(num,num_1)

BEGIN

CASE num_1 IS

WHEN 0 => a <= num;

WHEN 1 => b <= num;

WHEN 2 => c <= num;

WHEN 3 => d <= num;

WHEN others =>NULL;

END CASE;

END PROCESS;

---------------------------------------------- --按键选定频率模块

PROCESS(key3filt)

BEGIN

IF key3filt='1'THEN

cnt <= 50000000/(((a*1000+1)+(b*100+1)+(c*10+1)+(d*1+1))*256*64); --实现频率可调

END IF;

END PROCESS;

---------------------------------------------- --数码管动态扫描频率及显示模块

PROCESS(CLK)

BEGIN

IF rISing_edge(CLK) THEN

IF count1=24999 THEN

count1<=0;

clk1hz<='1';

ELSE

count1<=count1+1;

clk1hz<='0';

END IF;

END IF;

END PROCESS;

PROCESS(clk1hz)

BEGIN

IF rISing_edge(clk1hz) THEN

IF cout2="1000" THEN

cout2<="0000";

ELSE

cout2<=cout2+1;

END IF;

END IF;

END PROCESS;

PROCESS(clk1hz)

BEGIN

IF cout2="0000" THEN

DEN<="0111";

CASE a IS

WHEN 0 => SMG <= "11000000"; -- 0

WHEN 1 => SMG <= "11111001"; -- 1

WHEN 2 => SMG <= "10100100"; -- 2

WHEN 3 => SMG <= "10110000"; -- 3

WHEN 4 => SMG <= "10011001"; -- 4

WHEN 5 => SMG <= "10010010"; -- 5

WHEN 6 => SMG <= "10000010"; -- 6

WHEN 7 => SMG <= "11111000"; -- 7

WHEN 8 => SMG <= "10000000"; -- 8

WHEN 9 => SMG <= "10010000"; -- 9

WHEN others =>NULL;

END CASE;

END IF;

IF num_1=0 and cout2="0001" THEN

SMG<="01111111";

DEN<="0111";

END IF;

IF cout2="0010" THEN

DEN<="1011";

CASE b IS

WHEN 0 => SMG <= "11000000"; -- 0

WHEN 1 => SMG <= "11111001"; -- 1

WHEN 2 => SMG <= "10100100"; -- 2

WHEN 3 => SMG <= "10110000"; -- 3

WHEN 4 => SMG <= "10011001"; -- 4

WHEN 5 => SMG <= "10010010"; -- 5

WHEN 6 => SMG <= "10000010"; -- 6

WHEN 7 => SMG <= "11111000"; -- 7

WHEN 8 => SMG <= "10000000"; -- 8

WHEN 9 => SMG <= "10010000"; -- 9

WHEN others =>NULL;

END CASE;

END IF;

IF num_1=1 and cout2="0011" THEN

SMG<="01111111";

DEN<="1011";

END IF;

IF cout2="0100" THEN

DEN<="1101";

CASE c IS

WHEN 0 => SMG <= "11000000"; -- 0

WHEN 1 => SMG <= "11111001"; -- 1

WHEN 2 => SMG <= "10100100"; -- 2

WHEN 3 => SMG <= "10110000"; -- 3

WHEN 4 => SMG <= "10011001"; -- 4

WHEN 5 => SMG <= "10010010"; -- 5

WHEN 6 => SMG <= "10000010"; -- 6

WHEN 7 => SMG <= "11111000"; -- 7

WHEN 8 => SMG <= "10000000"; -- 8

WHEN 9 => SMG <= "10010000"; -- 9

WHEN others =>NULL;

END CASE;

END IF;

IF num_1=2 and cout2="0101" THEN

SMG<="01111111";

DEN<="1101";

END IF;

IF cout2="0110" THEN

DEN<="1110";

CASE d IS

WHEN 0 => SMG <= "11000000"; -- 0

WHEN 1 => SMG <= "11111001"; -- 1

WHEN 2 => SMG <= "10100100"; -- 2

WHEN 3 => SMG <= "10110000"; -- 3

WHEN 4 => SMG <= "10011001"; -- 4

WHEN 5 => SMG <= "10010010"; -- 5

WHEN 6 => SMG <= "10000010"; -- 6

WHEN 7 => SMG <= "11111000"; -- 7

WHEN 8 => SMG <= "10000000"; -- 8

WHEN 9 => SMG <= "10010000"; -- 9

WHEN others =>NULL;

END CASE;

END IF;

IF num_1=3 and cout2="0111" THEN

DEN<="1110";

SMG<="01111111";

END IF;

END PROCESS;

--------------------------------------------

END syn;

管脚图:

七、实验结果

在不断调试并改正错误之后得到能正确运行的程序

原本计划是以计算的固定数值进行反馈调频,如a*2+b*15+c*139+d*381。但这样产生的误差在不断调频中发现误差越来越大。最后决定设计计算调频公式进行调频,如:50000000/(((a*1000+1)+(b*100+1)+(c*10+1)+(d*1+1))*256*64)。调频后准确度上升,但仍然存在误差,原因在于数码管的示数在程序中是整型,在进行运算后计算结果会导致误差,在反馈回PWM调频的时候和实际频率会产生一定的误差。而在键盘模块,由于程序上存在一定的错误,在通电后仍然会有不稳定的数据显示在数码管上,故我在原来的移位模块上加上复位功能,在每次按键后可将下一位清零并数码管位选移位。在数码管设定一定数值后,按下频率传送键,频率成功反馈回PWM模块。在示波器使用紧张的情况下,我另设PWM_out将输出到LED2上,通过LED2的呼吸灯效果初步确认频率传送是否成功。数码管模块设定,被位选中的数码管其成功显示“.”。

八、结论和分析:

1、利用VHDL语言设计基于FPGA的信号发生器,首先得弄懂信号发生器设计原理,查阅文献资料,在无D/A的条件下,寻找关于PWM的资料,再通过对VHDL语言的学习之后编程描述理论中的电路,其间翻阅课本查改语句与程序上的错误与警告,最后调试程序过程中不断发现并改正错误,直到程序没有错误或最大化减少错误并能够成功调试得到自己所设想中的结果。

2、数据结果在四位八段数码管显示,在实体定义时候必须弄清楚管脚的分配,输出输入应该设什么类型,后接到什么管脚,分清楚高地位和小数点位置。实现译码后显示最后结果的功能。

3、由于通过公式运算出得频率通常不是实际数码管应显示整数,这种方法已经最大化减小调频误差。进一步分析,通常在运算结果为整数情况下,误差最小。

VHDL课程设计-PS2键盘

VHDL课程设计-PS2键盘

目录 一、课程设计的目的与任务 (3) 二、课程设计题目 (3) 1、指定题目: (3) 2、自选题目: (3) 三、课程设计的内容与要求 (3) 1、设计内容 (4) 2、设计要求 (4) 四、实验仪器设备 (4) 五、设计方案 (4) 1、PS2解码 (4) 2、设计思路 (6) 3、模块设计 (7) 4、各模块分析 (8) (1)PS2时钟检测模块 8 (2)PS2解码模块 10 (3)PS2组合模块 12 (4)控制LED模块 14 (5)PS2总的组合模块 16 六、综合与仿真 (17) 1、综合 (17) 2、仿真 (18) (1)电平检测模块仿真 (18) (2)LED灯控制模块仿真 (18)

(3)PS2_module总模块仿真 (19) 七、硬件下载 (23) 八、心得体会 (24) 九、参考文献 (24) 一、课程设计的目的与任务 (1)熟练掌握EDA工具软件QuartusII的使用; (2)熟练用VHDL硬件描述语言描述数字电路; (3)学会使用VHDL进行大规模集成电路设计; (4)学会用CPLD\FPGA使用系统硬件验证电路设计的正确性; (5)初步掌握EDA技术并具备一定的可编程逻辑芯片的开发能力; 二、课程设计题目 1、指定题目: 0 :多功能计数器;1 :数字秒表;2 :简易数字钟;3 :简易频率计; 4 :彩灯控制器; 5 :交通灯控制器; 6 :四路智力竞赛抢答器; 7 :简易微波炉控制器;8 :表决器;9 :数字密码锁; 我的的学号尾数是2,所以我要做的题目是简易数字钟。由于我之前已经学过Verilog HDL和VHDL,所以简易数字钟相对于我比较简单,我完成了简易数字钟并验收后,再选择了另一个自选题目来完成。 简易数字钟:设计一个以“秒”为基准信号的简易数字钟,显示时、分、秒,同时可实现整点报时和清零(我已经完成,而且已经验收了)。 2、自选题目: 在完成了数字钟的设计后,我选择了另一个设计的题目,那就是PS2键盘扫描。所以这次课程设计我的报告主要详细写的是PS2键盘扫描的程序,而不是简易数字钟。 PS键盘扫描:设计一个PS键盘扫描程序,能接受键盘的输入时钟和数据,区别哪一个键输入,同时解译通码和断码,使用LED灯来显示收到的数据。三、课程设计的内容与要求

PWM信号发生器的设计报告

前言 脉冲宽度调制(Pulse Width Modulation.PWM)控制技术以其控制简单、灵活和动态响应好的优点而成为电力电子技术和模拟信号数字传输通信领域最广泛应用的控制方式,因此研究基于PWM技术的脉冲宽度及周期可调的信号发生器具有十分重要的现实意义。 本文主要讨论了脉冲占空比可调信号的产生方法,采用三种不同的方案使用VHDL语言编程实现了信号的产生。其中方案一的原理是分频,即用计数器计算时钟脉冲的上升沿个数,再通过输出电平反复翻转得到计数个数(脉冲宽度)可控的PWM 信号;方案二的原理是锯齿波比较法,首先编程产生阶梯状的锯齿波,再通过锯齿波与输入占空比值(数值可控的直线)比较产生脉冲宽度随输入占空比数值变化的PWM 信号;方案三是用有限状态机产生有用信号,首先定义两个状态,再通过计数器值与输入占空比值比较控制状态的切换,产生PWM信号。本文详细介绍方案二和方案三两种方法。 通过使用QuartusII9.0软件采用VHDL语言编程并用功能仿真证实了上文提到的三种PWM信号产生方案都是可行的,都能产生切实可用的PWM信号,三种方案中均可以通过修改输入端口占空比来控制产生信号的脉宽,且可以通过在程序中修改计数器的计数上限和分频模块的分频比改变信号的周期及频率,实现了多参数可调,使整体设计具有灵活的现场可更改性和较好的可移植性。且实现功能的程序简单易懂,设计过程中思路阐述清晰,流程介绍明了,且程序易于修改,可读性好。

第一章设计要求 1.1 研究课题 PWM信号发生器的研制 1.2设计要求 用CPLD可编程模块产生下列信号(特殊芯片:EPM570T100C5) (1)采用VHDL编写相关程序,PWM信号的工作频率为500Hz(1000Hz); (2)时钟信号通过分频器后,由输入开关量控制占空比可调。

单片机课程设计信号发生器

单片机课程设计实验报告 电子信息工程学院 指导教师:***

08年6月30日 单片机课程设计实验报告 一.系统总体介绍 1)题目意义: 这次课程设计的题目我选择的是信号发生器,我之所以选择这个题目的原因有三个 ①它是一个DA转换的实验,在前不久的市电子大赛中,我们做的是AD的转换,所 以想将模数/数模都熟悉一遍,为今后可能遇到的接口实验打下坚实的基础; ②另外一个原因是用到的芯片是MAX518,该芯片是串行数模转换,运用I2C总线, 通过这个实验可以更好的运用串行通信,同时能够学习I2C总线的协议,掌握了一 门新的总线,我觉得比其他实验收获更大; ③MAX518的时序比较复杂,通过练习针对时序的编程可以更好的提高自己读PDF 资料的能力和编程的能力。 2)本人所做的工作 这个实验从始至终都是自己完成的。 ①程序的编写,程序的编写是我结合MAX518的时序图编写出来的,编程的重点在于 对与MAX518的编程,在编程的过程中对于应答信号的理解和处理是整个程序的核心,在单步调试中能够很明显的观测到SDA和SCL信号线上电平的变化; ②四种波形的表格数据的建立。表格的建立是通过MATLAB函数产生的。其函数分别 为:正弦波y=round(127*sin(0:2*pi/256:2*pi))+127 锯齿波y=round(0:1:255) 三角波y=round(0:2:255) Y=round(255:2:0) 方波直接是0和255 由于MATLAB产生的数据之间含有回车和空格,不符合汇编语言的语法规则,所以要用WORD对所得的数据进行处理,利用WORD的查找替换同能讲回车和空格替换为英文的逗号,其中回车的表示方法为^p ③学习KEIL和SSTFlashFlex51.exe的使用 ④元器件的购买和焊接 ⑤实验报告的完成 3)系统的主要功能 该系统能够产生正弦波,锯齿波,三角波和方波四种波形,同时能够产生16HZ,12HZ,10HZ,8HZ四种频率,也就是可以产生4*4=16种信号,通过8个按键

用FPGA实现的七段数码管vhdl代码

Output(7 downto 0)

具体设计: Vhd代码: library IEEE; use Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use sevenled_vhd is Port ( input : in STD_LOGIC_VECTOR (3 downto 0); led : out STD_LOGIC_VECTOR (7 downto 0)); end sevenled_vhd; architecture Behavioral of sevenled_vhd is begin led<= "" when input="0000" else -- 0 "" when input="0001" else -- 1 "" when input="0010" else -- 2 "" when input="0011" else -- 3 "" when input="0100" else -- 4 "" when input="0101" else -- 5 "" when input="0110" else -- 6 "" when input="0111" else -- 7 "" when input="1000" else -- 8 "" when input="1001" else -- 9 "" when input="1010" else -- A "" when input="1011" else -- b "" when input="1100" else -- c "" when input="1101" else -- d "" when input="1110" else -- E ""; -- F end Behavioral; 管脚约束: Net "led<7>" LOC=N19; Net "led<6>" LOC=N15; Net "led<5>" LOC=R20; Net "led<4>" LOC=R18; Net "led<3>" LOC=U20; Net "led<2>" LOC=T18;

函数信号发生器设计方案

函数信号发生器的设 计与制作 目录 一.设计任务概述 二.方案论证与比较 三.系统工作原理与分析 四.函数信号发生器各组成部分的工作原理 五.元器件清单 六.总结 七.参考文献

函数信号发生器的设计与制 一.设计任务概述 (1)该发生器能自动产生正弦波、三角波、方波。 (2)函数发生器以集成运放和晶体管为核心进行设计 (3)指标: 输出波形:正弦波、三角波、方波 频率范围:1Hz~10Hz,10Hz~100Hz 输出电压:方波VP-P≤24V,三角波VP-P=8V,正弦波VP-P>1V; 二、方案论证与比较 2.1·系统功能分析 本设计的核心问题是信号的控制问题,其中包括信号频率、信号种类以及信号强度的控制。在设计的过程中,我们综合考虑了以下三种实现方案: 2.2·方案论证 方案一∶采用传统的直接频率合成器。这种方法能实现快速频率变换,具有低相位噪声以及所有方法中最高的工作频率。但由于采用大量的倍频、分频、混频和滤波环节,导致直接频率合成器的结构复杂、体积庞大、成本高,而且容易产生过多的杂散分量,难以达到较高的频谱纯度。 方案二∶采用锁相环式频率合成器。利用锁相环,将压控振荡器(VCO)的输出频率锁定在所需要频率上。这种频率合成器具有很好的窄带跟踪特性,可以很好地选择所需要频率信号,抑制杂散分量,并且避免了量的滤波器,有利于集成化和小型化。但由于锁相环本身是一个惰性环节,锁定时间较长,故频率转换时间较长。而且,由模拟方法合成的正弦波的参数,如幅度、频率相信都很难控制。 方案三:采用8038单片压控函数发生器,8038可同时产生正弦波、方波和三角波。改变8038的调制电压,可以实现数控调节,其振荡范围为0.001Hz~300K 方案四:采用分立元件设计出能够产生3种常用实验波形的信号发生器,并确定了各元件的参数,通过调整和模拟输出,该电路可产生频率低于1-10Hz的3种信号输出,具有原理简单、结构清晰、费用低廉的优点。该电路已经用于实际电路的实验操作。 三、系统工作原理与分析 采用由集成运算放大器与场效应管共同组成的方波—三角波—正弦波函数发生器的设计方法,先通过比较器产生方波,再通过积分器产生三角波,最后通过场效应管正弦波转换电路形成正弦波,波形转换原理图如下:

VHDL课程设计PS键盘

目录 一、课程设计的目的与任务 (1)熟练掌握EDA工具软件QuartusII的使用;

(2)熟练用VHDL硬件描述语言描述数字电路; (3)学会使用VHDL进行大规模集成电路设计; (4)学会用CPLD\FPGA使用系统硬件验证电路设计的正确性; (5)初步掌握EDA技术并具备一定的可编程逻辑芯片的开发能力; 二、课程设计题目 1、指定题目: 0 :多功能计数器; 1 :数字秒表; 2 :简易数字钟; 3 :简易频率计; 4 :彩灯控制器; 5 :交通灯控制器; 6 :四路智力竞赛抢答器; 7 :简易微波炉控制器; 8 :表决器;9 :数字密码锁; 我的的学号尾数是2,所以我要做的题目是简易数字钟。由于我之前已经学过Verilog HDL和VHDL,所以简易数字钟相对于我比较简单,我完成了简易数字钟并验收后,再选择了另一个自选题目来完成。 简易数字钟:设计一个以“秒”为基准信号的简易数字钟,显示时、分、秒,同时可实现整点报时和清零(我已经完成,而且已经验收了)。 2、自选题目: 在完成了数字钟的设计后,我选择了另一个设计的题目,那就是PS2键盘扫描。所以这次课程设计我的报告主要详细写的是PS2键盘扫描的程序,而不是简易数字钟。 PS键盘扫描:设计一个PS键盘扫描程序,能接受键盘的输入时钟和数据,区别哪一个键输入,同时解译通码和断码,使用LED灯来显示收到的数据。 三、课程设计的内容与要求 1、设计内容 (1)系统功能的分析; (2)实现系统功能的实际方案; (3)编写各功能模块的VHDL语言程序; (4)对各功能模块进行编译、综合、仿真、分析; (5)顶层文件设计 (6)对整个系统进行编译、综合、仿真、分析; (7)在CPLD\FPGA实验开发系统试验箱上进行硬件验证; (8)写实验报告;

信号发生器的设计实现

电子电路综合设计 总结报告 设计选题 ——信号发生器的设计实现 姓名:*** 学号:*** 班级:*** 指导老师:*** 2012

摘要 本综合实验利用555芯片、CD4518、MF10和LM324等集成电路来产生各种信号的数据,利用555芯片与电阻、电容组成无稳态多谐振荡电路,其产生脉冲信号由CD4518做分频实现方波信号,再经低通滤波成为正弦信号,再有积分电路变为锯齿波。此所形成的信号发生器,信号产生的种类、频率、幅值均为可调,信号的种类、频率可通过按键来改变,幅度可以通过电位器来调节。信号的最高频率应该达到500Hz以上,可用的频率应三个以上,T,2T,3T或T,2T,4T均可。信号的种类应三种以上,必须产生正弦波、方波,幅度可在1~5V之间调节。在此过程中,综合的运用多科学相关知识进行了初步工程设计。

设计选题: 信号发生器的设计实现 设计任务要求: 信号发生器形成的信号产生的种类、频率、幅值均为可调,信号的种类、频率可通过按键来改变,幅度可以通过电位器来调节。信号的最高频率应该达到500Hz以上,可用的频率应三个以上,T,2T,3T 或T,2T,4T均可。信号的种类应三种以上,必须产生正弦波、方波,幅度可在1~5V之间调节。 正文 方案设计与论证 做本设计时考虑了三种设计方案,具体如下: 方案一 实现首先由单片机通过I/O输出波形的数字信号,之后DA变换器接受数字信号后将其变换为模拟信号,再由运算放大器将DA输出的信号进行放大。利用单片机的I/O接收按键信号,实现波形变换、频率转换功能。

基本设计原理框图(图1) 时钟电路 系统的时钟采用内部时钟产生的方式。单片机内部有一个用于构成振荡器的高增益反相放大器,该高增益反相放大器的输入端为芯片引脚XTAL1,输出端为引脚XTAL2。这两个引脚跨接石英晶体振荡器和微调电容,就构成一个稳定的自激振荡器。晶振频率为11.0592MHz,两个配合晶振的电容为33pF。 复位电路 复位电路通常采用上电自动复位的方式。上电自动复位是通过外部复位电路的电容充电来实现的。 程序下载电路 STC89C51系列单片机支持ISP程序下载,为此,需要为系统设计ISP下载电路。系统采用MAX232来实现单片机的I/O口电平与RS232接口电平之间的转换,从而使系统与计算机串行接口直接通信,实现程序下载。 方案一的特点: 方案一实现系统既涉及到单片机及DA、运放的硬件系统设计,

模拟电路课程设计-函数信号发生器

模拟电路课程设计——函数信号发生器 一、设计任务和要求 1 在给定的±12V直流电源电压条件下,使用运算放大器设计并制作一个函 数信号发生器。 2 信号频率:1kHz~10kHz 3 输出电压:方波:Vp-p≤24V 三角波:Vp-p≤6V 正弦波: Vp-p>1V 4 方波:上升和下降时间:≤10ms 5 三角波失真度:≤2% 6 正弦波失真度:≤5% 二、设计方案论证 1.信号产生电路 〖方案一〗 由文氏电桥产生正弦振荡,然后通过比较器得到方波,方波积分可得三角波。三角波 这一方案为一开环电路,结构简单,产生的正弦波和方波的波形失真较小。但是对于三角波的产生则有一定的麻烦,因为题目要求有10倍的频率覆盖系数,然而对于积分器的输入输出关系为: 显然对于10倍的频率变化会有积分时间dt的10倍变化从而导致输出电压振幅的10倍变化。而这是电路所不希望的。幅度稳定性难以达到要求。而且通过仿真实验会发现积分器极易产生失调。 〖方案二〗 由积分器和比较器同时产生三角波和方波。其中比较器起电子开关的作用,将恒定的正、负极性的 方波 三角波 电位交替地反馈积分器去积分而得到三角波。该电路的优点是十分明显的: 1 线性良好、稳定性好;

2 频率易调,在几个数量级的频带范围内,可以方便地连续地改变频率, 而且频率改变时,幅度恒定不变; 3 不存在如文氏电桥那样的过渡过程,接通电源后会立即产生稳定的波 形; 4 三角波和方波在半周期内是时间的线性函数,易于变换其他波形。 综合上述分析,我们采用了第二种方案来产生信号。下面将分析讨论对生成的三角波和方波变换为正弦波的方法。 2.信号变换电路 三角波变为正弦波的方法有多种,但总的看来可以分为两类:一种是通过滤波器进行“频域”处理,另一种则是通过非线性元件或电路作折线近似变换“时域”处理。具体有以下几种方案: 〖方案一〗 采用米勒积分法。设三角波的峰值为,三角波的傅立叶级数展开: 通过线性积分后: 显见滤波式的优点是不太受输入三角波电平变动的影响,其缺点是输出正弦波幅度会随频率一起变化(随频率的升高而衰减),这对于我们要求的10倍的频率覆盖系数是不合适的。另外我们在仿真时还发现,这种积分滤波电路存在这较明显的失调,这种失调使输出信号的直流电平不断向某一方向变化。 积分滤波法的失调图(Protel 99 SE SIM99仿真) 而且输出存在直流分量。 〖方案二〗 才用二极管-电阻转换网络折线逼近法。十分明显,用折线逼近正弦波时,如果增多折线的段数,则逼近的精度会增高,但是实际的二极管不是理想开关,存在导通阈值问题,故不可盲目的增加分段数;在所选的折线段数一定的情况下,转折电的位置的选择也影响逼近的精度。凭直观可以判知,在正弦波变化较快的区段,转折点应选择的密一些;而变化缓慢的区段应选的稀疏一些。 二极管-电阻网络折线逼近电路对于集成化来说是比较简单,但要采用分立元件打接则会用到数十个器件,而且为了达到较高的精度所有处于对称位置的电阻和

电子秤VHDL代码

-- 输入电压范围0-5V,显示0-255数位 --------------------库定义、包定义-------------------- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; --------------------实体定义-------------------- ENTITY balance IS port ( clk : IN STD_LOGIC; -- 全局时钟输入,12Mhz晶振产生 reset : IN STD_LOGIC; -- 复位输入 intr : IN STD_LOGIC; -- AD转换结束产生的中断输入 data_i : IN STD_LOGIC_VECTOR(7 DOWNTO 0); -- ADC转换后的数据输入 data_o : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- 数码管数据输出 l : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); -- 输出数码管位选 cs : OUT STD_LOGIC; -- ADC使能 wr : OUT STD_LOGIC; -- ADC写控制 rd : OUT STD_LOGIC -- ADC读控制 ); END balance; --------------------结构体-------------------- ARCHITECTURE bhv OF balance IS TYPE state IS (start, convert, read1, read2);-- 状态机定义 SIGNAL current_state, next_state : state; -- 状态定义 SIGNAL read_data : STD_LOGIC;-- 读数据寄存器 SIGNAL clock : STD_LOGIC;-- 扫描时钟 SIGNAL p : INTEGER RANGE 0 TO 255;-- 数据寄存器 SIGNAL b0,b1,b2 : INTEGER RANGE 0 TO 9;-- 3位数码管显示数据寄存器 SIGNAL cnt : INTEGER RANGE 0 TO 3 := 0;-- 扫描寄存器 BEGIN --------------------显示进程-------------------- PROCESS(p, clk) BEGIN CASE p IS WHEN 0|10|20|30|40|50|60|70|80|90|100|110|120|130|140|150|160|170|180|190|200|210|220|230|240|250 => b0 <= 0; WHEN 1|11|21|31|41|51|61|71|81|91|101|111|121|131|141|151|161|171|181|191|201|211|221|231|241|251 => b0 <= 1; WHEN 2|12|22|32|42|52|62|72|82|92|102|112|122|132|142|152|162|172|182|192|202|212|222|232|242|252 => b0 <= 2; WHEN 3|13|23|33|43|53|63|73|83|93|103|113|123|133|143|153|163|173|183|193|203|213|223|233|243|253 => b0 <= 3; WHEN 4|14|24|34|44|54|64|74|84|94|104|114|124|134|144|154|164|174|184|194|204|214|224|234|244|254 => b0 <= 4; WHEN 5|15|25|35|45|55|65|75|85|95|105|115|125|135|145|155|165|175|185|195|205|215|225|235|245|255 => b0 <= 5; WHEN 6|16|26|36|46|56|66|76|86|96|106|116|126|136|146|156|166|176|186|196|206|216|226|236|246 => b0 <= 6; WHEN 7|17|27|37|47|57|67|77|87|97|107|117|127|137|147|157|167|177|187|197|207|217|227|237|247 => b0 <= 7; WHEN 8|18|28|38|48|58|68|78|88|98|108|118|128|138|148|158|168|178|188|198|208|218|228|238|248 => b0 <= 8; WHEN 9|19|29|39|49|59|69|79|89|99|109|119|129|139|149|159|169|179|189|199|209|219|229|239|249 => b0 <= 9; WHEN OTHERS => NULL; END CASE; CASE p IS WHEN 0|1|2|3|4|5|6|7|8|9|100|101|102|103|104|105|106|107|108|109|200|201|202|203|204|205|206|207|208|209 => b1 <= 0; WHEN 10|11|12|13|14|15|16|17|18|19|110|111|112|113|114|115|116|117|118|119|210|211|212|213|214|215|216|217|218|219 => b1 <= 1; WHEN 20|21|22|23|24|25|26|27|28|29|120|121|122|123|124|125|126|127|128|129|220|221|222|223|224|225|226|227|228|229 => b1 <= 2; WHEN 30|31|32|33|34|35|36|37|38|39|130|131|132|133|134|135|136|137|138|139|230|231|232|233|234|235|236|237|238|239 => b1 <= 3; WHEN 40|41|42|43|44|45|46|47|48|49|140|141|142|143|144|145|146|147|148|149|240|241|242|243|244|245|246|247|248|249 => b1 <= 4; WHEN 50|51|52|53|54|55|56|57|58|59|150|151|152|153|154|155|156|157|158|159|250|251|252|253|254|255 => b1 <= 5; WHEN 60|61|62|63|64|65|66|67|68|69|160|161|162|163|164|165|166|167|168|169 => b1 <= 6; WHEN 70|71|72|73|74|75|76|77|78|79|170|171|172|173|174|175|176|177|178|179 => b1 <= 7; WHEN 80|81|82|83|84|85|86|87|88|89|180|181|182|183|184|185|186|187|188|189 => b1 <= 8; WHEN 90|91|92|93|94|95|96|97|98|99|190|191|192|193|194|195|196|197|198|199 => b1 <= 9; WHEN OTHERS => NULL; END CASE; IF (p < 100) THEN b2 <= 0; ELSIF (p >= 100 and p < 200) THEN b2 <= 1; ELSIF (p >= 200) THEN b2 <= 2; END IF; END PROCESS; --------------------分频进程-------------------- PROCESS(clk) VARIABLE cnt1 : INTEGER RANGE 0 TO 100; VARIABLE cnt2 : INTEGER RANGE 0 TO 20; BEGIN IF (clk'EVENT AND clk = '1') THEN IF (cnt1 = 100) THEN cnt1 := 0; IF (cnt2 = 20) THEN cnt2 := 0; clock <= NOT clock; IF (cnt = 3) THEN cnt <= 0; ELSE cnt <= cnt + 1; END IF; ELSE cnt2 := cnt2 + 1; END IF; ELSE cnt1 := cnt1 + 1; END IF; END IF;

VHDL课程设计报告

湖南科技大学 信息与电气工程学院 课程设计任务书 20 —20 学年第学期 专业:学号:姓名: 课程设计名称: 设计题目: 完成期限:自年月日至年月日共周设计依据、要求及主要内容(可另加附页): 指导教师(签字): 批准日期:年月日

目录 一、摘要 二、VHDL语言介绍 三、设计的目的 四、设计内容 五、电路工作原理 六、主要程序及仿真结果 七、对本次设计的体会和建议 八、参考文献

一、摘要 人类社会已进入到高度发达的信息化社会。信息化社会的发展离不开电子信息产品开发技术、产品品质的提高和进步。电子信息产品随着科学技术的进步,其电子器件和设计方法更新换代的速度日新月异。实现这种进步的主要原因就是电子设计技术和电子制造技术的发展,其核心就是电子设计自动化(EDA,Electronics Design Automation)技术,EDA技术的发展和推广应用又极大地推动了电子信息产业的发展。为保证电子系统设计的速度和质量,适应“第一时间推出产品”的设计要求,EDA技术正逐渐成为不可缺少的一项先进技术和重要工具。目前,在国内电子技术教学和产业界的技术推广中已形成“EDA热”,完全可以说,掌握EDA技术是电子信息类专业学生、工程技术人员所必备的基本能力和技能。EDA技术在电子系统设计领域越来越普及,本设计主要利用VHDL语言设计一个电子数字钟,它的计时周期为24小时,显示满刻度为24时59分59秒。总的程序由几个各具不同功能的单元模块程序拼接而成,其中包括分频程序模块、时分秒计数和设置程序模块、比较器程序模块、三输入数据选择器程序模块、译码显示程序模块和拼接程序模块。并且使用软件进行电路波形仿真。 关键词:数字钟EDA VHDL语言 二、VHDL语言介绍 1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。自IEEE公布了VHDL的标准版本,IEEE-1076(简称87版)之后,各EDA公司相继推出了自己的VHDL 设计环境,或宣布自己的设计工具可以和VHDL接口。此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本,(简称93版)。现在,VHDL和Verilog作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。有专家认为,在新的世纪中,VHDL于Verilog语言将承担起大部分的数字系统设计任务。VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。 三、设计的目的 本项实验通过六十进制计数器和数字钟的设计与仿真,学习VHDL语言及VHDL文本输入设计方法,编写六十进制计数器和数字钟源程序,应用VMAX+plusII软件进HDL文本输入设计与波形仿真。熟练地运用数字系统的设计方法进行数字系统设计,能进行较复杂的数字系统设计,按要求设计一个数字钟。 四、设计内容 1、60进制计数器计数器 60进制计数器计数器是一个用以实现计数功能的时序部件,它不仅可用来及脉冲数,还常用作数子系统的定时、分频和执行数字运算以及其它特定的逻辑功能。计数器种类很多。按

EDA-常见实例源程序代码vhdl

第4章用VHDL程序实现常用逻辑电路4.1 组合逻辑电路设计 4.1.1 基本逻辑门 library ieee; use iee.std_logic_1164.all; entity jbm is port(a,b: in bit; f1,f2,f3,f4,f5,f: out bit); end jbm; architecture a of jbm is begin f1<=a and b; --构成与门 f2<=a or b; --构成或门 f<=not a; --构成非门 f3<=a nand b; --构成与非门 f4<=a nor b; --构成异或门 f5<=not(a xor b); --构成异或非门即同门 end; 4.1.2 三态门 library ieee; use ieee.std_logic_1164.all; entity tri_s is port(enable: in std_logic; datain: in std_logic_vector(7 downto 0); dataout: out std_logic_vector(7 downto0)); end tri_s; architecture bhv of tri_s is begin process(enable,datain) begin if enable='1' then dataout<=datain; else dataout<="ZZZZZZZZ"; end if; end process; end bhv; 4.1.3 3-8译码器 library ieee; use ieee.std_logic_1164.all; entity decoder3_8 is port(a,b,c,g1,g2a,g2b: in std_logic; y: out std_logic_vector(7 downto 0)); end decoder3_8; architecture a of decoder3_8 is signal dz:std_logic_vector(2 downto 0); begin dz<=c&b&a; process (dz,g1,g2a,g2b) begin if(g1='1'and g2a='0'and g2b='0')then case dz is when "000"=> y<="11111110"; when "001"=> y<="11111101"; when "010"=> y<="11111011"; when "011"=> y<="11110111"; when "100"=> y<="11101111"; when "101"=> y<="11011111"; when "110"=> y<="10111111"; when "111"=> y<="01111111"; when others=>y<="XXXXXXXX"; end case; else y<="11111111"; end if; end process; 4.1.4 优先编码器

VHDL课程设计

本科实验报告 实验名称:数字系统设计与实验(软件部分)

实验一 QuartusII9.1软件的使用 一、实验目的: 1、通过实现书上的例子,掌握QUARTUSII9.1软件的使用. 2、编程实现3-8译码电路以掌握VHDL组合逻辑的设计以及QUARTUSII9.1软件的使用。 二、实验内容 1.十进制加法计数器的VHDL文本及仿真 功能图: VHDL文本: library IEEE; use IEEE.std_logic_1164.all; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity count10 is port(clk,load,en:in std_logic; data_in:in std_logic_vector(3 downto 0); seg:out std_logic_vector(6 downto 0)); end count10; architecture beha of count10 is signal qout:std_logic_vector(3 downto 0); signal q_temp:std_logic_vector(3 downto 0); begin process(clk,load) begin if(load='1')then q_temp<=data_in; elsif(clk'event and clk='1')then

if(en='0')then qout<=qout; elsif(qout="1001")then qout<="0000"; else qout<=qout+1; end if; q_temp<=qout; end if; end process; process(q_temp) begin case q_temp is when"0000"=>seg<="1000000"; when"0001"=>seg<="1111001"; when"0010"=>seg<="0100100"; when"0011"=>seg<="0110000"; when"0100"=>seg<="0011001"; when"0101"=>seg<="0010010"; when"0110"=>seg<="0000010"; when"0111"=>seg<="1111000"; when"1000"=>seg<="0000000"; when"1001"=>seg<="0010000"; when others=>seg<="0001000"; end case; end process; end beha; 功能仿真流程及结果: 全编译通过后,进行仿真 新建波形文件,在其中添加所需节点。将clk设置为时钟信号,将en设置为高电平,将load 设置为低电平,将data_in设置为想要预置的数值。 运行Generate Functional Simulation Nest List命令产生能仿真的网标文件。点击Start Simulation开始模拟仿真 仿真结果:

浅谈利用单片机设计PWM脉冲信号发生器

浅谈利用单片机设计PWM脉冲信号发生器 发表时间:2014-01-09T11:41:33.297Z 来源:《中国科技教育·理论版》2013年第11期供稿作者:王雪娇胡恒铮 [导读] 除此之外,模拟电路中许多的元器件会发热,也就相对提高了电路的功耗,并且对噪声也敏感,任何干扰或噪声都会改变电流值的大小。 王雪娇胡恒铮无锡技师学院 214153 摘要脉冲宽度调制(PWM)在电子技术领域中应用十分广泛,但是利用模拟电路实现脉宽调制功能十分复杂、不经济。随着微处理器的发展,运用数字输出方式去控制实现PWM的功能就变得简单快捷,本文就如何利用89S52单片机软件编程设计出周期一定而占空比可调的脉冲波,也就是实现PWM功能进行设计,它可以代替模拟电路的PWM脉冲信号发生器。 关键词单片机 PWM 数字控制 PWM是脉冲宽度调制(Pulse Width Modulation)的英文缩写,它是开关型稳压电源中按稳压的控制方式分类中的一种,而脉宽宽度调制式(PWM)开关型稳压电路是在控制电路输出频率不变的情况下,通过电压反馈调整其占空比,从而达到稳定输出电压的目的。 简单的说,PWM是一种对模拟信号电平进行数字编码的方法。理论上讲就是电压或电流源以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的,通的时候就是电源被加到负载上,断的时候就是供电被断开的时候,所以PWM信号仍然是数字的。要想达到这样一种脉宽调制效果,模拟电压和电流时可以直接控制。例如音响的音量控制,在简单的模拟电路中,它的控制是由连接了一个可变电阻的旋钮来实现的,其过程是拧动旋钮,电阻值变小或变大,流过该电阻的电流也随之增加来减小,从而改变驱动扬声器的电流值,那么声音也就相应变大或变小。从这个例子来看,模拟控制是直观而简单的,但是并不是所有的模拟电路都是可行并且经济的,其中很重要的一点就是模拟电路容易随时间漂移,它的调节过程就很困难,为了解决问题就要增加很多的电路,使得电路变得复杂并且昂贵。除此之外,模拟电路中许多的元器件会发热,也就相对提高了电路的功耗,并且对噪声也敏感,任何干扰或噪声都会改变电流值的大小。 综上所述,通过数字方式来控制模拟电路可以大幅度降低系统的成本和功耗,而单片机I/O口的数字输出可以很简单地发出一个脉冲波,在配以外部元器件就可以调节脉冲波的占空比,完成PWM的功能。本文主要介绍利用89S52系列的单片机,控制某个I/O口中一个管脚的数字输出,生成相应周期的脉冲波,并利用按键控制其占空比的调节,包括了占空比自小到大和自大到校的顺序及倒序可调,其调节范围广,操作简便,各元器件间的干扰较小,对模拟电路的控制十分有效。 1.PWM波的生成 PWM波既为数字输出,就是其幅值只有高电平(ON)和低电平(OFF)之分,所以只要使单片机中作为PWM波输出端的那个管脚输出“1”和“0”,并且搭配不同的时间段,就可以形成不同周期的PWM波。举例说明:若要生成周期为10ms的脉冲,就可以利用单片机编程指令控制其输出端输出“1”,并且保持一段时间tp,然后再输出“0”,同样使其保持一段时间tr,两种数字输出保持的时间必须要满足,现就已生成10ms周期的脉冲波,而PWM波与该脉冲波的区别就是还要能够调节占空比。占空比是指正半周脉宽占整个周期的比例,即高电平保持时间于周期的比值,该比值为百分数(),因此在周期一定的情况下,调节占空比就是调节高电平保持的时间。 2.应用编程 本文介绍的PWM波是利用单片机定时中断去确定脉冲波的周期,并且通过两个按键自增和自减某个变量送至中断中,通过此变量去分配高低电平各自占用的时间,形成不同的占空比,即假设一个周期满额比例值为10,则高电平保持时间的比例为该变量值,那么低电平保持时间的比例就是10减去该变量值。 如图1所示为单片机的外部接线图,其中省略了单片机最小系统,此图即可利用89SC52单片机设计出满足周期为10ms、初始占空比为50%、占空比调节范围为0~100%的PWM脉冲信号发生器。占空比调节范围是指高电平保持时间为0~10ms,那么低电平保持时间就是10ms~0。P0.7脚为PWM波输出口,作为PWM脉冲信号发生器可连接其它电路,本文仅连接示波器去观察波形的占空比变化情况,P2.0脚为自增按钮控制端,每按一次高电平保持时间增加1ms,P2.1脚为自减按钮控制端,每按一次高电平保持时间减少1ms。图2所示为初始

信号发生器课程设计报告

目录 一、课题名称 (2) 二、内容摘要 (2) 三、设计目的 (2) 四、设计内容及要求 (2) 五、系统方案设计 (3) 六、电路设计及原理分析 (4) 七、电路仿真结果 (7) 八、硬件设计及焊接测试 (8) 九、故障的原因分析及解决方案 (11) 十、课程设计总结及心得体会 (12)

一、课题名称:函数信号发生器的设计 二、内容摘要: 函数信号发生器作为一种常用的信号源,是现代测试领域内应用最为广泛的通用仪器之一。在研制、生产、测试和维修各种电子元件、部件以及整机设备时,都要有信号源,由它产生不同频率不同波形的电压、电流信号并加到被测器件或设备上,用其他仪器观察、测量被测仪器的输出响应,以分析确定它们的性能参数。信号发生器是电子测量领域中最基本、应用最广泛的一类电子仪器。它可以产生多种波形信号,如正弦波,三角波,方波等,因而此次课程设计旨在运用模拟电子技术知识来制作一个能同时输出正弦波、方波、三角波的信号发生器。 三、设计目的: 1、进一步掌握模拟电子技术知识的理论知识,培养工程设计能力和综合分析能力、解决问题的能力。 2、基本掌握常用电子电路的一般设计方法,提高电子电路的设计和实验能力。 3、学会运用Multisim仿真软件对所做出来的理论设计进行仿真测试,并能进一步解决出现的基本问题,不断完善设计。 4、掌握常用元器件的识别和测试,熟悉万用表等常用仪表,了解电路调试的基本方法,提高实际电路的分析操作能力。 5、在仿真结果的基础上,实现实际电路。 四、设计内容及要求: 1、要求完成原理设计并通过Multisim软件仿真部分 (1)RC桥式正弦波产生电路,频率分别为300Hz、1KHz、10KHz、500KHz,输出幅值300mV~5V可调、负载1KΩ。 (2)占空比可调的矩形波电路,频率3KHz,占空比可调范围10%~90%,输出幅值3V、负载1KΩ。 (3)占空比可调的三角波电路,频率1KHz,占空比可调范围10%~90%,输出幅值3V、负载1KΩ。 (4)多用信号源产生电路,分别产生正弦波、方波、三角波,频率范围

相关主题
文本预览
相关文档 最新文档