⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwm_m.vhd

📁 VHDL基础的编程源代码
💻 VHD
字号:
--/*****************************************************************************
-- * 源文件:	pwm_m.v
-- * 模块:   	PWM信号分析测量
-- * 版权:
-- *         	Copyright(C) 北京联华众科科技有限公司
-- *						www.lianhua-zhongke.com.cn
-- * 版本:  	Version 1.0
-- * 
-- * 功能说明:
-- *		   	通过对PWM信号的高电平,低电平计数得到PWM信号的正,负半周期宽度,
-- *			计数结果的低8位通过输出变量 data 输出,显示在 8 位LED上。
-- *
-- * 参数说明:
-- *	       	输出
-- *			data - PWM信号测量结果,是一个计数值,可能是正半周期宽度,也可能
-- *				   是负半周期,由输入的选择开关 data_sel 控制。
-- *
-- *			输入
-- *			data_sel - 测量结果输出选择,0表示输出为低电平宽度,1表示输出为
-- *					   高电平宽度
-- *			pwm_in - 待测量的PWM信号
-- *			clock - 工作时钟
-- *			reset - 复位信号,低电平有效
-- *
-- *			参数
-- *			无
-- *
-- * 变更记录: 
-- *         2006.01.28, 新建
-- *
-- *****************************************************************************/

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_unsigned.all;

ENTITY pwm_m IS
	PORT
	(
		data : OUT STD_LOGIC_VECTOR(7 downto 0);
		
		data_sel : IN STD_LOGIC;--显示测量结果选择,0-为TL, 1-为TH
		pwm_in : IN STD_LOGIC;--待测量的PWM信号
		clock : IN STD_LOGIC;
		reset : IN STD_LOGIC
	);
	
END pwm_m;

ARCHITECTURE pwm_m_architecture OF pwm_m IS	
BEGIN
	PROCESS(clock, pwm_in, data_sel, reset)
		VARIABLE TL_counter : INTEGER RANGE 0 TO 16777215;--负半周期宽度,24位宽
		VARIABLE TH_counter : INTEGER RANGE 0 TO 16777215;--正半周期宽度,24位宽
		VARIABLE TL_value : STD_LOGIC_VECTOR(23 downto 0);--24位宽
		VARIABLE TH_value : STD_LOGIC_VECTOR(23 downto 0);--24位宽
	BEGIN
		if(reset = '0') then--低电平复位
			TL_counter := 0;
			TH_counter := 0;	
			
			data <= X"00";
		elsif (clock'EVENT and clock='1') then
			--信号测量部分
			if (pwm_in = '1') then
				if (TH_counter = CONV_INTEGER(STD_LOGIC_VECTOR'(X"FFFFFF"))) then
				--if (TH_counter = 16777215) then
					TH_counter := 0;
				else 
					TH_counter := TH_counter+1;
				end if;
		
				if (TL_counter = 0) then
				else
					TL_value := CONV_STD_LOGIC_VECTOR(TL_counter, 24);
					TL_counter := 0;
				end if;
			else
				if (TL_counter = CONV_INTEGER(STD_LOGIC_VECTOR'(X"FFFFFF"))) then
				--if (TL_counter = 16777215) then
					TL_counter := 0;
				else 
					TL_counter := TL_counter+1;
				end if;
			
				if (TH_counter = 0) then
				else
					TH_value := CONV_STD_LOGIC_VECTOR(TH_counter, 24);
					TH_counter := 0;
				end if;
			end if;
		
			if (data_sel = '0') then
				data <= NOT TH_value(7 downto 0);
			else
				data <= NOT TL_value(7 downto 0);
			end if;
		end if;
		
	END PROCESS;

END pwm_m_architecture;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -