IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> VHDL-任意分频器(50%占空比) -> 正文阅读

[C++知识库]VHDL-任意分频器(50%占空比)

前言

去年寒假前我的一个亲戚问我如何做一个五分频的分频器。我想这还不简单,不就是个计数器吗,但是发现并没有那么简单,因为偶数分频器根据上升沿计数就可以了,但是奇数分频器也可以,但是没法做到50%占空比。今天课上老师完美的解决了这个问题。

偶分频

我们之前学习过计数器,偶分配无非就是个计数器嘛,用信号做中间变量要注意他是滞后变值,所以修改的时候要考虑清除。这点没什么好说的直接上代码。

library ieee;  
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity Test is
	generic(constant N:integer:=6);
	port(signal clk:in std_logic;signal cout:out std_logic);
end Test;
architecture even of Test is
	signal temp:integer:=0;
	constant half:integer:=N/2;
begin
	process(clk)
	begin
	if rising_edge(clk) then
		temp<=temp+1;
		if temp<half then
			cout<='1';
		elsif temp<N-1 then
			cout<='0';
		else
			temp<=0;
			cout<='0';
		end if;
	end if;
	end process;
end even;

这里我们可以实现一个偶数分频。这个想必大家都没问题,那么我们继续看奇数分频

奇数分频

我们很容易想到奇数分频的50%的占空比肯定是和上升沿和下降沿都有关系,那么我们对上升沿和下降沿都做计数,来看一下效果。
在这里插入图片描述
我们发现只有当两个方向的状态均为0时才为0
因为正方向看,他会有半个时钟周期的延迟,这样就可以做到3.5个周期的高电平了。那么剩下的自然就是低电平。

library ieee;  
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity div_any is
	generic(constant N:integer:=5);
	port(signal clk:in std_logic;signal cout:out std_logic);
end div_any;
architecture even of div_any is
	signal tempA,tempB:integer:=0;
	signal coutA,coutB:std_logic;
	constant half:integer:=N/2;
begin
	process(clk)
	begin
	if rising_edge(clk,coutA,coutB) then
		tempA<=tempA+1;
		if tempA<half then
			coutA<='1';
		elsif tempA<N-1 then
			coutA<='0';
		else
			tempA<=0;
			coutA<='0';
		end if;
	elsif falling_edge(clk) then
		tempB<=tempB+1;
		if tempB<half then
			coutB<='1';
		elsif tempB<N-1 then
			coutB<='0';
		else
			tempB<=0;
			coutB<='0';
		end if;
	end if;
	cout<=coutA or coutB;
	end process;
end even;

任意分频

那么如何实现任意分频呢?
我们可以发现,如果当前是偶数,那么直接与上升沿的一样就可以了。不过我们这里做一下特判,1的情况。
下面代码通过输入分频值来更改分频状态。

library ieee;  
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity div_any is
	port(signal clk:in std_logic;
	signal scaler:in integer range 0 to 63;
	signal clk_out,clk_f,clk_r:out std_logic);
end div_any;
architecture DIV of div_any is
	signal f_count:integer range 0 to 63:=0;
	signal r_count:integer range 0 to 63:=0;
	signal half:integer;
	signal even:integer;
	signal clk_f_temp,clk_r_temp:std_logic;
begin
	half<=scaler/2;
	even<= scaler rem 2;
	with even*scaler select
	clk_out<=clk_r_temp 						when 0,
				clk 								when 1,
				clk_f_temp or clk_r_temp 	when others;
	process(clk,scaler)
	begin
		if rising_edge(clk) then
			r_count<=r_count+1;
			if r_count<half then
				clk_r_temp<='1';
			elsif r_count<scaler-1 then
				clk_r_temp<='0';
			else
				clk_r_temp<='0';
				r_count<=0;
			end if;
		elsif falling_edge(clk) then
			f_count<=f_count+1;
			if f_count<half then
				clk_f_temp<='1';
			elsif f_count<scaler-1 then
				clk_f_temp<='0';
			else
				clk_f_temp<='0';
				f_count<=0;
			end if;
		end if;
	end process;
	clk_f<=clk_f_temp;
	clk_r<=clk_r_temp;
end DIV;

By-Round Moon

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 18:17:37  更:2022-04-22 18:17:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:07:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码