找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7742|回复: 2
打印 上一主题 下一主题
收起左侧

步长可变的加减计数器

[复制链接]
跳转到指定楼层
楼主
本帖最后由 WeTiGY 于 2016-11-25 23:28 编辑

实验六  步长可变的加减计数器
一、实验目的
1、掌握加减法计数器以及特殊功能计数器的设计原理;
2、用HDL语言设计多功能计数器。
二、硬件需求
    EDA/SOPC实验箱一台。
三、实验原理
计数器的步长是指计数器每次的改变量。在很多应用场合,都希望计数器的步长可变。所谓步长可变,也就是计数器的步长是一个不定值,具体是多少是要靠外部干预的,比如外部给定其步长为5,那么该计数器每次要么增加5,要么减少5,也就是说计数器每次的改变量是5。这种步长可变的计数器才具有一定的实际意义,比如在直接数字频率合成DDFS中的地址累加器就是一个步长可变的递增计数器。
四、实验内容
本实验要完成的任务就是设计一个8位的计数器,步长的改变量要求从015,实验中用拨挡开关模块的SW1ASW4A来作为步长改变量的输入,用按键F1来控制计数器的增减,具体要求为:当F1输入为高时,计数器为步长可变的加计数器;当F1输入为低时,计数器为步长可变的减计数器。计数器输出的Q值用七段数码管模块来表示。实验中计数器的时钟频率为了便于眼睛观察,同上个实验一样用1Hz的时钟。
第一个为分频模块:
  1. module divider_module
  2. (
  3.        CLK,f_Out
  4. );

  5.        input CLK;
  6.        output f_Out;
  7.    

  8.        parameter T1s=26'd50_000_000;
  9.        reg [25:0]Count1;
  10.    
  11.       always @ ( posedge CLK )
  12.                  if( Count1 == T1s)
  13.                       Count1 <= 26'd0;
  14.                 else
  15.                       Count1 <= Count1 + 1'b1;
  16.         
  17.        reg rf_Out;        
  18.        always @ ( posedge CLK )
  19.                    if( Count1 >= 26'd0 && Count1 <= 26'd25_000_000)
  20.                         rf_Out <= 1'b0;
  21.                   else
  22.                         rf_Out <= 1'b1;     
  23.       assign f_Out = rf_Out;

  24. endmodule
复制代码


