任意分频的verilog语言实现
数控分频verilog

EDA实验报告数控分频器实验目的1.掌握数控分频器的工作原理并能够用virlog语言编写代码,熟悉EDA6000实验箱的使用方法。
2.进一步熟悉quartusII建立程序编译、仿真及下载的操作流程并学会数控分频器的V erilog硬件设计实验步骤1.新建V erilog工程,编写代码并保存至与模块名对应的文件夹。
注意:项目应存为系统盘以外的盘内,路径中不含中文字符。
2.编译程序,编译无误后,在【tools】里面选择RTL视,观察电路结构。
3.新建波形文件进行仿真。
保存时要和源程序存放在同一目录下。
设置好输入波形参数后,开始仿真。
在仿真后输入输出波形中观察逻辑关系是否正确。
4.将实验箱和PC合理连接起来。
打开EDA6000软件,设置好芯片类型为ACEX1K(EP1K30TC144-3),载入模式9.5.根据EDA6000界面内管脚对应芯片的实际管脚在QUARTUSII里面设定管脚号并检查无误。
6.将程序下载至FPGA内,并在EDA6000软件界面内进行验证测试。
程序代码1/////偶数分频占空比50%,奇数分频没做要求//////////module divider(clk,data,fout); //数控分频器input clk; //时钟输入input[7:0]data; //预置数控分频数(对应的十进制数)output fout; //分频输出reg [7:0]m;reg cout1;always @(posedge clk)beginif(m==data-1)begin m<=0;cout1=~cout1;endelse m<=m+1;if(m==(data-1)/2)begin cout1=~cout1;endelse begin cout1<=cout1;endendassign fout=cout1;endmodule/////奇数分频占空比50%//////////////////////////////////// ////////// module divider1(clk,data,fout,cout1,cout2); //数控分频器input clk; //时钟输入input[7:0]data; //预置分频数output fout,cout1,cout2; //分频输出reg [7:0]m,n;reg cout1,cout2;wire fout;assign fout=cout1|cout2;always @(posedge clk)beginif(m==data-1)begin m<=0;cout1=~cout1;endelse m<=m+1;if(m==(data-1)/2)begin cout1=~cout1;endelse begin cout1<=cout1;endendalways @(negedge clk)beginif(n==data-1)begin n<=0;cout2=~cout2;endelse n<=n+1;if(n==(data-1)/2)begin cout2=~cout2;endelse begin cout2<=cout2;endendendmodule编译结果1。
基于FPGA的任意小数分频器的设计(正文).

邵阳学院课程设计第1章绪论1.1 课题背景当今社会是数字化的社会,是数字集成电路广泛应用的社会。
数字集成电路本身在不断地进行更新换代。
它由早期的电子管、晶体管、小中规模集成电路,发展到超大规模集成电路( VLSIC ,几万门以上)以及许多具有特定功能的专用集成电路。
但是,随着微电子技术的发展,设计与制造集成电路的任务已不完全由半导体厂商来独立承担。
系统设计师们更愿意自己设计专用集成电路(ASIC )芯片,而且希望ASIC 的设计周期尽可能短,最好是在实验室里就能设计出合适的ASIC 芯片,并且立即投入实际应用之中,因而出现了现场可编程逻辑器件(FPLD),其中应用最广泛的当属现场可编程门阵列( FPGA)和复杂可编程逻辑器件(CPLD)。
1.2 研究的目的及意义目的是一方面使我们能够进一步理解课程内容,基本掌握 EDA 技术和系统知识,增加集成电路应用知识,培养我们的实际动手能力以及分析、解决问题的能力。
另一方面也可以是我们更好地巩固和加深对基础知识的理解,学会设计中小型数字系统的方法,独立完成调试过程,增强我们理论联系实际的能力,提高电路分析和设计能力。
通过实践引导我们在理论指导下有所创新,为专业课的学习和日后工程实践奠定基础。
通过设计,一方面可以加深我们对理论知识的理解,另一方面也可以提高我们考虑问题的全面性,将理论知识上升到一个实践的阶段。
1.3EDA的发展历程及应用1.3.1 EDA 的发展历程随着集成电路和计算机技术的飞速发展,EDA (Electronic Design Automation)应运而生,它是一种高级、快速、有效的电子设计自动化技术。
EDA 技术以计算机为工具,代替人完成数字系统的逻辑综合、布局布线和设计仿真等工作。
设计者只需要完成对系统功能的描述,然后就可以由计算机来处理这些描述,得到设计结果,修改设计也很方便。
利用EDA 工具进行设计,可以极大的提高设计效率。
EDA 技术的发展经历了一个由浅到深的过程。
分频系数为5的小数分频器verilog代码

