笔者最近由于实验室老师的任务安排重新又看了一下分频器的verilog实现,现总结如下,待以后查看之用(重点是查看计数器计到哪个值clk_out进行状态翻转)

1.偶数分频占空比为50%

其实质还是一个N计数器模块来实现,首先要有复位信号,这个复位信号的作用就是使计数器和分频输出clk_out刚开始有一个复位值,其次就是计数翻转了,注意这里是计到哪个值翻转,首先刚开始时reset复位时计数器赋初值为0,然后计数器计到N/2-1时进行clk-out状态翻转,即clk_out<=~clk_out,此时别忘了计数器接着加1操作(count<=count+1),紧接着在计数器计到N-1时clk_out再翻转状态,与此同时计数器进行清零操作。count<=0;

这部分的程序代码如下:

module tmm_c(clk,reset,m,clk_out);
input clk;
input reset;
input [7:0]m;

output clk_out;

reg [7:0]count;
reg clk_out;

always@(posedge clk)
begin
if(reset)
begin
count<=0;
clk_out<=0;
end

else
if(count==m-1)
begin
clk_out<=~clk_out;
count<=0;
end
else
if(count==m/2-1)
begin
clk_out<=~clk_out;
count<=count+1;
end
else
count<=count+1;
end

endmodule

与此相关的testbench代码如下:

`timescale 1ns/1ns
module tmm_c_tb;
reg clk;
reg reset;
reg[7:0] m;
wire clk_out;

tmm_c u1(clk,reset,m,clk_out);

initial
begin
clk=0;
reset=1;
m=4;
#10 reset=0;
#1000 $stop;
end
always #5 clk=~clk;

endmodule

modelsim仿真波形图:

2.奇数分频占空比为50%

其实质也是一个计数器,思想和偶数分频相似,不过奇数分频前期需要两个always模块,这两个always模块的输出分别为clk_out1、clk_out2,用到两个count1、count2,其中clk_out1的输出是待分频时钟的上升沿触发进行的计数输出的结果,这个也需要计数器模块和reset复位信号,但此时计到何值clk_out1进行翻转呢?复位完之后还是输出和计数全部为零,然后当计数到count=(N-1)/2时clk_out1进行翻转,计数到count=N-1时计数器清零,clk_out进行翻转。clk_out2的计数器和输出同count1和clk_out1.但不同的是它是在待分频时钟的下降沿进行触发。最总的结果是clk_out=clk_out1|clk_out2(进行或运算)

以下是程序代码:

module tnn_c(clk,reset,n,clk_out);
input clk;
input reset;
input[7:0]n;
output clk_out;

reg [7:0]count1;
reg [7:0]count2;
//reg clk_out;
reg clk1;
reg clk2;

always@(posedge clk)
begin
if(reset)
begin
count1<=0;
clk1<=0;
end
else
if(count1==n-1)
begin
count1<=0;
clk1=~clk1;
end

else
if(count1==(n-1)/2)
begin
clk1=~clk1;
count1<=count1+1;
end
else
count1<=count1+1;

end

always@(negedge clk)
begin
if(reset)
begin
count2<=0;
clk2<=0;
end
else
if(count2==n-1)
begin
count2<=0;
clk2=~clk2;
end
else
if(count2==(n-1)/2)
begin
clk2=~clk2;
count2<=count2+1;
end
else
count2<=count2+1;

end

assign clk_out=clk1|clk2;

endmodule

相应的testbench:

`timescale 1ns/1ns
module tnn_c_tb;
reg clk;
reg reset;
reg[7:0] n;
wire clk_out;

tnn_c u(clk,reset,n,clk_out);

initial
begin
clk=0;
reset=1;
n=5;
#30 reset=0;
#1000 $stop;
end
always #5 clk=~clk;

endmodule

modelsim仿真图:

分频器的verilog设计的更多相关文章

  1. Verilog设计Valid-Ready握手协议

    转自http://ninghechuan.com 我不生产知识,我只是知识的搬运工. Handshake Protocol握手协议!为了保证数据传输过程中准确无误,我们需要加上握手信号来控制信号的传输 ...

  2. Verilog设计技巧实例及实现

    Verilog设计技巧实例及实现 1 引言 最近在刷HDLBits的过程中学习了一些Verilog的设计技巧,在这里予以整理.部分操作可能降低代码的可读性和Debug的难度,请大家根据实际情况进行使用 ...

  3. Verilog设计分频器(面试必看)

    分频器是指使输出信号频率为输入信号频率整数分之一的电子电路.在许多电子设备中如电子钟.频率合成器等,需要各种不同频率的信号协同工作,常用的方法是以稳定度高的晶体振荡器为主振源,通过变换得到所需要的各种 ...

  4. 全数字锁相环(DPLL)的原理简介以及verilog设计代码

    随着数字电路技术的发展,数字锁相环在调制解调.频率合成.FM 立体声解码.彩色副载波同步.图象处理等各个方面得到了广泛的应用.数字锁相环不仅吸收了数字电路可靠性高.体积小.价格低等优点,还解决了模拟锁 ...

  5. 硬件描述语言Verilog设计经验总结

    一.硬件描述语言Verilog 粗略地看Verilog与C语言有许多相似之处.分号用于结束每个语句,注释符也是相同的(/* ... */和// 都是熟悉的),运算符"=="也用来测 ...

  6. 基于basys2驱动LCDQC12864B的verilog设计图片显示

    话不多说先上图 前言 在做这个实验的时候在网上找了许多资料,都是关于使用单片机驱动LCD显示,确实用单片机驱动是要简单不少,记得在FPGA学习交流群里问问题的时候,被前辈指教,说给我最好的指教便是别在 ...

  7. 基于basys2用verilog设计多功能数字钟(重写)

    话不多说先上图         前言 自从学习FPGA以来,唯一做过的完整系统就是基于basys2得多功能数字表.记得当时做的时候也没少头疼,最后用时间磨出来了一个不是很完整的小系统,当时还是产生了满 ...

  8. 【CPU微架构设计】利用Verilog设计基于饱和计数器和BTB的分支预测器

    在基于流水线(pipeline)的微处理器中,分支预测单元(Branch Predictor Unit)是一个重要的功能部件,它负责收集和分析分支/跳转指令的执行结果,当处理后续分支/跳转指令时,BP ...

  9. Verilog设计中的锁存器

    问题: 什么是锁存器? 什么时候出现锁存器? 锁存器对电路有什么影响? 如何在FPGA设计中避免锁存器? 在FPGA设计中应该避免锁存器.实际上,锁存器与D触发器实现的逻辑功能基本相同,都有暂存数据的 ...

随机推荐

  1. VFIO简介 (转载)

    VFIO简介 LTCChina | Nov 20 2013 | Comment (1) | Visits (15204) 概述 VFIO是一套用户态驱动框架,它提供两种基本服务: 向用户态提供访问硬件 ...

  2. 设置漂亮的eclipse主题(Theme)风格

    看看这些主题: Eclipse Color Themes 设置步骤: 1.点击help --> Eclipse Marketplace... 2.搜索Color Eclipse Themes 3 ...

  3. python爬虫 urllib库基本使用

    以下内容均为python3.6.*代码 学习爬虫,首先有学会使用urllib库,这个库可以方便的使我们解析网页的内容,本篇讲一下它的基本用法 解析网页 #导入urllib from urllib im ...

  4. Luogu 3119 [USACO15JAN]草鉴定Grass Cownoisseur

    思路很乱,写个博客理一理. 缩点 + dp. 首先发现把一个环上的边反向是意义不大的,这样子不但不好算,而且相当于浪费了一次反向的机会.反正一个强连通分量里的点绕一遍都可以走到,所以我们缩点之后把一个 ...

  5. Python之路番外(第二篇):PYTHON基本数据类型和小知识点

    一.基础小知识点 1.如果一行代码过长,可以用续行符 \换行书写 例子 if (signal == "red") and \ (car == "moving") ...

  6. linux fedora 的备份小技巧

    大家都知道,在fedora中,是没有默认安装带有GUI的备份软件的. 我们可以去软件中心搜索“备份”或者“dup”来安装deja-dup来进行备份,这个软件就是ubuntu中设置的“备份”,只不过ub ...

  7. Python 中Lambda 表达式 实例解析

    Lambda 表达式 lambda表达式是一种简洁格式的函数.该表达式不是正常的函数结构,而是属于表达式的类型.而且它可以调用其它函数. 1.基本格式: lambda 参数,参数...:函数功能代码 ...

  8. WCF 与 Windows Store Client App

    首先复习下WCF: WCF实际上是构建了一个框架,这个框架实现了在互联系统中各个Application之间如何通信.使得Developers和Architect在构建分布式系统中,无需在考虑如何去实现 ...

  9. 深入C# String类

    深入C# String类 C#中的String类 他是专门处理字符串的(String),他在System的命名空间下,在C#中我们使用的是string 小写的string只是大写的String的一个别 ...

  10. python之函数篇3

    一:函数的定义 1)函数的简单使用,无参函数 def f1(): # 定义函数指定函数名 print("hello") # 指定功能 f1() # 调用函数,才能执行函数体里面的功 ...