第二个为数码管模块:
  1. module hex_module
  2. (
  3.    f_Out,hex_one,hex_two,Q
  4. );
  5.    input  f_Out;
  6.    input  [7:0] Q;
  7.    output [6:0] hex_one;
  8.    output [6:0] hex_two;
  9.    parameter _0=7'b0000001, _1=7'b1111001, _2=7'b0010010, _3=7'b0000011, _4=7'b1001100, _5=7'b0100100,
  10.              _6=7'b0100000, _7=7'b0001111, _8=7'b0000000, _9=7'b0000100,  _A=7'b0001000, _B=7'b1100000,
  11.              _C=7'b0110001, _D=7'b1000010, _E=7'b0110000, _F=7'b0111000;
  12.         
  13.    reg [7:0] i;
  14.    reg [7:0] u;
  15.    reg [6:0] rhex_one;
  16.    reg [6:0] rhex_two;
  17.    always@(posedge f_Out)
  18.           begin
  19.             i<=Q>>4;
  20.            case(i)
  21.                  8'd0 :  rhex_one<=_0;     //0
  22.                  8'd1 :  rhex_one<=_1;     //1
  23.                  8'd2 :  rhex_one<=_2;     //2
  24.                  8'd3 :  rhex_one<=_3;     //3
  25.                  8'd4 :  rhex_one<=_4;     //4
  26.                  8'd5 :  rhex_one<=_5;     //5
  27.                  8'd6 :  rhex_one<=_6;     //6
  28.                  8'd7 :  rhex_one<=_7;     //7
  29.                  8'd8 :  rhex_one<=_8;     //8
  30.                  8'd9 :  rhex_one<=_9;     //9
  31.                  8'd10:  rhex_one<=_A;     //A
  32.                  8'd11:  rhex_one<=_B;     //B
  33.                  8'd12:  rhex_one<=_C;     //C
  34.                  8'd13:  rhex_one<=_D;     //D
  35.                  8'd14:  rhex_one<=_E;     //E
  36.                  8'd15:  rhex_one<=_F;     //F
  37.                
  38.           default:  rhex_one<=_F;      //F
  39.            endcase
  40.                  u<=Q&8'h0f;
  41.            case(u)
  42.                  8'd0 :  rhex_one<=_0;     //0
  43.                  8'd1 :  rhex_one<=_1;     //1
  44.                  8'd2 :  rhex_one<=_2;     //2
  45.                  8'd3 :  rhex_one<=_3;     //3
  46.                  8'd4 :  rhex_one<=_4;     //4
  47.                  8'd5 :  rhex_one<=_5;     //5
  48.                  8'd6 :  rhex_one<=_6;     //6
  49.                  8'd7 :  rhex_one<=_7;     //7
  50.                  8'd8 :  rhex_one<=_8;     //8
  51.                  8'd9 :  rhex_one<=_9;     //9
  52.                  8'd10:  rhex_one<=_A;     //A
  53.                  8'd11:  rhex_one<=_B;     //B
  54.                  8'd12:  rhex_one<=_C;     //C
  55.                  8'd13:  rhex_one<=_D;     //D
  56.                  8'd14:  rhex_one<=_E;     //E
  57.                  8'd15:  rhex_one<=_F;     //F
  58.                  
  59.                  default:  rhex_one<=_F;      //F
  60.            endcase
  61.          end
  62.         assign hex_one=rhex_one;
  63.    assign hex_two=rhex_two;

  64. endmodule
复制代码



第三个为计数模块:
  1. module ecount_module
  2. (
  3.    f_Out,F1,D,Q
  4. );
  5.    input  f_Out;
  6.    input  F1;
  7.    input  [3:0] D;
  8.    output [7:0] Q;
  9.         
  10.         reg [7:0] Q;
  11.         always@(posedge f_Out)
  12.             case(F1)
  13.                    1'b1: begin
  14.                            if(Q<8'd255) Q<=Q+D;
  15.                             else        Q<=8'b0;
  16.                          end
  17.                    1'b0: begin
  18.                            if(Q>8'd0) Q<=Q-D;
  19.                            else       Q<=8'd255;
  20.                          end
  21.             default: Q<=8'd255;
  22.        endcase

  23. endmodule                 
  24.                                                 
  25.                
  26.                         
  27.         
复制代码



第四个为顶层模块:
  1. module top_module
  2. (
  3.    CLK,F1,D,hex_one,hex_two
  4. );
  5.         input  CLK;
  6.         input  F1;
  7.         input  [3:0] D;
  8.         output [6:0] hex_one;
  9.         output [6:0] hex_two;
  10.         
  11.         divider_module u1
  12.         (
  13.           .CLK(CLK),
  14.           .f_Out(f_Out)
  15.         );
  16.         
  17.         wire f_Out;
  18.         ecount_module u2
  19.         (
  20.           .f_Out(f_Out),
  21.           .D(D),
  22.           .F1(F1),
  23.           .Q(Q)
  24.         );
  25.         
  26.         wire [7:0] Q;
  27.         hex_module u3
  28.         (
  29.           .f_Out(f_Out),
  30.           .hex_one(hex_one),
  31.           .hex_two(hex_two),
  32.           .Q(Q)
  33.         );
  34.         
  35. endmodule
复制代码

注:仿真使用20分频

仿真图:


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:641933 发表于 2019-11-14 14:42 | 只看该作者
为什么我的仿真结果都是0啊
回复

使用道具 举报

板凳
ID:646928 发表于 2019-12-30 00:57 来自手机 | 只看该作者
有没有安装包
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表