分频系数为5的小数分频器Verilog代码1. 引言在数字电路设计中,分频器是一种常见的电路模块,用来将输入的时钟信号分频成较低频率的输出信号。
而小数分频器则是一种特殊的分频器,可以将输入的时钟信号按照小数进行分频。
在本文中,我们将讨论分频系数为5的小数分频器的Verilog代码设计。
2. 设计思路分频系数为5的小数分频器可以通过累加器和比较器的组合来实现。
具体的设计思路如下:- 我们需要一个累加器来对输入时钟信号进行累加,累加的阈值为5。
- 当累加器的值达到5时,触发一个使能信号,将输出信号置高,同时清零累加器的值。
- 输出信号的高电平持续一个时钟周期,然后重新开始累加。
3. Verilog代码```verilogmodule FractionalDivider (input wire clk,input wire rst,output reg out);reg [2:0] count;always @(posedge clk or posedge rst) beginif (rst) begincount <= 3'b0;out <= 1'b0;end else beginif (count == 3'b100) begincount <= 3'b0;out <= 1'b1;end else begincount <= count + 1'b1;out <= 1'b0;endendendendmodule```4. 代码解释- 该Verilog模块名为FractionalDivider,包含一个时钟信号输入clk,一个复位信号输入rst,一个分频后的输出信号out。
- 使用一个3位寄存器count来实现累加器的功能,用于累加输入时钟信号。
- 累加器的阈值设置为3'b100,即5。
- 当累加器的值达到5时,输出信号out置高,持续一个时钟周期,然后重新开始累加。
verilog时钟分频设计

verilog时钟分频设计1.偶分频模块设计偶分频意思是时钟模块设计最为简单。
首先得到分频系数M和计数器值N。
M = 时钟输入频率 / 时钟输出频率N = M / 2如输入时钟为50M,输出时钟为25M,则M=2,N=1。
偶分频则意味着M为偶数。
以M=4,N=2为例,我们希望得到的输出时钟时序如下:因此只需要将counter以clk_in为时钟驱动计数,当counter = (N-1)时,clk_out翻转即可。
verilog代码如下,其中WIDTH为(N的位宽-1):module time_adv_even #(parameter N = 2,WIDTH = 7)(input clk,input rst,output reg clk_out);reg [WIDTH:0]counter;always @(posedge clk or posedge rst) beginif (rst) begin// resetcounter <= 0;endelse if (counter == N-1) begincounter <= 0;endelse begincounter <= counter + 1;endendalways @(posedge clk or posedge rst) beginif (rst) begin// resetclk_out <= 0;endelse if (counter == N-1) beginclk_out <= !clk_out;endendendmoduletestbench测试8分频即N=4,ISE仿真结果如下:2.奇分频模块设计奇分频需要通过两个时钟共同得到。
首先得到分频系数M和计数器值N。
M = 时钟输入频率 / 时钟输出频率N = (M-1) / 2如输入时钟为50M,输出时钟为10M,则M=5,N=2。
奇分频则意味着M为奇数。
分频器电路的Verilog设计

