verilog 8位计数器设计一个模为40的计数器要求一个四级计数器与一个十级计数器极联

verilog模六十计数器设计_中华文本库
第1页/共7页
模六十计数器设计
一、 系统设计实现目标要求
利用层次化方法在实验板上实现模六十计数, 即 0—1—2—3—4—……—9—10—……—59—0—1……,并在 Basys2 实验板的 AN1 与 AN0 上显示。
二、 设计原理
顶层模块图如图1所示,子模块图如图2所示。
frequency2模块将50MHz分频为2Hz,作为计数器的计数脉冲。frequency1000模块将50MHz分频为1000Hz,用于分别轮换点亮两个数码管。cnt10为10进制计数器,一方面作为点亮个位数码管的输入,另一方面得到6进制计数器的进位输入。cnt6为6进制计数器,作为点亮十位数码管的输入。slt将1000Hz频率分给cs[0]和cs[1],作为两个使能信号,用于分别轮换点亮两个数码管。selector将cnt10 和cnt6的输出端轮换送给decoder,decoder将计数器的数据译码,使之可以在数码管上显示。
三、 源程序
第1页/共7页
寻找更多 ""富婆成长之路(一)&&&模24计数器&verilog
今天敲了半天的verilog代码,终于把模24计数器调试出来了。高兴之余,也感悟到许多。固然从零到一的突破是十分艰难的,但是由一变二也并不简单的。
原先做模10的计数器,只用显示0-9这十个数字,只用很简单的敲出计数器、译码器、分频器的代码,然后将代码烧进basys2的板子中,四个数码管上的数字就会以1Hz的频率进行变化。但现在变成了模24计数器,就代表着四个数码管有两个要处于工作状态,并且分别显示十位和个位,看着觉得很简单。然而,细细思索并和同伴讨论,才发现在同一时刻4个数码管只有一个在亮,之所以我们看到多个数码管都在亮,是因为视觉暂留效应。于是,我做了一个选择器,让两个数码管以500Hz的频率依次轮流亮。经过对代码多次调试,最终模24计数器终于能够顺利工作了。
从零到一,意味着从无到有,从一到二,意味着变化。
PS:附上我的选择器的代码,有点挫,乃初学者,见谅
module selector(cp,aen,low,high,OUT_CODING
//500Hz时钟
input[3:0]low,&&&
//低位和高位输入
output[3:0]aen,OUT_CODING; //使能端和译码管输入
wire[3:0]low,
reg[3:0]aen,OUT_CODING;
aen=4'b1101;&&&
&&& //初始化
always@(negedge
aen[1]&=~aen[1];&&&
//每个周期,由1101变成1110,或者由1110变成1101
aen[0]&=~aen[0];
if(aen==4'b1101)
OUT_CODING=&&&
//当使能端为1101时,输出high,即输出十位
OUT_CODING=&&&
//当使能端为1110时,输出low,即输出个位
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Verilog HDL 之 十进制加减法计数器
  上面的一个实验我们介绍了二进制计数器, 这个实验我们介绍非二进制计数器。在非二进制计数器中我们最常用的就是十进制计数器。下面设计一个8421码十进制计数器为例该计数器可以通过一个控制信号决定计数器时加计数还是减计数,另外,该寄存器还有一个清零输入,低电平有效。还有一个load装载数据的信号输入,用于预置数据;还有一个C的输出,用于计数器的级联。其功能表如表1.1所示。
在设计文件中输入Verilog代码
/****************************** 分频模块
*************************************/ 2
3 `timescale 1 ns / 1 ps 4 module qu_dou ( clk ,rst , a ,b
9 10 11 12 13 14 15 reg
[31:0]16 reg17 always @ ( posedge clk or negedge rst )18
if ( rst == 1'b0 )20
cnt &= 0 ;21
if ( a==1'b1 ) begin22
if ( cnt &= 32'd3000000 ) 23
b &= 1 ;24
cnt &= cnt + 1'b1 ;26
else begin b &= 1'b0 ;29
cnt &= 0 ;30
end33 34 35 endmodule
1 `timescale 1 ns / 1 ps 2
3 module counter10 ( load ,clr ,c ,DOUT ,clk, up_down ,DIN ,seven_seg ,sysclk ,rst); 4
9 10 input up_11 wire up_12 input [3:0] DIN ;13 wire [3:0] DIN ;14 15 16 17 18 19 output [3:0] DOUT ;20 output [7:0] seven_21 wire [3:0] DOUT ;22 reg
[3:0] data_r;23 24 /***************** 例化去抖模块
*************************************/25 wire
clk_26 qu_dou qu_dou ( 27 .clk (sysclk) ,28 .rst (rst) , 29 .a (clk),30 .b
(clk_r));31 32 /*********************************************************************/33 34 assign DOUT = data_r;35 always @ ( posedge clk_r or posedge clr or posedge load)
if ( clr == 1)
//同步清零38
data_r &= 0;39
else if ( load == 1) //同步预置40
data_r &= DIN; 41
else if ( up_down ==1 & data_r == 9)42
data_r &= 4'b0000;45
else if ( up_down ==0 & data_r == 0) 47
data_r &= 9;51
up_down ==1)
//加计数55
data_r &= data_r +1;
//减计数59
data_r &= data_r -1 ;
64 /*****************************数码管*********************************/
65 assign seven_seg ={1'b1,~Y_r};66 reg [6:0] Y_r;67 68 69
always @(data_r
Y_r = 7'b1111111;72
case (data_r )73
4'b0000: Y_r = 7'b0111111; // 074
4'b0001: Y_r = 7'b0000110; // 175
4'b0010: Y_r = 7'b1011011; // 276
4'b0011: Y_r = 7'b1001111; // 377
4'b0100: Y_r = 7'b1100110; // 478
4'b0101: Y_r = 7'b1101101; // 579
4'b0110: Y_r = 7'b1111101; // 680
4'b0111: Y_r = 7'b0000111; // 781
4'b1000: Y_r = 7'b1111111; // 882
4'b1001: Y_r = 7'b1101111; // 983
4'b1010: Y_r = 7'b1110111; // A84
4'b1011: Y_r = 7'b1111100; // b85
4'b1100: Y_r = 7'b0111001; // c86
4'b1101: Y_r = 7'b1011110; // d87
4'b1110: Y_r = 7'b1111001; // E88
4'b1111: Y_r = 7'b1110001; // F89
default: Y_r = 7'b0000000;90
92 endmodule
阅读(...) 评论()

我要回帖

更多关于 verilog 脉冲计数器 的文章

 

随机推荐