quartus频率计 时钟设置_Verilog频率计设计
這是以前的一個可編程邏輯課上機實驗三
實驗報告
數字頻率計的基本設計思路是在給定一個time開始測量的時候產生的T的個數,也就是采用一個標準的基準時鐘,在單位時間(1秒)里對被測信號的脈沖數進行計數。測頻法包括直接測頻法、等精度頻率測量法、周期法等。
數字頻率計的原理如圖6-1所示。對系統時鐘的信號分頻后產生1Hz的輸出頻率被作為控制模塊的時鐘輸入,由控制模塊產生的計數使能信號和清零信號對計數模塊進行控制,而由其產生的鎖存信號load對鎖存模塊進行控制,一旦計數使能信號為高電平,并且時鐘上升沿到來,計數器便開始正常計數,清零信號到來則計數清零,而當鎖存信號為高電平時,數據便被鎖存器鎖存,然后將鎖存的數據輸出到顯示模塊顯示出來,數據鎖存保證系統可以穩定顯示數據,顯示譯碼驅動電路將二進制表示的計數結果轉換成相應的能夠在數碼顯示管上可以顯示的十進制結果。
(1)分頻器模塊
分頻器模塊將對系統時鐘進行分頻,輸出1Hz赫茲的信號,作為測頻控制模塊的輸入信號。例如,假設系統時鐘為1024Hz,則對其進行2的10次方分頻即可得到1Hz的分頻輸出信號。
(2)測頻控制模塊
測頻控制模塊的輸出包括計數器的使能端,清零端以及數據鎖存器的鎖存信號。分別控制計數器的計數和清零。當鎖存信號為高電平時,計數器的計數結果被鎖存并輸出到顯示模塊顯示。
1 moduletestctl(clk,tsten,clr,load);2
3 inputclk;4
5 outputtsten,clr,load;6
7 regloadcnt,div2,clr;8
9 always@(posedgeclk)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 modulefre_div (clk, clk_out);2 inputclk;3 outputclk_out;4 reg [8:0] counter;5 regclk_out;6 parameter N = 1000; //改變N的值變成任意偶分頻,同時counter的范圍需要相應修改
7
8 always @ (posedgeclk)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 moduletestctl (clk_out_ctl, tsten, rst_ctl, load);2 inputclk_out_ctl;3 outputtsten, rst_ctl, load;4 regrst_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 modulecounter (enable,clk_t,rst_count,dout,cout);2 inputenable,clk_t,rst_count;3 output [15:0] dout;4 outputcout;5 regcout;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 modulelatch_out (in_dout, save_dout, load_in);2 inputload_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 modulebin_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 integeri;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】八段顯示數碼管
moduleseg7 (data_in, data_out );input [3:0] data_in ;output [7:0] data_out ;reg [7:0] data_out ;always @(data_in) begindata_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:
仿真波形:
注:各個小模塊的仿真測試都要一個一個做(在此我省略了)
如有錯誤還請指出,如有侵權還請告知,如需轉載請注明出處!
總結
以上是生活随笔為你收集整理的quartus频率计 时钟设置_Verilog频率计设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成长-技术人员的成长
- 下一篇: 光流的基本概念和原理-Lucas–Kan