6. 偶数分频器的设计rate=even(偶数),占空比50%设计原理:定义一个计数器对输入时钟进行计数,(1)在计数的前一半时间里,输出高电平,(2)在计数的后一半时间里,输出低电平,这样输出的信号就是占空比为50%的偶数分频信号。
例如,设计一个6分频电路。
对什么计数?①计数值为0~2输出高电平,②计数值为3~5输出低电平。
上升沿计数一个计数周期0112分频module divder_even(clkin,clkout);parameter n=2;input clkin;output clkout;integer cnt;reg clkout;always@(posedge clkin)beginif(cnt<n-1) cnt<=cnt+1;else cnt<=0;endalways@(cnt)beginif(cnt<n/2) clkout<=1'b1;else clkout<=1'b0;end endmodule计数过程判断赋值过程module divder_even(clkin,clkout);parameter n=2;input clkin;output clkout;integer cnt;reg clkout;always@(posedge clkin)beginif(cnt==n/2-1)begincnt<=0;clkout<=~clkout;endelse cnt<=cnt+1;endendmodule 2分频分析4分频分析二分频四分频知识小结1.移位寄存器的verilog描述。
2.偶数分频的verilog描述。
作业1.设计一个5位串入并出的移位寄存器。
Clear :同步清零;clkin :时钟输入;databit :位输入y[4..0]并行数据输出;2.设计一个4位并入串出的移位寄存器Clear :同步清零;clkin :时钟输入(移位);dataIn :并行数据输入,y :串行数据输出。
verilog 小数 分频 代码

