這是以前的一個可編程邏輯課上機實驗三
實驗報告
數字頻率計的基本設計思路是在給定一個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
該模塊的仿真結果可參考圖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:
仿真波形:
注:各個小模塊的仿真測試都要一個一個做(在此我省略了)
如有錯誤還請指出,如有侵權還請告知,如需轉載請注明出處!