奇数和半整数分频器
EDA技术实用教程—VerilogHDL版(第四版) 教学课件 潘松 黄继业 潘明 第5章 Verilog设计深入
![EDA技术实用教程—VerilogHDL版(第四版) 教学课件 潘松 黄继业 潘明 第5章 Verilog设计深入](https://img.taocdn.com/s3/m/c4dbac020722192e4536f6f7.png)
5.1 过程中的两类赋值语句
5.1.2 非阻塞式赋值
5.1 过程中的两类赋值语句
5.1.3 深入认识阻塞赋值和非阻塞式赋值的特点
5.1 过程中的两类赋值语句
5.1.3 深入认识阻塞赋值和非阻塞式赋值的特点
5.1 过程中的两类赋值语句
5.1.3 深入认识阻塞赋值和非阻塞式赋值的特点
5.1 过程中的两类赋值语句
5.7.1 同步加载模型设计
5.7 模可控计数器设计
5.7.1 同步加载模型设计
5.7 模可控计数器设计
5.7.2 异步加载模型设计
5.7 模可控计数器设计
5.7.2 异步加载模型设计
5.7 模可控计数器设计
5.7.3 异步清0加载模型设计
5.7 模可控计数器设计
5.7.3 异步清0加载模型设计
5.4 乘法器设计及相关语句应用
5.4.2 整数型寄存器类型定义
5.4 乘法器设计及相关语句应用
5.4.3 for语句用法
5.4 乘法器设计及相关语句应用
5.4.3 for语句用法
5.4 乘法器设计及相关语句应用
5.4.4 repeat语句用法
5.4 乘法器设计及相关语句应用
5.4.5 while语句用法ຫໍສະໝຸດ 5.6 三态与双向端口设计
5.6.2 双向端口设计
5.6 三态与双向端口设计
5.6.2 双向端口设计
5.6.3 三态总线控制电路设计
5.6 三态与双向端口设计
5.6 三态与双向端口设计
5.6.3 三态总线控制电路设计
5.6 三态与双向端口设计
5.6.3 三态总线控制电路设计
5.7 模可控计数器设计
5.7 模可控计数器设计
EDA技术与Verilog_HDL(潘松)第6章习题答案
![EDA技术与Verilog_HDL(潘松)第6章习题答案](https://img.taocdn.com/s3/m/cb0e8a6d0b1c59eef8c7b437.png)
6-1 在Verilog设计中,给时序电路清零(复位)有两种不同方法,它们是什么,如何实现?答:同步清零、异步清零,在过程语句敏感信号表中的逻辑表述posedge CLK用于指明正向跳变,或negedge用于指明负向跳变实现6-2 哪一种复位方法必须将复位信号放在敏感信号表中?给出这两种电路的Verilog 描述。
答:异步复位必须将复位信号放在敏感信号表中。
同步清零:always @(posedge CLK) //CLK上升沿启动Q<=D; //当CLK有升沿时D被锁入Q异步清零:always @(posedge CLK or negedge RST) begin //块开始if(!RST)Q<=0; //如果RST=0条件成立,Q被清0else if(EN) Q<=D;//在CLK上升沿处,EN=1,则执行赋值语句end//块结束6-3 用不同循环语句分别设计一个逻辑电路模块,用以统计一8位二进制数中含1的数量。
module Statistics8(sum,A); output[3:0]sum;input[7:0] A;reg[3:0] sum;integer i;always @(A)beginsum=0;for(i=0;i<=8;i=i+1) //for 语句if(A[i]) sum=sum+1;else sum=sum;endendmodule module Statistics8(sum,A); parameter S=4;output[3:0]sum;input[7:0] A;reg[3:0] sum;reg[2*S:1]TA;integer i;always @(A)beginTA=A; sum=0;repeat(2*S)beginif(TA[1])sum=sum+1;TA=TA>>1;endendendmodulerepeat循环语句for循环语句module Statistics8(sum,A);parameter S=8;output[3:0]sum;input[7:0] A;reg[S:1] AT;reg[3:0] sum;reg[S:0] CT;always @(A) beginAT={{S{1'b0}},A}; sum=0; CT=S;while(CT>0) beginif(AT[1])sum=sum+1;else sum=sum;begin CT= CT-1; AT=AT>>1; end end endendmodule6-3 用不同循环语句分别设计一个逻辑电路模块,用以统计一8位二进制数中含1的数量。
基于CPLDFPGA的半整数分频器的设计
![基于CPLDFPGA的半整数分频器的设计](https://img.taocdn.com/s3/m/bc8b5b89844769eae009eddb.png)
基于CPLDFPGA的半整数分频器的设计1 引言在数字逻辑电路设计中,分频器是一种基本电路。
通常用来对某个给定频率进行分频,以得到所需的频率。
整数分频器的实现非常简单,可采用标准的计数器,也可以采用可编程逻辑器件设计实现。
但在某些场合下,时钟源与所需的频率不成整数倍关系,此时可采用小数分频器进行分频。
比如:分频系数为2.5、3.5、7.5等半整数分频器。
笔者在模拟设计频率计脉冲信号时,就用了半整数分频器这样的电路。
由于时钟源信号为50MHz,而电路中需要产生一个20MHz的时钟信号,其分频比为2.5,因此整数分频将不能胜任。
为了解决这一问题,笔者利用VIDL硬件描述语言和原理图输入方式,通过MAX plus II开发软件和ALTERA公司的FLEX系列EPF10K10LC84-4型FPGA方便地完成了半整数分频器电路的设计。
2 小数分频的基本原理小数分频的基本原理是采用脉冲吞吐计数器和锁相环技术先设计两个不同分频比的整数分频器,然后通过控制单位时间内两种分频比出现的不同次数来获得所需要的小数分频值。
如设计一个分频系数为10.1的分频器时,可以将分频器设计成9次10分频,1次11分频,这样总的分频值为:F=(9×10 1×11)/(9 1)=10.1从这种实现方法的特点可以看出,由于分频器的分频值不断改变,因此分频后得到的信号抖动较大。
当分频系数为N-0.5(N为整数)时,可控制扣除脉冲的时间,以使输出成为一个稳定的脉冲频率,而不是一次N分频,一次N-1分频。
图2 模3计数器仿真波形 3 电路组成分频系数为N-0.5的分频器电路可由一个异或门、一个模N计数器和一个二分频器组成。
在实现时,模N计数器可设计成带预置的计数器,这样可以实现任意分频系数为N-0.5的分频器。
图1给出了通用半整数分频器的电路组成。
采用VHDL硬件描述语言,可实现任意模N的计数器(其工作频率可以达到160MHz以上),并可产生模N逻辑电路。
Verilog实现奇数和偶数分频器和半整数及任意小数分频器程序
![Verilog实现奇数和偶数分频器和半整数及任意小数分频器程序](https://img.taocdn.com/s3/m/10456df19e31433239689339.png)
1、半整数分频占空比不为50%//说明:设计的史上最好用的半整数分频占空比不为50%,包含设计思路module div_5(clk,clk_div,cnt1,cnt2,temp1,temp2);//N+0.5input clk;output clk_div;output reg[31:0]cnt1,cnt2;output reg temp1,temp2;initial begin temp1=0;temp2=1;end //首先进行初始化,temp1=0;temp2=1 parameter N=5; //设定分频系数为N+0.5always @(posedge clk) //temp1上升沿跳变beginif(cnt1==2*N) //2*Nbegin cnt1[31:0]<=32'd0;endelse begin cnt1[31:0]<=cnt1[31:0]+32'd1;endif(cnt1==32'd0) begin temp1<=1;end //高电平时间为N+1;if(cnt1==N+1) begin temp1<=0;end//低电平时间为N;endalways@(negedge clk) //temp2下降沿跳变beginif(cnt2==2*N) //2*Nbegin cnt2[31:0]<=32'd0;endelse begin cnt2[31:0]<=cnt2[31:0]+32'd1;endif(cnt2==32'd0) begin temp2<=0;end //低电平时间为N;if(cnt2==N) begin temp2<=1;end //高电平时间为N+1;endassign clk_div=temp1&&temp2; //逻辑与endmodule//如果要进行N+0.5分频//思路:总的来说要进行N+1+N=2N+1次分频//在时钟的上升沿和下降沿都进行跳变//上升沿进行占空比为N+1比N的时钟temp1;//下降沿进行占空比为N比N+1的时钟temp2;//最后div=temp1&&temp2 即可得到所需要的半整数分频分频5.5仿真结果2、奇数分频占空比为50%//说明:奇数分频。
N倍奇数分频器.(Verilog)
![N倍奇数分频器.(Verilog)](https://img.taocdn.com/s3/m/9d7b60d6b14e852458fb57ae.png)
标签:Verilog分频器N倍奇数分频器.(V erilog)N_odd_divider.v / Verilogmodule N_odd_divider (input i_clk,input rst_n,output o_clk);parameter N = N_odd; // 设置奇数(除1外)倍分频parameter M = ?; // M="N/2"// bit_of_N: N_odd的二进制位宽reg [(bit_of_N - 1):0] cnt_p; // 上升沿计数单位reg [(bit_of_N - 1):0] cnt_n; // 下降沿计数单位reg clk_p; // 上升沿时钟reg clk_n; // 下降沿时钟assign o_clk = clk_n & clk_p; // 按位与(作用:掩码)// 上升沿计数器: 0~(N-1)always @ (posedge i_clk or negedge rst_n)beginif (!rst_n)cnt_p <= 0;elsebeginif (cnt_p == N-1)cnt_p <= 0;elsecnt_p <= cnt_p + 1'b1;endend// 生成上升沿时钟// 0~(N>>1) ↑ -> 1;((N/2)+1)~(N-1) ↑ -> 0 always @ (posedge i_clk or negedge rst_n) beginif (!rst_n)clk_p <= 0;elsebeginif (cnt_p <= M) // 0 ~ (N/2)clk_p <= 1;elseendend// 下降沿计数器: 0~(N-1)always @ (negedge i_clk or negedge rst_n) beginif (!rst_n)cnt_n <= 0;elsebeginif (cnt_n == N-1)cnt_n <= 0;elsecnt_n <= cnt_n + 1'b1;endend// 生成下降沿时钟// 0~(N>>1) ↓ -> 1;((N/2)+1)~(N-1) ↓ -> 0 always @ (negedge i_clk or negedge rst_n) beginif (!rst_n)elsebeginif (cnt_n <= M) // 0 ~ (N/2) clk_n <= 1;elseclk_n <= 0;endendendmodule仿真波形图1. N_odd = 3图2. N_odd = 5另见N倍偶数分频器.(Verilog)参考资料1. 真OO 无双的(原創) 如何設計除頻器? (SOC) (Verilog) (MegaCore)2. 位运算.(C)奇数倍分频(Verilog)奇数倍分频的方法:(以5分频为例)(n=N-1),图中,COUNT0采用上沿计数,COUNT1采用下沿计数,DIV0和DIV1是分别是上沿触发器和下沿触发器的输出,计数为0~(n/2-1)时DIV0、DIV1<='1'此处为0~1,计数为n/2~(n-1)时DIV0、DIV1<='0'此处为2~4,DIV5_CLK是DIV0和DIV1的或门输出。
基于FPGA的整数倍分频器设计
![基于FPGA的整数倍分频器设计](https://img.taocdn.com/s3/m/78e9f1577cd184254a353552.png)
基于FPGA的整数倍分频器设计
1、前言
分频器是FPGA设计中使用频率非常高的基本单元之一。
尽管目前在大部分设计中还广泛使用集成锁相环(如Altera的PLL,Xilinx的DLL)来进行时钟的分频、倍频以及相移设计,但是,对于时钟要求不太严格的设计,通过自主设计进行时钟分频的实现方法仍然非常流行。
首先这种方法可以节省锁相环资源,再者这种方式只消耗不多的逻辑单元就可以达到对时钟的操作目的。
2、整数倍分频器的设计
2.1 偶数倍分频
偶数倍分频器的实现非常简单,只需要一个计数器进行计数就能实现。
如需要N分频器(N 为偶数),就可以由待分频的时钟触发计数器进行计数,当计数器从0计数到N/2-1时,将输出时钟进行翻转,并给计数器一个复位信号,以使下一个时钟开始从零计数。
以此循环,就可以实现偶数倍分频。
以10分频为例,相应的verilog代码如下:
regclk_div10;
reg [2:0]cnt;
always@(posedge clk or posedge rst)begin
if(rst)begin //复位
cnt《=0;
clk_div10《=0;
end
elseif(cnt==4)begin
cnt《=0; //清零
clk_div10《=~clk_div10; //时钟翻转
end
else。
《可编程器件与硬件描述语言》课程教学大纲
![《可编程器件与硬件描述语言》课程教学大纲](https://img.taocdn.com/s3/m/babf1d2da31614791711cc7931b765ce05087a91.png)
《可编程器件与硬件描述语言》课程教学大纲课程编号:ABJD0522课程名称:可编程器件与硬件描述语言英文名称:Programmab1eDevicesandHardwareDescription1anguage课程性质:选修课程学分数:4学分课程学时数:40学时授课对象:电子信息工程、电子科学与技术本课程的前导课程:模拟电子、数字电子一、课程简介《可编程逻辑器件》是电子科学与技术专业的一门重要的专业基础选修课,又是一门发展迅速、工程性强、须紧密结合技术发展前沿的现代电子设计技术课程。
它主要是介绍现代数字集成电路的设计方法即EDA技术。
课程在专业培养目标中起着具有承上启下的桥梁作用,通过本课程的学习可以激发学生学习先进的电子电路设计技术的兴趣,培养学生主动探索、努力进取、团结协作的精神。
课程的具体目标是通过本课程及其它相关课程的学习,使学生能够掌握常用的MAX+p1usI1、Quartus11和ispEXPERT等EDA开发软件,及时将学科的最新成果引入教学中,将HD1硬件描述语言编程方法和FPGA的开发技术及符合工程规范的系统设计技术有机地融合在一起,强调理论和实际的联系,培养学生的创新能力和实验动手能力。
在学习电子电路的基础上,了解可编程逻辑器件的基本原理,掌握硬件描述语言,分析用硬件描述语言编程程序的方法和思路,并掌握在软件中对程序调试和实现。
要求学生在掌握理路知识的基础上,重点提高学生的动手能力,并在此基础上,完成本课程的课程设计,学会设计具体电子电路并在FPGA上实现的能力。
二、教学基本内容和要求(-)绪论课程教学内容:了解自底向下的传统数字系统设计方法;熟悉基于CP1D/FPGA现代数字系统设计流程,以及可编程逻辑器件的发展概况课程的重点、难点:重点:如何学习可编程逻辑器件的基本原理难点:可编程逻辑器件的分类。
课程教学要求:掌握:简单P1D的基本结构;理解:EP1D和CP1D的基本结构的区别和关系;了解:现场可编程门阵列主要性能指标。
三、半整数与奇数分频器设计
![三、半整数与奇数分频器设计](https://img.taocdn.com/s3/m/1f67b58302d276a200292e52.png)
实验3半整数与奇数分频器设计一实验目的1熟悉QuartusII的VHDL文本设计流程全过程,学习计数器的设计与仿真2掌握简单逻辑电路的设计方法与功能仿真技巧。
3 学习并掌握用VHDL语言、语法规则4 学习使用VHDL语言进行半整数与奇数分频器的设计二. 实验仪器设备1 PC机,1台2 QuartusII系统三.实验原理1 参考教材中的相关内容;2 根据老师教学演示的相关内容。
四.实验内容用VHDL语言设计一个半整数与奇数分频器,并进行编辑,编译与仿真。
要求(1) 设置时钟信号源;(2) 用VHDL语言对半整数与奇数分频器进行程序设计;(3) 对于所设计的程序进行编译,检查纠错。
(4)程序完善之后进行程序的仿真并进行波形的记录与分析。
五. 实验参考程序占空比为50%的任意奇数次(5)分频电路LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT10 ISPORT (CLK:IN STD_LOGIC; --输入时钟信号K_OR,K1,K2 :OUT STD_LOGIC); --输出信号END;ARCHITECTURE bhv OF CNT10 ISSIGNAL C1,C2:STD_LOGIC_VECTOR(2 DOWNTO 0);SIGNAL M1,M2 :STD_LOGIC;BEGINPROCESS (CLK,C1) --敏感信号BEGINIF RISING_EDGE(CLK) THENIF (C1="100") THEN C1<="000"; ELSE C1<=C1+1; END IF;IF (C1="001") THEN M1<=NOT M1[ELSIF (C1="011") THEN M1<=NOT M1; END IF; END IF;END PROCESS;PROCESS(CLK,C2) BEGINIF FALLING_EDGE (CLK) THENIF (C2="100")THEN C2<="000"; ELSE C2<=C2+1; END IF;IF (C2="001")THEN M2<=NOT M2;ELSIF (C2="011") THEN M2<=NOT M2; END IF;END IF;END PROCESS;K1<=M1; K2<=M2;K_OR<=M1 OR M2;END bhv;六. 实验仿真图形。
通用分频器基本原理
![通用分频器基本原理](https://img.taocdn.com/s3/m/ee4c7bc3f61fb7360b4c65c4.png)
通用分频器基本原理整数分频包括偶数分频和奇数分频,对于偶数N分频,通常是由模N/2计数器实现一个占空比为1:1的N分频器,分频输出信号模N/2自动取反。
对于奇数N分频,上述方法就不适用了,而是由模N计数器实现非等占空比的奇数N分频器,分频输出信号取得是模N计数中的某一位(不同N值范围会选不同位)。
这种方法同样适用于偶数N分频,但占空比不总是1:1,只有2的n次方的偶数(如4、8、16等)分频占空比才是1:1。
这种方法对于奇数、偶数具有通用性。
半整数分频器也是在这种方法基础上实现的。
除了一个模N计数器,还需要一个异或模块和一个2分频模块。
半整数分频器原理如图1所示:半整数分频器设计思想:通过异或门和2分频模块组成一个改变输入频率的脉冲添加电路,也就是说N-0.5个输入信号周期内产生了N个计数脉冲,即输入信号其中的一个含一个脉冲的周期变为含两个脉冲的周期。
而这一改变正是输入频率与2分频输出异或的结果。
由2分频输出决定一个周期产生两个脉冲有两种方式:当一个输入信号来一个脉冲(前半周期)时,2分频输出变为‘1’,clk_in 取反,后半周期就会产生一个脉冲;2分频输出由‘1’变为‘0’时,clk_in 刚把一个周期(前半周期)内低电平变为高电平产生一个脉冲,而后半周期的脉冲与‘0’异或不变。
从而实现N-0.5分频。
要实现奇数、偶数、半整数通用分频器只需再加一个控制选择信号sel。
当sel=‘1’时,clk_in与2分频输出异或,实现半整数分频;当sel=‘0’时,只选通clk_in,实现整数分频。
通用分频器原理如图2所示:Verilog语言的实现本设计采用层次化的设计方法,首先设计通用分频器中各组成电路元件,然后通过元件例化的方法,调用各元件,实现通用分频器。
1、选择异或门模块half_select:modulehalf_select(sel,a,b,c);outputc;inputsel,a,b; xoru1(w,a,b); assignc=sel?w:a; (当sel=‘1’时,clk_in与2分频输出异或,实现半整数分频;当sel=‘0’时,只选通clk_in,实现整数分频。
VHDL语言各种分频器的设计解析
![VHDL语言各种分频器的设计解析](https://img.taocdn.com/s3/m/bac73006366baf1ffc4ffe4733687e21af45ff1b.png)
if(clkin”event and clkin=”1”) then
if(cnt<n-1) then
cnt <= cnt+1;
else
cnt <= 0;e Nhomakorabead if;
end if;
end process;
process(cnt) --依据计数值,把握输出时钟脉冲的高、低电平
begin
if(cnt<n/2) then
port(
clkin: IN std_logic;
clkout: OUT std_logic
);
End fdiv;
Architecture a of fdiv is
signal cnt: integer range 0 to n-1;
Begin process(clkin) --计数
begin
port(
clkin: IN std_logic;
clkout: OUT std_logic
);
End fdiv;
Architecture a of fdiv is
signal cnt: std_logic_vector(N-1 downto 0);
Begin
process(clkin)
ELSE
count <= count-1;
--模N计数器减法计数
clkout <= ”0”;
END IF;
END IF;
END PROCESS;
PROCESS(clkout)
BEGIN
IF(clkout”event AND clkout=”1”) THEN
div2 <= NOT div2; --输出时钟二分频
任意整数、半整数分频器
![任意整数、半整数分频器](https://img.taocdn.com/s3/m/b0fa443731126edb6f1a10f2.png)
任意整数、半整数分频器一、分频原理1.1偶数倍分频偶数倍分频通过计数器计数是很容易实现的。
如进行N倍偶数分频,那么可以通过由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数。
以此循环下去。
这种方法可以实现任意的偶数分频。
1.2奇数倍分频奇数倍分频通过计数器也是比较容易实现的,如进行三分频,通过待分频时钟上升沿触发计数器进行模三计数,当计数器计数到邻近值进行两次翻转,比如可以在计数器计数到1时,输出时钟进行翻转,计数到2时再次进行翻转。
即是在计数值在邻近的1和2进行了两次翻转。
这样实现的三分频占空比为1/3或者2/3。
要实现占空比为50%的三分频时钟,可以通过待分频时钟下降沿触发计数,和上升沿同样的方法计数进行三分频,然后下降沿产生的三分频时钟和上升沿产生的时钟进行相或运算,即可得到占空比为50%的三分频时钟。
这种方法可以实现任意的奇数分频。
归类为一般的方法为:对于实现占空比为50%的N倍奇数分频,首先进行上升沿触发进行模N计数,计数选定到某一个值进行输出时钟翻转,然后经过(N-1)/2再次进行翻转得到一个占空比非50%奇数n分频时钟。
与此同时进行下降沿触发的模N计数,到和上升沿触发输出时钟翻转选定值相同值时,进行输出时钟时钟翻转,同样经过(N-1)/2时,输出时钟再次翻转生成占空比非50%的奇数n分频时钟。
两个占空比非50%的n分频时钟相或运算,得到占空比为50%的奇数n分频时钟。
1.3半整数分频半整数分频需要对输入时钟进行操作。
基本的设计思想:对于进行n-0.5分频,首先进行模n的计数,在计数到n/2-1至n-1时,输出时钟赋为‘1’,回到计数0时,又赋为0,因此,因此,只要保持计数值n-1为半个输入时钟周期,即实现了n-0.5分频时钟,因此保持n-1为半个时钟周期即是一个难点。
从中可以发现,因为计数器是通过时钟上升沿计数,因此可以在计数为n-1时对计数触发时钟进行翻转,那么时钟的下降沿变成了上升沿。
使用VHDL进行分频器设计
![使用VHDL进行分频器设计](https://img.taocdn.com/s3/m/e2d2dfb9e009581b6bd9ebec.png)
使用VHDL 进行分频器设计作者:ChongyangLee摘要使用VHDL 进行分频器设计作者:ChongyangLee本文使用实例描述了在FPGA/CPLD 上使用VHDL 进行分频器设计,包括偶数分频、非50%占空比和50%占空比的奇数分频、半整数(N+0.5)分频、小数分频、分数分频以及积分分频。
所有实现均可通过Synplify Pro 或FPGA 生产厂商的综合器进行综合,形成可使用的电路,并在ModelSim 上进行验证。
目录概述 (1)计数器 (1)普通计数器 (1)约翰逊计数器 (3)分频器 (4)偶数分频器 (4)奇数分频器 (6)半整数分频器 (9)小数分频器 (11)分数分频器 (15)积分分频器 (18)概述分频器是数字电路中最常用的电路之一,在FPGA 的设计中也是使用效率非常高的基本设计。
基于FPGA 实现的分频电路一般有两种方法:一是使用FPGA 芯片内部提供的锁相环电路,如ALTERA 提供的PLL (Phase Locked Loop),Xilinx 提供的DLL(Delay Locked Loop);二是使用硬件描述语言,如VHDL、Verilog HDL 等。
使用锁相环电路有许多优点,如可以实现倍频;相位偏移;占空比可调等。
但FPGA 提供的锁相环个数极为有限,不能满足使用要求。
因此使用硬件描述语言实现分频电路经常使用在数字电路设计中,消耗不多的逻辑单元就可以实现对时钟的操作,具有成本低、可编程等优点。
计数器计数器是实现分频电路的基础,计数器有普通计数器和约翰逊计数器两种。
这两种计数器均可应用在分频电路中。
普通计数器最普通的计数器是加法(或减法)计数器。
下面是加法计数器的VHDL实现,其Synplify Pro下的RTL View如图1所示。
--file Name: ripple.vhd--Description: 带复位功能的加法计数器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity ripple isgeneric (width: integer := 4);port(clk, rst: in std_logic;cnt: out std_logic_vector(width - 1 downto 0));end ripple;architecture a of ripple issignal cntQ: std_logic_vector(width - 1 downto 0);beginprocess(clk, rst)beginif (rst = '1') thencntQ <= (others => '0');elsif (clk'event and clk = '1') thencntQ <= cntQ + 1;end if ; end process ;cnt <= cntQ;end a;代码 1 加法计数器 VHDL 代码图 1 加法计数器 RTL 视图加法计数器的Test Bench 代码如下所示,在ModelSim 下进行功能仿真,仿真 波形结果如图 2所示。
奇数分频器VHDL设计
![奇数分频器VHDL设计](https://img.taocdn.com/s3/m/7f65f61f52d380eb62946d18.png)
奇数分频器1 引言分频器在CPLD/FPGA设计中使用频率非常高,尽管目前大部分设计中采用芯片厂家集成的锁相环资源,但是对于要求奇数倍分频、小数倍分频的应用场合却往往不能满足要求。
硬件工程师希望有一种灵活的设计方法,根据需要,在实验室就能设计分频器并马上投入使用,更改频率时无需改动原器件或电路板,只需重新编程,在数分钟内即可完成。
对于偶数分频,使用一模N计数器模块即可实现,即每当模N计数器从0开始计数至N时,输出时钟进行翻转,同时使计数器复位,使之从0开始重新计数,以此循环即可实现。
但对于奇数分频,实现50%的占空比却是比较困难的。
下面给出占空比50%的奇数分频器的设计源程序和仿真结果。
2 VHDL程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;--添加库ENTITY fdiv IS --设计实体PORT( clk,reset : IN STD_LOGIC;--端口说明preset: IN INTEGER;--preset:分频预置数clkout : OUT STD_LOGIC);- -clkout :分频后得到的时钟END fdiv;ARCHITECTURE behave OF fdiv IS--设计构造体SIGNAL s1,s2 : STD_LOGIC;--内部信号s1,s2 SIGNAL cnt : INTEGER RANGE 0 TO preset-1;--模为preset的计数信号BEGINP1: PROCESS(clk,reset) --计数器BEGINIF reset='1' THENcnt<=0;ELSIF clk'event AND clk='1' THENIF cnt=0 THENcnt<=preset-1;ELSEcnt<=cnt-1;END IF;END IF;END PROCESS;P2: PROCESS(clk,reset) --信号1 BEGINIF reset='1' THENs1<='1';ELSIF clk'event AND clk='1' THENIF cnt=0 THEN --计数信号为0时,S1翻转s1<=NOT s1;ELSEs1<=s1;END IF;END IF;END PROCESS;P3: PROCESS(clk,reset) --信号2 BEGINIF reset='1' THENs2<='1';ELSIF clk'event AND clk='0' THENIF cnt=(preset-1)/2 THEN --计数信号为N时,S2翻转s2<=NOT s2;ELSEs2<=s2;END IF;END IF;END PROCESS;clkout<= s1 XOR s2; -- 异或输出END BEHA VE;程序说明:以上程序实现任意奇数为PRESET的50%占空比分频,计数器CNT的模值为PRESET,计数器是为了控制信号S1和信号S2,使两信号保持恒定的时间差。
奇数通用分频器
![奇数通用分频器](https://img.taocdn.com/s3/m/3386c73e31126edb6f1a109f.png)
每次除了修改N的设置,还需将reg[x:0] S1,S2处的x根据N来进行修改,这个是它的缺点。
教师评语及评分:
签名:年月日
云南师范大学教务处编印
实验序号
408
实验名称
奇数倍分频器的设计
实验时间
2014.4.8
实验室
信息学院110教室
一.实验预习
1.实验目的
(1)学会3分频器的设计和实现;
(2)实现奇数通用分频器的设计。
2.实验原理、实验流程或装置示意图
实验原理:
(1)根据波形图设计三分频的程序
波形图如下:
(2)对3分频做修改,实现奇数通用分频器。
4.实验方法步骤及注意事项
实验步骤如下:
(1)3分频器的设计及实现
A:程序代码设计及编译结果:
B:波形图设计及实现:
二.实验内容
(2)奇数通用分频器的设计
A:程序代码设计:
B:波形图验证:
5分频器
31分频器
2.对实验现象、实验结果的分析及其结论
9分频器:
61分频器:
二、实验内容
1.实验现象及结果
(1)实验现象如上所示,结果正确。
(2)奇数通用分频器的程序代码结果虽然正确,但还有可改善之处。
(2)这是在Quartus II 9.0软件下的测试结果,并没有在试验箱上进行验证。
2.对实验现象、实验结果的分析及其结论
(1)奇数分频器的设计实际上就是将两个分频器或后所得,而这两个分频器只需将最终奇数分频器的高电平设置为N-1 : 1和1 : N-1即可,低电平保持与所得奇数分频器一致。
实验流程或装示意图:
(1)新建工程------新建顶层文件------编写程序------编译------仿真验证------分配管脚------下载到试验箱
关于分频器的FPGA实现整理思路
![关于分频器的FPGA实现整理思路](https://img.taocdn.com/s3/m/ad84511854270722192e453610661ed9ad5155c1.png)
关于分频器的FPGA实现整理思路分频器是⽤的最⼴的⼀种FPGA电路了,我最初使⽤的是crazybingo的⼀个任意分频器,可以实现⾼精度任意分频的⼀个通⽤模块,他的思想在于⾸先指定计数器的位宽⽐如32位,那么这个计数器的最⼤值就是2^32=4294967296,假设系统时钟为50MHz,那么假如要想实现输出频率为fout,那么可以使⽤的频率控制字为:K满⾜关系:,那么设计计数器在每个时钟上升沿累加的值为K,当计数值为2^31时,clkout=1;否则clkout=0.最终即可以实现任意频率的输出,精度的计算⽅法为当K=1时,可以得到clkout=0.0116415321826934814453125Hz,也即是说可以输出的最⼩频率为0.011Hz此外我们最为常见的分频器分为以下4种分析:1.偶数分频最简单,要想得到分频系数为N的频率输出,设定⼀个计数器,这个计数器从零开始加1,当加到N/2-1时计数器清零,或者clkout翻转,以此循环,即可实现偶数倍分频。
2.奇数分频(分占空⽐不确定以及占空⽐50%)⽅法⼀:分频系数为N,占总⽐不确定:以三(N)分频为例,上升沿触发计数,计数器计数到1(N-1)/2时输出时钟翻转,计数到2(N-1)时再次翻转.代码为产⽣1/11占空⽐为⼗⼀分频时钟:在计数值为9和10时均反转时钟,是产⽣抽样脉冲的有效⽅法:always @(posedge clk or posedge rst) beginif(rst)begin//复位cnt<=0;clk_div11<=0;endelseif(cnt==9) beginclk_div11<=~clk_div11; //时钟翻转cnt<=cnt+1; //继续计数endelseif(cnt==10) beginclk_div11<=~clk_div11; //时钟翻转cnt<=0; //计数清零endelsecnt<=cnt+1;end占空⽐50% ,则可以在上⾯的基础上,加上⼀个下降沿触发计数,然后将上升沿和下降沿产⽣的时钟进⾏相或运算,即可得到奇数分频输出。
半整数分频器的VHDL设计
![半整数分频器的VHDL设计](https://img.taocdn.com/s3/m/4e6b1d38376baf1ffc4fadad.png)
© 1995-2005 Tsinghua Tongfang Optical Disc Co., Ltd. All rights reserved.
林海波 :半整数分频器的 VHDL 设计
61
在 VHDL 中 ,对某个数字系统的硬件抽象称为 实体 ( ENTITY) 。实体既可以单独存在 ,也可以作为 另一个更大实体的一部分 。实体声明定义了一个设 计模块的输入和输出端口 ,即模块对外的特性 。也 就是说 ,实体声明给出了设计模块与外部的接口 ,如 果是顶层模块的话 ,就给出了芯片外部引脚定义 。 一个设计可以包括多个实体 ,描述一个实体的对外 特性及其功能 ,是设计的主要任务 。然而 ,实体只描 述了模块对外的特性 ,并没有给出模块的具体实现 。 模块的具体实现或内部具体描述由结构体 (Archi2 tecture) 来完成 ,每个实体都有与其对应的结构体语 句 ,它既可以是一个算法 ,也可以是一个结构网表 。 具体一个实体的 VHDL 程序设计的基本语法结构 如下 :
除脉冲的时间 ,使输出为一个稳定的脉冲频率 ,而不
是一次 N 分频 ,一次 N - 1 分频 。 3. 2 电路组成
分频系数为 N - 0. 5 的分频器 ,其电路可由一 个异或门 、一个模 N 计数器和二分频器组成 。在实 现时 ,模 N 计数器可设计成带预置的计数器 ,这样 可以实现任意分频系数为 N - 0. 5 的分频器 。图 1 给出了通用半整数分频器电路组成 。
表 1 半整数分频器适配分析结果
选用器件
I/ O 延迟时间 使用引脚数 工作频率
/ ns
/ MHz
EPF10 K10LC84 - 4
14. 6 6/ 84 (7. 2 %) 52. 63MHz
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
奇数分频器
1 引言
分频器在CPLD/FPGA设计中使用频率非常高,尽管目前大部分设计中采用芯片厂家集成的锁相环资源,但是对于要求奇数倍分频、小数倍分频的应用场合却往往不能满足要求。
硬件工程师希望有一种灵活的设计方法,根据需要,在实验室就能设计分频器并马上投入使用,更改频率时无需改动原器件或电路板,只需重新编程,在数分钟内即可完成。
对于偶数分频,使用一模N计数器模块即可实现,即每当模N计数器从0开始计数至N时,输出时钟进行翻转,同时使计数器复位,使之从0开始重新计数,以此循环即可实现。
但对于奇数分频,实现50%的占空比却是比较困难的。
下面给出占空比50%的奇数分频器的设计源程序和仿真结果。
2 VHDL程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;--添加库
ENTITY fdiv IS --设计实体PORT( clk,reset : IN STD_LOGIC;--端口说明preset: IN INTEGER;--preset:分频预置数clkout : OUT STD_LOGIC);- -clkout :分频后得到的时钟END fdiv;
ARCHITECTURE behave OF fdiv IS--设计构造体SIGNAL s1,s2 : STD_LOGIC;--内部信号s1,s2 SIGNAL cnt : INTEGER RANGE 0 TO preset-1;--模为preset的计数信号BEGIN
P1: PROCESS(clk,reset) --计数器BEGIN
IF reset='1' THEN
cnt<=0;
ELSIF clk'event AND clk='1' THEN
IF cnt=0 THEN
cnt<=preset-1;
ELSE
cnt<=cnt-1;
END IF;
END IF;
END PROCESS;
P2: PROCESS(clk,reset) --信号1 BEGIN
IF reset='1' THEN
s1<='1';
ELSIF clk'event AND clk='1' THEN
IF cnt=0 THEN --计数信号为0时,S1翻转s1<=NOT s1;
ELSE
s1<=s1;
END IF;
END IF;
END PROCESS;
P3: PROCESS(clk,reset) --信号2 BEGIN
IF reset='1' THEN
s2<='1';
ELSIF clk'event AND clk='0' THEN
IF cnt=(preset-1)/2 THEN --计数信号为N时,S2翻转s2<=NOT s2;
ELSE
s2<=s2;
END IF;
END IF;
END PROCESS;
clkout<= s1 XOR s2; -- 异或输出END BEHA VE;
程序说明:以上程序实现任意奇数为PRESET的50%占空比分频,计数器CNT的模值为PRESET,计数器是为了控制信号S1和信号S2,使两
信号保持恒定的时间差。
信号S1为上升沿触发,在CNT=0时翻转,信号S2为下降沿触发,在CNT=(PRESET-1)/2 时翻转。
然后将S1和S2异或输出,这样就实现了PRESET的50%占空比分频。
3 仿真波形
本设计选用的是FLEX10K系列器件,仿真波形如图所示。
图中预置值为7,即分频器分频值为7,由图中的波形可以看出,结果正确。
波形分析:计数器CNT的模值为7,信号S1是上升沿触发,CNT=0时翻转,S2是下降沿触发,CNT=(7-1)/2=3时翻转,然后将S1和S2异或输出,这样就实现了50%占空比的7分频。
半整数分频器
1引言
在数字系统设计中,分频器是一种基本电路。
整数分频器的实现非常简单,可采用标准的计数器来实现。
但在某些场合下,时钟源所给频率与所需频率不成整数倍关系,譬如把12MHZ的时钟频率分频为1.024MHZ 的时钟,分频系数为11.71875,此时可采用小数分频器进行分频。
这类问题在通信ASIC的设计中用的比较多。
作为小数分频器的一个特例,本程序完成的是半整数分频器的设计。
2半整数分频器的基本原理
设有一个5MHZ的时钟源,但电路中需要产生一个2MHZ的时钟信号,这时就需要设计一个分频比为2.5的分频器,可采用以下方法:设计一个模3的计数器,再设计一个扣除脉冲电路,加在模3计数器输出之后,每来两个脉冲就扣除一个脉冲,就可以得到分频系数为2.5的小数分频器。
实现扣除的电路是由二分频器和异或逻辑组成。
采用类似的方法,可以设计出分频系数为任意半整数的分频器。
3电路组成
设需要设计一个分频系数为N-0.5的分频器,其电路可由一个模N计数器、二分频器和一个异或门组成,如图(一)所示。
图(一)通用半整数分频器电路组成
4VHDL程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY decount IS
PORT(inclk: IN STD_LOGIC;--时钟源preset: IN STD_LOGIC_VECTOR(3 DOWNTO 0);--预置分频值N outclk: BUFFER STD_LOGIC);--输出时钟END decount;
ARCHITECTURE decount_arch OF decount IS
SIGNAL clk,divide2: STD_LOGIC;--clk:异或门输出;
--divide2:二分频器输出SIGNAL count: STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
clk<=inclk XOR divide2;--inclk与divide2异或后,
--作为模N计数器的时钟PROCESS(clk)
BEGIN
IF(clk'event and clk='1') THEN
IF(count="0000") THEN
count<=preset-1;--置整数分频值N
outclk<='1';
ELSE
count<=count-1; --模N计数器减法计数
outclk<='0';
END IF;
END IF;
END PROCESS;
PROCESS(outclk)
BEGIN
IF(outclk'event and outclk='1') THEN
divide2<=not divide2;--输出时钟二分频END IF;
END PROCESS;
END decount_arch;
说明:以上程序实现对时钟源inclk进行分频系数为N-0.5的分频,得
到输出频率outclk。
Preset输入端口是预置分频值N,本程序中preset设为4位宽的位矢量,即分频系数为16以内的半整数值。
若分频系数大于16,需同时增大preset和count的位宽,两者的位宽应始终一致。
5 仿真波形
本设计选用的是MAX7000系列的EPM7032LC44-15器件实现,仿真波形如图(二)所示。
图中预置值设为3,即分频器分频值为2.5,由图中outclk与inclk的波形可以看出,outclk会在inclk每隔2.5个周期处产生一个上升沿,从而实现分频系数为2.5的分频器。
图(二)仿真结果。