verilog 小数分频代码Verilog是一种硬件描述语言,用于设计和模拟数字电路。
在数字电路中,频率分频器是一种常见的电路,用于将输入时钟信号的频率降低到较低的频率。
本文将介绍使用Verilog设计小数分频器的代码。
小数分频器是一种可以将输入时钟信号的频率降低到一个非整数倍的频率的电路。
在Verilog中,我们可以使用计数器和比较器来实现小数分频器。
首先,我们需要定义输入和输出信号的位宽。
假设输入时钟信号的频率为f_in,输出时钟信号的频率为f_out。
我们可以将f_in和f_out的小数部分表示为两个整数:f_in_fraction 和f_out_fraction。
接下来,我们可以使用一个计数器来计数输入时钟信号的上升沿的个数。
当计数器的值达到f_in_fraction时,我们可以将输出时钟信号的电平翻转,并将计数器重置为0。
这样,我们就可以实现一个简单的小数分频器。
下面是使用Verilog实现小数分频器的代码:```verilogmodule Fractional_Divider (input wire clk_in,output wire clk_out);parameter f_in_fraction = 1; // 输入时钟信号的小数部分 parameter f_out_fraction = 2; // 输出时钟信号的小数部分 reg [31:0] count;reg output_state;reg clk_out_temp;always @(posedge clk_in) beginif (count == f_in_fraction-1) begincount <= 0;output_state <= ~output_state;end else begincount <= count + 1;endendalways @(posedge clk_in) beginif (count == f_in_fraction-1) beginclk_out_temp <= output_state;endendalways @(posedge clk_in) beginif (count == f_in_fraction-1) beginclk_out <= clk_out_temp;endendendmodule```在上述代码中,我们定义了一个名为Fractional_Divider的模块,它有一个输入信号clk_in和一个输出信号clk_out。
分频器设计——50MHZ(含verilog程序)
分频器设计一、实验目的1、熟悉分频器的原理;2、掌握采用Verilog HDL 语言设计分频器的方法;3、进一步学习利用VerilogHDL 语言进行层次设计的方法。
二、实验内容1、采用Verilog 语言设计一个十分频器,记录Verilog 程序;2、对十分频器进行功能仿真,观察仿真波形;3、仿真没有问题后,将分频比改为50000000,实现一个50M 分频器。
利用此分频器和开发板上的50MHz 时钟信号,得到1Hz 的秒脉冲信号,完成如图1-2.28所示的秒计数器。
50M分频器50MHz 脉冲信号二位十进制计数器1Hz 秒脉冲数码管(个位)数码管(十位)复位和计数使能(拨码开关)程序设计如下:module fenp(clk_out,clk_in,reset);output clk_out;input clk_in;input reset;reg [1:0] cnt;reg clk_out;always@(posedge clk_in or posedge reset)beginif(reset)begincnt<=0;clk_out<=0;endelsebeginif(cnt==24999999)beginclk_out<=!clk_out;cnt<=0;endelsecnt<=cnt+1;endendendmodule本程序经验证,完全可以实现实验要求。
文章来自某大学EDA实验课。
3分频 verilog代码
module sanfenpin(reset,clk,a,b,c); input reset,clk; output a,b,c; reg a,b; wire c; reg[3:0] i,j;
assign c=a&b; always@(posedge clk) if(!reset) begin a<=0; j<=0; end else begin if(j==2) begin a<=0; j<=0; end else begin a<=1; j<=j+1; end end
always@(negedge clk) if(!reset) begin b<=0; i<=0; end else begin if(i==2) begin b<=0; i<=0; end else begin b<=1; i<=i+1; end
end endmodule
`timescale 1ns/100ps `define clk_cycle 50 module testfen; reg clk,reset; wire a,b,c; always #`clk_cycle clk=~clk; initial begin reset=1; clk=0; #100 reset=0; #100 reset=1; #10000 $stop; end sanfenpin sanfenpin(.reset(reset),.clk(clk),.a(a),.b(b),.c(c)); endmodule
verilog 分频器
2
第一章 Verilog HDL数字设计综述论
偶数分频16倍频
module clk_div_16(clk_in,rst_n,clk_out); input clk_in; input rst_n; output clk_out; reg [2:0] cnt; reg clk_out_t;
3
第一章 Verilog HDL数字设计综述论 always@(posedge clk_in) begin if(!rst_n) begin cnt<=0; clk_out_t<=0; end else begin if(cnt==3'b111) begin cnt<=3'b000; clk_out_t<=~clk_out_t; end else begin cnt<=cnt+3'b001; end end end
8
第一章 Verilog HDL数字设计综述论
always@(posedge clk_in) begin if(!rst) begin clk_1<=0; cnt1<=0;end else if(cnt1==4) begin clk_1<=~clk_1; cnt1<=0; end else if(cnt1==2) begin clk_1<=~clk_1; cnt1<=cnt1+1; end else begin clk_1<=clk_1; cnt1<=cnt1+1; end end
5
第一章 Verilog HDL数字设计综述论
奇数分频3倍频
module clk_div_3(clk_in,rst_n,clk_out, clk_p,clk_n); input clk_in; input rst_n; output clk_out; output clk_p,clk_n; reg [1:0] cnt,cnt1; reg clk_1to3p, clk_1to3n;
verilog实验四分频器
Verilog HDL实验报告Verilog 实验报告题目:分频器系部名称:通信工程专业名称:通信工程班级:班内序号:学生姓名:时间:2010.12.12一、实验要求:设计一个将10MHz时钟分频为500KHz的时钟,有复位端;二、实验内容:源文件module fenpin(clr,a,b);input a;input clr;output b;integer i=0;reg b;always @(negedge clr or posedge a)if(!clr)beginb=0;i=0;endelsebegini=i+1;if(i==11)beginb=~b;i=1;endendendmodule测试文件`timescale 10ns/100psmodule fenpin_test;reg a;reg clr;wire b;fenpin u1(clr,a,b);initialbegin$monitor($time,"clr=%b,a=%b,b=%b",clr,a,b);clr=1'b0;a=1'b0;#5 clr=1'b1;endalways#5 a=~a;endmodule# 0clr=0,a=0,b=0 # 5clr=1,a=1,b=0 # 10clr=1,a=0,b=0 # 15clr=1,a=1,b=0 # 20clr=1,a=0,b=0 # 25clr=1,a=1,b=0 # 30clr=1,a=0,b=0 # 35clr=1,a=1,b=0 # 40clr=1,a=0,b=0 # 45clr=1,a=1,b=0 # 50clr=1,a=0,b=0 # 55clr=1,a=1,b=0 # 60clr=1,a=0,b=0 # 65clr=1,a=1,b=0 # 70clr=1,a=0,b=0 # 75clr=1,a=1,b=0 # 80clr=1,a=0,b=0 # 85clr=1,a=1,b=0 # 90clr=1,a=0,b=0 # 95clr=1,a=1,b=1 # 100clr=1,a=0,b=1 # 105clr=1,a=1,b=1 # 110clr=1,a=0,b=1 # 115clr=1,a=1,b=1 # 120clr=1,a=0,b=1 # 125clr=1,a=1,b=1 # 130clr=1,a=0,b=1 # 135clr=1,a=1,b=1三、实验心得:通过本实验,我更加熟悉了Verilog这门语言并能使用ModelSim软件,能自己设计编写一些程序和其测试文件,并将测试结果输出,验证理论的学习,加深理论知识的理解;这样可以更直观形象的理解各种电路器件的工作,有助于今后的学习。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. 偶数倍(2N)分频
使用一模N计数器模块即可实现,即每当模N计数器上升沿从0开始计数至N-1
时,输出时钟进行翻转,同时给计数器一复位信号使之从0开始重新计数,以此
循环即可。偶数倍分频原理示意图见图1。
2. 奇数倍(2N+1)分频
(1)占空比为X/(2N+1)或(2N+1-X)/(2N+1)分频,用模(2N+1)计数器
模块可以实现。取0至2N-1之间一数值X(0,当计数器时钟上升沿从0开始计
数到X值时输出时钟翻转一次,在计数器继续计数达到2N 时,输出时钟再次翻
转并对计数器置一复位信号,使之从0开始重新计数,即可实现。
(2)占空比为50%的分频,设计思想如下:基于(1)中占空比为非50%的输
出时钟在输入时钟的上升沿触发翻转;若在同一个输入时钟周期内,此计数器的
两次输出时钟翻转分别在与(1)中对应的下降沿触发翻转,输出的时钟与(1)
中输出的时钟进行逻辑或,即可得到占空比为50%的奇数倍分频时钟。当然其
输出端再与偶数倍分频器串接则可以实现偶数倍分频。奇数倍分频原理示意图见
图2。(这也是许多公司常出的面试题,^_^,是不是很简单?)
3. N-0.5倍分频
采用模N计数器可以实现。具体如下:计数器从0开始上升沿计数,计数达到
N-1上升沿时,输出时钟需翻转,由于分频值为N-0.5,所以在时钟翻转后经历
0.5个周期时,计数器输出时钟必须进行再次翻转,即当CLK为下降沿时计数器
的输入端应为上升沿脉冲,使计数器计数达到N而复位为0重新开始计数同时输
出时钟翻转。这个过程所要做的就是对CLK进行适当的变换,使之送给计数器的
触发时钟每经历N-0.5个周期就翻转一次。N-0.5倍:取N=3,分频原理示意图
见图3。
对于任意的N+A/B倍分频(N、A、B∈Z,A≦B)
分别设计一个分频值为N和分频值N+1的整数分频器,采用脉冲计数来控制单
位时间内两个分频器出现的次数,从而获得所需要的小数分频值。可以采取如下
方法来计算个子出现的频率:
设N出现的频率为a,则N×a+(N+1)×(B-a)=N×B+A 求解a=B-A; 所
以N+1出现的频率为A.例如实现7+2/5分频,取a为3,即7×3+8×2就可
以实现。但是由于这种小数分频输出的时钟脉冲抖动很大,现实中很少使用。
通常实现偶数的分频比较容易,以十分频为例:
always @( posedge clk or posedge reset)
if(reset)
begin
k<=0;
clk_10<=0;
end
else
if(k==4)
begin
k<=0;
clk_10<=~clk_10;
end
else
k<=k+1;
二分频最简单了,一句话就可以了:
always @ (negedge clk) clk_2<=~clk_2;
若进行奇数分频,则稍微麻烦点,以11分频为例:
always @( posedge clk)
if(!reset)
begin
i<=0;
clk11<=0;
end
else
if(i==5)
begin
clk11<=~clk11;
i<=i+1;
end
else
if(i==10)
begin
i<=0;
clk11<=~clk11;
end
else
i<=i+1;
以上语句虽然可以实现,但是逻辑有点繁,弄不好就出错了,建议使用两个
always语句来实现:
always @( posedge clk)
if(!reset)
i<=0;
else
begin
if(i==10)
i<=0;
else
i<=i+1;
end
always @( posedge clk)
if(!reset)
clk11<=0;
else
if((i==5)|(i==10))
clk11<=~clk11;
两个always,一个用来计数,一个用来置数。另外,这个样子好像也可以,
在时钟的上升沿和下降沿都计数,但是不被综合器综合,会提示敏感信号太复杂:
always @( posedge clk or negedge clk)
if(reset)
begin
k<=0;
clk_11<=0;
end
else
if(k==10)
begin
k<=0;
clk_11<=~clk_11;
end
else
k<=k+1;