PWM信号发生器的设计程序(veriloghdl)
- 格式:doc
- 大小:31.50 KB
- 文档页数:3
EDA实验报告学院:电气学院班级:电科1班学号:12401720126姓名:刘明煌实验三PWM信号发生器的设计1.实验目的(1)进一步熟悉掌握Quartus H。
(2)进一步熟悉和掌握GW48-CK或其他EDA实验开发系统的应用。
(3)学习和掌握VHDL进程语句和元件例化语句的使用。
2.实验内容设计并调试好PWM信号发生器电路PWM.VHD,并用GW48-CK或其他EDA实验开发系统进行硬件验证。
3.实验条件(1)开发软件:Quartus H。
(2)实验设备:GW48-CK EDA实验开发系统。
(3)拟用芯片:EP2C8Q208C8N。
4.实验设计1) 系统原理框图为了简化设计并便于显示,本信号发生器电路PWM的设计分为两个层次,其底层电路可,再由包括两个完全相同的加载加法计数器LCNT8而成。
PWM电路图2) VHDL程序PWM信号发生器的底层和顶层电路均采用VHDL文本输入,有关VHDL程序如下。
加载加法计数器LCNT8的VHDL源程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY LCNT8 ISPORT(CLK ,L D:IN STD_LOGIC;D:IN INTEGER RANGE 0 TO 255;CAO:OUT STD_LOGIC);END ENTITY LCNT8;ARCHITECTURE ART OF LCNT8 ISSIGNAL COUNT:INTEGER RANGE 0 TO 255;BEGINIF CLKEVENT AND CLK=1THENIF LD=1THEN COUNT<=D;ELSE C0UNT<=C0UNT+1;END IF;END IF;END PROCESS;PROCESS(COUNT) ISBEGINIF COUNT=255 THEN CAO<=1;ELSE CAO<=0END IF;END PROCESS;END ARCHITECTURE ART;PWM信号发生器的VHDL源程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY PWM ISPORT(CLK:IN STD_LOGIC;A,B:IN STD_LOGIC_VECTOR(7 DOWNTO 0);PWM:OUT STD_LOGIC);END ENTITY PWM;ARCHITECTURE ART OF PWM ISCOMPONENT LCNT8 ISPORT(CLK ,L D:IN STD_LOGIC;D:IN STD_LOGIC_VECTOR(7 DOWNTO 0);CAO:OUT STD_LOGIC);END COMPONENT LCNT8;SIGNAL CAO1,CAO2:STD_LOGIC;SIGNAL LD1,LD2:STD_LOGIC;SIGNAL SPWM:STD_LOGIC;BEGINU1:LCNT8 PORT MAP(CLK=>CLK,LD=>LD1,D=>A,CAO=>CAO1);U2:LCNT8 PORT MAP(CLK=>CLK,LD=>LD2,D=>B,CAO=>CAO2);PROCESS(CAO1,CAO2)ISBEGINIF CAO1='1'THEN SPWM<='0';ELSIF CAO2'EVENT AND CAO2='1'THEN SPWM<='1';END IF;END PROCESS;LD1<=NOT SPWM;LD2<=SPWM;PWM<=SPWM;END ARCHITECTURE ART;3)工程编译后:4)仿真波形设置本程序包括两个程序,因此先进行底层的加载加法计数器 LCNT8的仿真,在进行顶层 PWM 的仿真,下图为 PWM 的 输入设置及可能结果估计图。
PWM信号发生器的设计实验/上机报告一、实验目的1、掌握序列发生器和检测器的工作原理;2、初步学会用状态机进行数字系统设计。
二、实验环境Quartus II 7.0 开发系统三、实验内容用状态机设计实现串序列检测器设计,可以用原理图输入法设计序列信号发生器,要求产生序列:0111010011011010;再进行检测设计,若检测到序列:11010则输出为“1”,否则输出为“0”。
并对其进行仿真和硬件测试。
四、实验过程本实验可以分为两部分来设计。
第一步设计序列信号发生器,在这里可以采用模16的计数器74LS161来产生模16的计数,并由它的4位输出可以产生16种状态,由此可以用来设计序列产生器,也可以采用状态机产生序列,本实验用状态机产生序列。
第二步设计序列检测器,这里用状态机设计,如果为真输出1,为假输出为0;第三步设计串行转并行输出,将序列并行输出在LED管上显示。
第四步是设计一个计数脉冲,记录出现所需要的序列的次数。
第五步是将所有模块连接起来,构成一个完整的序列发生和检测设计器。
实验代码:1、序列发生器library ieee;use ieee.std_logic_1164.all;entity xulie_produce is—序列产生电路port(clk,reset:in std_logic;comb_outputs:out std_logic);--序列输出end xulie_produce;architecture behav of xulie_produce istype fsm_st is (s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15);--状态设计signal current_state,next_state:fsm_st;beginreg:process(reset,clk)—主控时序进程beginif reset ='1'then current_state<=s0;elsif clk='1'and clk'event thencurrent_state<=next_state;end if;end process;com:process(current_state)—主控组合进程begincase current_state iswhen s0 => comb_outputs<='0';next_state<=s1; when s1 => comb_outputs<='1';next_state<=s2; when s2 => comb_outputs<='1';next_state<=s3; when s3 => comb_outputs<='1';next_state<=s4; when s4 => comb_outputs<='0';next_state<=s5; when s5 => comb_outputs<='1';next_state<=s6; when s6 => comb_outputs<='0';next_state<=s7; when s7 => comb_outputs<='0';next_state<=s8; when s8 => comb_outputs<='1';next_state<=s9; when s9 => comb_outputs<='1';next_state<=s10; when s10 => comb_outputs<='0';next_state<=s11; when s11 => comb_outputs<='1';next_state<=s12; when s12 => comb_outputs<='1';next_state<=s13; when s13 => comb_outputs<='0';next_state<=s14; when s14 => comb_outputs<='1';next_state<=s15; when s15 => comb_outputs<='0';next_state<=s0; end case;end process;end behav;2、序列检测器library ieee;use ieee.std_logic_1164.all;entity s_machine is—序列检测电路port(clk,reset:in std_logic;state_inputs:in std_logic;--状态转移控制comb_outputs:out std_logic);检测结果输出end s_machine;architecture behav of s_machine istype fsm_st is (s0,s1,s2,s3,s4,s5);signal current_state,next_state:fsm_st;beginreg:process(reset,clk)主控时序进程beginif reset ='1'then current_state<=s0;elsif clk='1'and clk'event thencurrent_state<=next_state;end if;end process;com:process(current_state,state_inputs)—主控组合进程begincase current_state iswhen s0 => comb_outputs<='0';if state_inputs='1' then next_state<=s1;else next_state<=s0;end if;when s1 => comb_outputs<='0';if state_inputs='1' then next_state<=s2;else next_state<=s0;end if;when s2 => comb_outputs<='0';if state_inputs='0' then next_state<=s3;else next_state<=s2;end if;when s3 => comb_outputs<='0';if state_inputs='1' then next_state<=s4;else next_state<=s0;end if;when s4 => comb_outputs<='0';if state_inputs='0' then next_state<=s5;else next_state<=s2;end if;when s5 => comb_outputs<='1';--检测到11010输出1 if state_inputs='0' then next_state<=s0;else next_state<=s1;end if;end case;end process;end behav;3、串行输出变并行输出library ieee;use ieee.std_logic_1164.all;entity shift is –串行变并行电路port(clk,load,a:in std_logic;din :out std_logic_vector(7 downto 0));--并行输出end shift;architecture behav of shift isbeginprocess(clk,load,a)variable reg8 :std_logic_vector(7 downto 0);beginif clk'event and clk='1'thenif load='1'then reg8(7 downto 1):=reg8(6 downto 0);--load为1时开始装载reg8(0):=a;end if;end if;din<=reg8;end process;end behav;4、计数器设计LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY CNTM IS –计数电路PORT (CLK,RST,EN:IN STD_LOGIC;a,b,c:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END CNTM;ARCHITECTURE behav OF CNTM ISsignal a1,b1,c1:std_logic_vector(3 downto 0); BEGINPROCESS (CLK,RST,EN)VARIABLE N :INTEGER RANGE 0 TO 1000;BEGINIF RST ='1' THEN N:=0;ELSIF CLK 'EVENT AND CLK='1' THENIF EN = '1' THENIF N<100 THEN N:=N+1;--设计为100计数ELSE N:=0;END IF;END IF;END IF;a1<=conv_std_logic_vector((N/100),4);b1<=conv_std_logic_vector(((N/10)mod 10),4); c1<=conv_std_logic_vector((N mod 10),4);a<=a1;b<=b1;c<=c1;END PROCESS;实验步骤:1、建立工作库文件和编辑设计文件(1)在D盘新建一个文件夹用来保存工程文件(2)打开QuartusⅡ8.0软件,选择菜单File->New->VHDL File,点击OK后在打开的界面下输入已经设计好的程序。
pwm 信号发生器的设计
脉冲宽度调制(Pulse Width ModulaTIon.PWM)控制技术以其控制简
单、灵活和动态响应好的优点而成为电力电子技术和模拟信号数字传输通信领域最广泛应用的控制方式,因此研究基于PWM 技术的脉冲宽度及周期可
调的信号发生器具有十分重要的现实意义。
这篇文章主要就是说明计数器计算时钟脉冲的上升沿个数,再通过输出电平反复翻转得到计数个数(脉冲宽度)可控的PWM 信号。
为了使本次设计产生的PWM 信号能用于频率稳定度高的晶振,故在系统设计中添加了一个分频模块,因此PWM 信号发生器由分频器和信号发
生器两个部分组成。
其组成框图如图2.1 所示
PWM 信号发生器的总体设计流程图如图2.2 所示。
单片机PWM信号发生器的原理与设计引言在现代电子技术中,脉冲宽度调制(PWM)信号发生器被广泛应用于各种电路和系统中。
单片机作为常见的嵌入式系统解决方案,具备了成本低、功耗低、可编程性强等优势,因此被广泛用于PWM信号发生器设计中。
本文将介绍单片机PWM 信号发生器的原理与设计。
一、PWM信号发生器的原理1.1 脉冲宽度调制(PWM)概述脉冲宽度调制(PWM)是一种将模拟信号转换为数字信号的技术。
PWM信号由连续的短脉冲组成,其脉冲的宽度可以根据需要进行调整。
通过改变脉冲信号的宽度与周期之比,可以模拟出不同的模拟信号输出。
1.2 PWM信号发生器的基本原理PWM信号发生器的基本原理是通过控制脉冲的宽度和周期,实现对输出波形的精确控制。
单片机通常具有定时器模块,通过定时器模块的特定设置,可以生成精确的脉冲信号。
单片机还需要连接输出引脚,将生成的PWM信号输出给外部电路。
二、单片机PWM信号发生器的设计2.1 硬件设计单片机PWM信号发生器的硬件设计包括选择合适的单片机、外部电路连接和输出端口设计。
首先,选择适合的单片机。
考虑到PWM信号发生器需要高精度、可编程性强的特点,可以选择带有定时器模块的单片机。
常见的单片机型号有ATmega系列、PIC系列等。
根据实际需求选择合适的型号。
其次,进行外部电路连接。
通常需要连接电源、晶体振荡器以及输出端口。
电源提供电压稳定源,晶体振荡器提供时钟信号。
输出端口需要连接到PWM信号的目标设备上。
最后,进行输出端口设计。
根据实际需求确定输出端口的数量和类型。
常用的输出接口有GPIO、PWM输出等。
根据单片机型号和外部电路要求进行设计。
2.2 软件设计单片机PWM信号发生器的软件设计包括定时器设置和PWM生成代码编写。
首先,进行定时器设置。
根据单片机型号和需求,设置定时器的时钟源、分频系数、计数模式等参数。
通过合理的定时器设置,可以实现精确的脉冲宽度和周期控制。
其次,编写PWM生成代码。
PWM信号发生器的设计程序module pwmgen(clk,rst,ce,addr,write,wrdata,read,bytesel,rddata,pwm); input clk,rst,ce;input [1:0]addr;input write,read;input[31:0]wrdata;output[31:0]rddata;input[31:0]bytesel;output pwm;reg[31:0]clk_div_reg,duty_cycle_reg;reg control_reg;reg clk_div_reg_sel,duty_cycle_reg_sel,control_reg_sel;reg[31:0]pwm_cnt,rddata;reg pwm;wire pwm_ena;always@(addr)beginclk_div_reg_sel<=0;duty_cycle_reg_sel<=0;control_reg_sel<=0; case(addr)2'b00:clk_div_reg_sel<=1;2'b01:duty_cycle_reg_sel<=1;2'b10:control_reg_sel<=1;default:beginclk_div_reg_sel<=0;duty_cycle_reg_sel<=0;control_reg_sel<=0;endendcaseendalways@(posedge clk or negedge rst)beginif(rst==1'b0)clk_div_reg=0;elsebeginif(write & ce & clk_div_reg_sel)beginif(bytesel[0])clk_div_reg[7:0]=wrdata[7:0];if(bytesel[1])clk_div_reg[15:8]=wrdata[15:8];if(bytesel[2])clk_div_reg[23:16]=wrdata[23:16];if(bytesel[3])clk_div_reg[31:24]=wrdata[31:24];endendendalways@(posedge clk or negedge rst)beginif(rst==1'b0)duty_cycle_reg=0;elsebeginif(write&ce&duty_cycle_reg_sel)beginif(bytesel[0])duty_cycle_reg[7:0]=wrdata[7:0];if(bytesel[1])duty_cycle_reg[15:8]=wrdata[15:8];if(bytesel[2])duty_cycle_reg[23:16]=wrdata[23:16];if(bytesel[3])duty_cycle_reg[31:24]=wrdata[31:24];endendendalways@(posedge clk or negedge rst)beginif(rst==1'b0)control_reg=0;elsebeginif(write & ce & control_reg_sel)beginif(bytesel[0])control_reg=wrdata[0];endendendalways@(addr or read or clk_div_reg or duty_cycle_reg or control_reg or ce) beginif(read & ce)case(addr)2'b00:rddata<=clk_div_reg;2'b01:rddata<=duty_cycle_reg;2'b10:rddata<=control_reg; default:rddata=32'h8888;endcaseendassign pwm_en=control_reg; always@(posedge clk or negedge rst) beginif(rst==1'b0)pwm_cnt=0;elsebeginif(pwm_en)beginif(pwm_cnt>=clk_div_reg)pwm_cnt<=0;elsepwm_cnt<=pwm_cnt+1;endelsepwm_cnt<=0;endendalways@(posedge clk or negedge rst) beginif(rst==1'b0);elsebeginif(pwm_en)beginif(pwm_cnt<=duty_cycle_reg)pwm<=1'b1;elsepwm<=1'b0;endelsepwm<=1'b0;endendendmodule。
PWM信号发生器的设计程序
module pwmgen(clk,rst,ce,addr,write,wrdata,read,bytesel,rddata,pwm); input clk,rst,ce;
input [1:0]addr;
input write,read;
input[31:0]wrdata;
output[31:0]rddata;
input[31:0]bytesel;
output pwm;
reg[31:0]clk_div_reg,duty_cycle_reg;
reg control_reg;
reg clk_div_reg_sel,duty_cycle_reg_sel,control_reg_sel;
reg[31:0]pwm_cnt,rddata;
reg pwm;
wire pwm_ena;
always@(addr)
begin
clk_div_reg_sel<=0;duty_cycle_reg_sel<=0;control_reg_sel<=0; case(addr)
2'b00:clk_div_reg_sel<=1;
2'b01:duty_cycle_reg_sel<=1;
2'b10:control_reg_sel<=1;
default:
begin
clk_div_reg_sel<=0;
duty_cycle_reg_sel<=0;
control_reg_sel<=0;
end
endcase
end
always@(posedge clk or negedge rst)
begin
if(rst==1'b0)
clk_div_reg=0;
else
begin
if(write & ce & clk_div_reg_sel)
begin
if(bytesel[0])
clk_div_reg[7:0]=wrdata[7:0];
if(bytesel[1])
clk_div_reg[15:8]=wrdata[15:8];
if(bytesel[2])
clk_div_reg[23:16]=wrdata[23:16];
if(bytesel[3])
clk_div_reg[31:24]=wrdata[31:24];
end
end
end
always@(posedge clk or negedge rst)
begin
if(rst==1'b0)
duty_cycle_reg=0;
else
begin
if(write&ce&duty_cycle_reg_sel)
begin
if(bytesel[0])
duty_cycle_reg[7:0]=wrdata[7:0];
if(bytesel[1])
duty_cycle_reg[15:8]=wrdata[15:8];
if(bytesel[2])
duty_cycle_reg[23:16]=wrdata[23:16];
if(bytesel[3])
duty_cycle_reg[31:24]=wrdata[31:24];
end
end
end
always@(posedge clk or negedge rst)
begin
if(rst==1'b0)
control_reg=0;
else
begin
if(write & ce & control_reg_sel)
begin
if(bytesel[0])control_reg=wrdata[0];
end
end
end
always@(addr or read or clk_div_reg or duty_cycle_reg or control_reg or ce) begin
if(read & ce)
case(addr)
2'b00:rddata<=clk_div_reg;
2'b01:rddata<=duty_cycle_reg;
2'b10:rddata<=control_reg; default:rddata=32'h8888;
endcase
end
assign pwm_en=control_reg; always@(posedge clk or negedge rst) begin
if(rst==1'b0)
pwm_cnt=0;
else
begin
if(pwm_en)
begin
if(pwm_cnt>=clk_div_reg)
pwm_cnt<=0;
else
pwm_cnt<=pwm_cnt+1;
end
else
pwm_cnt<=0;
end
end
always@(posedge clk or negedge rst) begin
if(rst==1'b0);
else
begin
if(pwm_en)
begin
if(pwm_cnt<=duty_cycle_reg)
pwm<=1'b1;
else
pwm<=1'b0;
end
else
pwm<=1'b0;
end
end
endmodule。