找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 8835|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

步長可變的加減計(jì)數(shù)器

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:112613 發(fā)表于 2016-11-25 23:21 | 只看該作者 |只看大圖 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
本帖最后由 WeTiGY 于 2016-11-25 23:28 編輯

實(shí)驗(yàn)六  步長可變的加減計(jì)數(shù)器
一、實(shí)驗(yàn)?zāi)康?/font>
1、掌握加減法計(jì)數(shù)器以及特殊功能計(jì)數(shù)器的設(shè)計(jì)原理;
2、用HDL語言設(shè)計(jì)多功能計(jì)數(shù)器。
二、硬件需求
    EDA/SOPC實(shí)驗(yàn)箱一臺。
三、實(shí)驗(yàn)原理
計(jì)數(shù)器的步長是指計(jì)數(shù)器每次的改變量。在很多應(yīng)用場合,都希望計(jì)數(shù)器的步長可變。所謂步長可變,也就是計(jì)數(shù)器的步長是一個不定值,具體是多少是要靠外部干預(yù)的,比如外部給定其步長為5,那么該計(jì)數(shù)器每次要么增加5,要么減少5,也就是說計(jì)數(shù)器每次的改變量是5。這種步長可變的計(jì)數(shù)器才具有一定的實(shí)際意義,比如在直接數(shù)字頻率合成DDFS中的地址累加器就是一個步長可變的遞增計(jì)數(shù)器。
四、實(shí)驗(yàn)內(nèi)容
本實(shí)驗(yàn)要完成的任務(wù)就是設(shè)計(jì)一個8位的計(jì)數(shù)器,步長的改變量要求從015,實(shí)驗(yàn)中用撥擋開關(guān)模塊的SW1ASW4A來作為步長改變量的輸入,用按鍵F1來控制計(jì)數(shù)器的增減,具體要求為:當(dāng)F1輸入為高時,計(jì)數(shù)器為步長可變的加計(jì)數(shù)器;當(dāng)F1輸入為低時,計(jì)數(shù)器為步長可變的減計(jì)數(shù)器。計(jì)數(shù)器輸出的Q值用七段數(shù)碼管模塊來表示。實(shí)驗(yàn)中計(jì)數(shù)器的時鐘頻率為了便于眼睛觀察,同上個實(shí)驗(yàn)一樣用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
復(fù)制代碼


第二個為數(shù)碼管模塊:
  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
復(fù)制代碼



第三個為計(jì)數(shù)模塊:
  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.         
復(fù)制代碼



第四個為頂層模塊:
  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
復(fù)制代碼

注:仿真使用20分頻

仿真圖:


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:641933 發(fā)表于 2019-11-14 14:42 | 只看該作者
為什么我的仿真結(jié)果都是0啊
回復(fù)

使用道具 舉報

板凳
ID:646928 發(fā)表于 2019-12-30 00:57 來自手機(jī) | 只看該作者
有沒有安裝包
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表