Dao động và tần số
- Một thành phần rất quan trọng của bất kỳ board mạch FPGA là bộ dao động crystal. Các dao động phát ra một dãy 0,1 tại một thời gian nhất định dựa trên tần số của nó.
f=1/T
T: chu kì đơn vị là s(giây)
F: tần số đơn vị là Hz
- Vậy từ công thức ta có thể suy ra được 1Hz là 1s.
- Một tín hiệu 1Hz được biểu diễn như sau:
Chia tần số:Một công đoạn rất quan trọng trong bất cứ mạch nào liên quan đến sự đồng bộ và thời gian thực. Hoặc trong một mạch chúng ta cần nhiều tần số thì việc chia tần số chính của board FPGA ( thường là 50Mhz) ra nhiều tần số khác nhau là không thể thiếu.
Chuyển đổi thời gian:
1 mili giây = 0,001 giây
1 micro giây = 0,000 001 giây
1 nano giây = 0,000 000 001 giây
Chuyển đổi tần số-thời gian:
1 Hz <=> 1 giây
10 Hz <=> 0,1 giây
100 Hz <=> 0.01 giây
1 KHz (1 000 Hz) <=> 1 mili giây
1 MHz (1 000 000 Hz) <=> 1 micro giây
1 GHz (1 000 000 000 Hz) <=> 1 nano giây
Ví dụ:
- Ta có tần số ban đầu là 100Mhz. Chúng ta cần chia tần số này theo yêu cầu sau: hiển thị led nhấp nháy sang 0.5 giây và tắt là 0.5 giây.
- Đầu tiên chúng ta cần phải tính toán tần số cần thiết bằng cách sử dụng công thức:
f = 1 / 0,500 = 2 Hz
0,5 giây thì có tần số bằng 2 Hz.
- Trong FPGA, chúng ta sẽ sử dụng bộ đếm để điều khiển giây như mình mong muốn. Vì thế chúng ta cần một hằng số để đếm. Sau đây là công thức để tính hằng số đó:
c=gclk/clk
Với gclk: là tần số của board FPGA.
Clk: tần số ta đã tính ở trên.
Vậy ta có hằng số:
c=100 000 000/2=50 000 000
- Chúng ta sẽ đếm sự thay đổi của tần số gclk ( 1 hoặc 0 ) và đếm sự thay đổi đó đến hằng số cần thiết thì ta được thời gian hoặc tần số mình mong muốn.
Một số code mẫu
-Chia tần số bằng ngôn ngữ VHDL:
![[IMG]](https://lh3.googleusercontent.com/-JQl5npFtqic/VYAIZUuDJQI/AAAAAAAACPg/pw2cOeoP7F0/w545-h209-no/diven.jpg)
![[IMG]](https://lh6.googleusercontent.com/-Nn8D4ZvEr6c/VYAIZc3vHFI/AAAAAAAACPc/_YvqUTGIWw8/w617-h567-no/divar.jpg)
-Chia tần số bằng ngôn ngữ verilog:
MÃ:
always @(posedge clk, posedge reset) begin if(reset) Q1 <= 8'b0; else begin if (r1) Q1 <= 32'b0; else Q1 <= Q1 + 32'b1; end end assign r1 = (Q1 == 32'd50000000) ? 1'b1 : 1'b0;

Bạn có đam mê ngành thiết kế vi mạch và bạn muốn có mức lương 1000 usd cùng lúc bạn
đang muốn tìm một Trung tâm để học vậy hãy đến với ngành vi mạch tại SEMICON
HotLine: 0972 800 931 Ms Duyên
MÃ:
always @(posedge clk, posedge reset) begin if(reset) Q1 <= 8'b0; else begin if (r1) Q1 <= 32'b0; else Q1 <= Q1 + 32'b1; end end assign r1 = (Q1 == 32'd50000000) ? 1'b1 : 1'b0;
