Verilog頻率計設計


    這是以前的一個可編程邏輯課上機實驗三

 

實驗報告

    數字頻率計的基本設計思路是在給定一個time開始測量的時候產生的T的個數,也就是采用一個標准的基准時鍾,在單位時間(1秒)里對被測信號的脈沖數進行計數。測頻法包括直接測頻法、等精度頻率測量法、周期法等。

    數字頻率計的原理如圖6-1所示。對系統時鍾的信號分頻后產生1Hz的輸出頻率被作為控制模塊的時鍾輸入,由控制模塊產生的計數使能信號和清零信號對計數模塊進行控制,而由其產生的鎖存信號load對鎖存模塊進行控制,一旦計數使能信號為高電平,並且時鍾上升沿到來,計數器便開始正常計數,清零信號到來則計數清零,而當鎖存信號為高電平時,數據便被鎖存器鎖存,然后將鎖存的數據輸出到顯示模塊顯示出來,數據鎖存保證系統可以穩定顯示數據,顯示譯碼驅動電路將二進制表示的計數結果轉換成相應的能夠在數碼顯示管上可以顯示的十進制結果。

(1)分頻器模塊

    分頻器模塊將對系統時鍾進行分頻,輸出1Hz赫茲的信號,作為測頻控制模塊的輸入信號。例如,假設系統時鍾為1024Hz,則對其進行2的10次方分頻即可得到1Hz的分頻輸出信號。

(2)測頻控制模塊

    測頻控制模塊的輸出包括計數器的使能端,清零端以及數據鎖存器的鎖存信號。分別控制計數器的計數和清零。當鎖存信號為高電平時,計數器的計數結果被鎖存並輸出到顯示模塊顯示。

 1 module testctl(clk,tsten,clr,load);
 2 
 3 input clk;
 4 
 5 output tsten,clr,load;
 6 
 7 reg loadcnt,div2,clr;
 8 
 9 always@(posedge clk)
10 
11        div2<=~div2;
12 
13  always@(clk,div2)
14 
15 begin
16 
17        if (clk==0 && div2==0)
18 
19               clr=1;
20 
21        else
22 
23               clr=0;
24 
25 end
26 
27 assign load=~div2;
28 
29 assign tsten=div2;
30 
31 endmodule
View Code

   該模塊的仿真結果可參考圖6-2。

(3)計數器模塊

    計數器是完成計數步驟的一個單元。它也可用與分頻、定時、產生節拍脈沖和脈沖序列等。本設計中為了可以使計數器正常工作,必須只有當使能端為1的時候才開始計數,每個時鍾的上升沿到來時計數器加1,當累加到10的時候就清零,同時產生進位信號,同時計數器也應帶有清零信號,一旦清零信號有效時,計數器立即清零。

(4)鎖存器模塊

    鎖存,就是把信號暫存以維持某種電平狀態。測量模塊的工作任務成功后,在load信號的上升沿到來時把測量值存入reg當中,之后發送到顯示模塊當中。鎖存器主要是為了保護數據,使其在下次觸發或者復位時仍然有效。

(5)顯示模塊

    LED顯示器在許多的數字系統中作為顯示輸出設備,使用非常廣泛。它內部有七個發光的a、b、d、e、f和g二極管。通過點亮不同的LED字段,可顯示數字0,1,┅,9和A,b,C,d,E,F等不同的字符及自定義一些段發光代表簡單符號。

(6)頂層模塊

       按照圖一所示的數字頻率計的框圖,調用各單元模塊,完成數字頻率計的頂層設計,並進行仿真,實現頻率測量。

 

 練習

(1)分頻器模塊

 1 module fre_div (clk, clk_out);
 2     input clk;
 3     output clk_out;
 4     reg [8:0] counter;
 5     reg clk_out;
 6     parameter N = 1000;  //改變N的值變成任意偶分頻,同時counter的范圍需要相應修改
 7     
 8     always @ (posedge clk)
 9                 begin
10                     if (counter == N/2 - 1)  //偶分頻數一半時反相
11                         begin
12                             clk_out <= ~clk_out;
13                             counter <= 0;  //置0,從0計數
14                         end
15                     else
16                         counter <= counter + 1;
17                 end
18 endmodule

 

(2)測頻控制模塊

 1 module testctl (clk_out_ctl, tsten, rst_ctl, load);
 2     input clk_out_ctl;
 3     output tsten, rst_ctl, load;
 4     reg rst_ctl, div2;
 5     always @(posedge clk_out_ctl) begin
 6         div2 = ~div2;
 7     end
 8     always @(clk_out_ctl or div2) begin
 9         if (clk_out_ctl == 0 && div2 == 0) begin
10             rst_ctl = 1;            
11         end
12         else 
13         begin
14             rst_ctl = 0;
15         end
16     end
17     assign load = ~div2;
18     assign tsten = div2;
19 endmodule

 

(3)計數器模塊(改正在注釋里

 1 module counter (enable,clk_t,rst_count,dout,cout);
 2     input enable,clk_t,rst_count;
 3     output [15:0] dout;
 4     output cout;
 5     reg cout;
 6     reg [15:0] dout;
 7     always @(posedge clk_t) begin//有問題,always @(posedge clk_t or posedge rst_count)  //異步復位
 8         if (!rst_count) begin//              if (rst_count)  begin  dout = 16'd0; cout = 1'b0; end //先寫復位,首先考慮復位信號
 9             if (enable) begin//              else begin 
10                 if(dout == 65535) begin //        if (enable) begin
11                     dout = 16'd0;     //               if(dout == 65535) begin dout = 16'd0; cout = 1'b1; end 
12                     cout = 1'b1; //                         else dout = dout + 16'd1;
13                 end      //                       end 
14                 else begin   //              end 
15                     dout = dout + 16'd1;                
16                 end
17             end
18         end
19         else begin
20             dout = 16'd0;
21             cout = 1'b0;
22         end    
23     end
24 endmodule
25 
26 
27     

 

 (4)鎖存器模塊

 1 module latch_out (in_dout, save_dout, load_in);
 2     input load_in;
 3     input [15:0] in_dout;
 4     output [15:0] save_dout;
 5     reg [15:0] reg_in;
 6     wire [15:0] save_dout;
 7     always @(load_in)
 8     if (load_in)    
 9     reg_in = in_dout;
10     assign save_dout = reg_in;
11 endmodule

 

(5)顯示模塊

  【1】二進制轉BCD碼模塊(參考

 1 module bin_bcd_cp (bin, wan, qian, bai, shi, ge, bcd); 
 2     input [15:0] bin;
 3     output [31:0] bcd;
 4     output reg [3:0] wan;
 5     output reg [3:0] qian;
 6     output reg [3:0] bai;
 7     output reg [3:0] shi;
 8     output reg [3:0] ge;
 9     integer i;
10     always @(bin) begin
11         wan = 4'd0;
12         qian = 4'd0;
13         bai = 4'd0;
14         shi = 4'd0;
15         ge = 4'd0;
16         for (i = 15; i >= 0; i = i - 1) begin
17             if (wan > 4) wan = wan + 3;
18             if (qian > 4) qian = qian + 3;
19             if (bai > 4) bai = bai + 3;
20             if (shi > 4) shi = shi + 3;
21             if (ge > 4) ge = ge + 3;
22             
23             wan = wan << 1;
24             wan[0] = qian[3];
25             qian = qian << 1;
26             qian[0] = bai[3];
27             bai = bai << 1;
28             bai[0] = shi[3];
29             shi = shi << 1;
30             shi[0] = ge[3];
31             ge = ge << 1;
32             ge[0] = bin[i];
33         end
34     end
35     assign bcd = {{12{1'b0}}, wan, qian, bai, shi, ge};
36 endmodule

  【2】八段顯示數碼管

module seg7 (data_in, data_out );
    input [3:0] data_in ;
    output [7:0] data_out ;
    reg [7:0] data_out ;
    always @(data_in) begin
        data_out = 7'b1111111;
            case (data_in )
            4'b0000: data_out = 8'b1100_0000; // 0
            4'b0001: data_out = 8'b1111_1001; // 1
            4'b0010: data_out = 8'b1010_0100; // 2
            4'b0011: data_out = 8'b1011_0000; // 3
            4'b0100: data_out = 8'b1001_1001; // 4
            4'b0101: data_out = 8'b1001_0010; // 5
            4'b0110: data_out = 8'b1000_0011; // 6
            4'b0111: data_out = 8'b1111_1000; // 7
            4'b1000: data_out = 8'b1000_0000; // 8
            4'b1001: data_out = 8'b1001_1000; // 9
            4'b1010: data_out = 8'b1000_1000; // A
            4'b1011: data_out = 8'b1000_0011; // b
            4'b1100: data_out = 8'b1010_0111; // c
            4'b1101: data_out = 8'b1010_0001; // d
            4'b1110: data_out = 8'b1000_0110; // E
            4'b1111: data_out = 8'b1000_1110; // F
            default: data_out = 8'b1111_1111;
            endcase
    end
endmodule

 

 

(6)頂層模塊

    把各個模塊生成symbol,通過創建 block diagram/schematic file 手動連線生成。

 

RTL:

仿真波形:

 

注:各個小模塊的仿真測試都要一個一個做(在此我省略了)

 

 

 

如有錯誤還請指出,如有侵權還請告知,如需轉載請注明出處!                                              

本人博客:http://www.cnblogs.com/yllinux/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM