天天看點

ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作

等精度頻率計的原理分析和執行個體實作

這一視訊主要來分析實作等精度頻率計。通過分析硬體實作原理,編寫

PL的邏輯實作部分,以及對應 PS的 C語言操作,操作挂在 PS尋址空間的寄存器,

達到控制等精度頻率計邏輯,讀取計數結果,并在 PS裡通過運算,計算出實際

所要測試的頻率值。這是一個很好的軟體硬體分工協作的例子。硬體邏輯中有精

确到時鐘邊緣的失序,而軟體運算為了提高精度使用了雙精度浮點運算。學習這

一視訊希望大家在掌握等精度原理和進一步熟悉軟體操作的基礎上體會如何下

手分析一個設計,進行軟體硬體的分工,并最終實作所有細節。

等精度說的就是精度相等,也就是測試出來的精度取決于參考時鐘的精度。

他是使用兩個計數器同時計數,兩個計數器的時鐘分别是參考時鐘和被測試信号

的時鐘。同時【注】開啟計數器和同時關閉計數器,運作同樣長的時間。

Cref\Fref = Tref

Cin\Fin = Tin

Tref = Tin

是以

Cref\Fref =Cin\Fin

得到

Fin = ( Fref * Cin ) / Cref ;

ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作

分析框圖,看看具體實作有什麼說法:我們看到兩個計數器和一個使能控制

寄存器。這兩個計數器分别接參考時鐘和被測試的信号,在這裡被測試信号被當

做一個時鐘,在每一個被測信号上升邊緣

做一個時鐘,在每一個被測信号上升邊緣+1。他們是受同一個使能信号控制的,。他們是受同一個使能信号控制的,隻有使能信号為隻有使能信号為1時候才允許累加。這是基本原理。時候才允許累加。這是基本原理。

控制的時候主要部分輸出使能信号(預制門),在被采集信号的上升邊緣到

控制的時候主要部分輸出使能信号(預制門),在被采集信号的上升邊緣到來以後兩來以後兩個計數器再以自己時鐘頻率計數。當我們要讀取兩個計數器的時候,就個計數器再以自己時鐘頻率計數。當我們要讀取兩個計數器的時候,就先關閉掉使能信号。在被采集信号的上升邊緣到來後兩個計數器停止累加采集。先關閉掉使能信号。在被采集信号的上升邊緣到來後兩個計數器停止累加采集。這樣我們讀出兩個計數器的數值,結合參考頻率運算出被測試信号的頻率數值。這樣我們讀出兩個計數器的數值,結合參考頻率運算出被測試信号的頻率數值。而下次控制采集之前,要先清除一下目前的計數器數值,通過清零信号置位。而下次控制采集之前,要先清除一下目前的計數器數值,通過清零信号置位。

我們繼續看看一下使能信号的産生,一個外部控制信号出來接在一個同步寄

我們繼續看看一下使能信号的産生,一個外部控制信号出來接在一個同步寄存器上,這個寄存器的時鐘是被采集信号,這點很重要,也是設計的精髓:我們存器上,這個寄存器的時鐘是被采集信号,這點很重要,也是設計的精髓:我們知道是在時鐘的上升邊緣寄存器知道是在時鐘的上升邊緣寄存器D的輸入更新到的輸入更新到Q的輸出,看輸出波形。我們的輸出,看輸出波形。我們看下面這個波形圖。經過了被采集信号同看下面這個波形圖。經過了被采集信号同步的使能信号,去控制被采集時鐘的計步的使能信号,去控制被采集時鐘的計數器是完全同步,去控制參考時鐘的計數器時,會存在最多一個被采集周期的偏數器是完全同步,去控制參考時鐘的計數器時,會存在最多一個被采集周期的偏差,可能計數多累加了一個,也可能計數少累加了一個,但是最多就是一個。而差,可能計數多累加了一個,也可能計數少累加了一個,但是最多就是一個。而這一個周期我們可以提高參考時鐘頻率或提高采集時間的長度來減小這點誤差這一個周期我們可以提高參考時鐘頻率或提高采集時間的長度來減小這點誤差的影響,達到可以忽略的要求。的影響,達到可以忽略的要求。

這裡還要注意

這裡還要注意clr(清零)這個信号,主要看看同步清零和異步清零。寫法(清零)這個信号,主要看看同步清零和異步清零。寫法以及這裡需要用到異步清零。以及這裡需要用到異步清零。

用verilog語言描述這部分。(分析對應)。語言描述這部分。(分析對應)。

module frc_cal(
input ref_clk,
input sig_clk,
output reg [31:0] ref_c ,
output reg [31:0] sig_c ,
input clr,
input cal_en
);
reg cal_enr ;
always @ (posedge sig_clk or posedge clr) if (clr) cal_enr <= 0;else cal_enr <= cal_en ;
always @ (posedge ref_clk or posedge clr)if (clr)ref_c<=0;else if (cal_enr)ref_c <= ref_c + 1 ;
always @ (posedge sig_clk or posedge clr)if (clr)sig_c<=0;else if (cal_enr)sig_c <= sig_c + 1 ;
endmodule
           
ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作

之後我們做成

AXI總線外設,注意配置設定寄存器,兩個計數器分别占據兩個

寄存器,(清零)和(預置門)分别設定一個寄存器,隻用到最低位,端口引出。

Vivado挂在 Zynq7的總線上配置設定位址,生成 Bit流檔案。之後在 SDK編寫 C語言控制程式。

實作過程

1.使用提供的 axi_lite從屬外設模闆和自定義 IP源代碼來建立自定義 IP。

打開

Vivado軟體,單擊 Manage IP,然後選擇 New IP Location,然後在建立 IP位置視窗中單擊 Next。

選擇Verilog作為 Target Language Mixed作為 Simulator language,對于IP位置,請鍵入 D:/IP Core,然後單擊 Finish(将其他設定保留為預設值,如果

提示建立目錄,請單擊确定) 。

ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作

2.運作建立和封裝 IP向導 選擇 Tools > Create and Package New IP…

ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作

在下一個視窗中,單擊 Next

ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作

由于我們需要挂在到總線上,是以建立一個帶

AXI 總線的使用者 IP,故選擇 Create a new AXI4 peripheral。 點選 Next.

ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作

設定IP 的名字為 Frq_Cnt,版本号預設,并且記住 IP的位置 ,單擊 Next.

ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作

設定總線形式為Lite 總線, Lite 總線是簡化的 AXI 總線消耗的資源少,當然性能也是比完全版的 AXI 總線差一點, 4 采用 Lite 總線就夠了,設定寄存器數量為 4,因為後面我們需要用到 4個寄存器。 單擊 Next.

ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作

選擇edit IP 單擊 Finish 完成

ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作

完成後的界面如下圖所示

3.使用者 IP 的修改

IP建立完成後,并不能立馬使用,還需要做一些修改。

  1. 打開Feq_Cnt_v1_0.v 檔案在以下位置修改
    ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作
    2.打開PWM_IP_v1_0_S00_AXI.v 添加端口和使用者邏輯部分
    ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作
    ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作
    建立一個frc_cal.v 檔案實作等精度頻率計然後儲存到Frq_Cnt_1.0/hdl 檔案夾,并添加進來。
module frc_cal(
input ref_clk,
input sig_clk,
output reg [31:0] ref_c ,
output reg [31:0] sig_c ,
input clr,
input cal_en
);
reg cal_enr ;
always @ (posedge sig_clk or posedge clr)if (clr) cal_enr <= 0;else cal_enr <= cal_en ;
always @ (posedge ref_clk or posedge clr)if (clr)ref_c<=0;else if (cal_enr)ref_c <= ref_c + 1 ;
always @ (posedge sig_clk or posedge clr)if (clr)sig_c<=0;else if (cal_enr)sig_c <= sig_c + 1 ;
endmodule
           

點選File–>點選 Save all files,最終如下

ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作

4.修改完成後還要重新打包

1 選擇 tool–>Create and Package New Ip…

2. 選擇 package your current project 選擇 next

ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作

3.保持預設設定,不做任何修改,點選 Next

ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作

4.點選 Next 選擇 Overwrite

ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作

5.點選 Finish,完成。

ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作

6.執行以下操作檢查 IP是否封裝完成,展開 IP XACT(1)>輕按兩下

component.xml,展開 Ports and Interface,可以看到封裝 IP完成。

ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作

至此,建立使用者IP完成。

5添加 Frq_Cnt_v1_0 IP

重建立立一個新的空的工程。

Create Block Design 直接添加 zynq7 processing system。這個前面的教程内容部分已經重複很多次了,這裡不重複。

1.在程序導航窗格中,單擊 Project Setting選項,選擇 IP,然後單擊 Add Repository 按鈕。 浏覽視窗打開,浏覽到 IP核的位置

D:/IP Core/ip_repo/Frq_Cnt_1.0 然後單擊“ Select”,單擊 OK。

ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作

3. 注意工具如何在目錄中檢測到新的 IP,點選 Apply,然後 OK。

ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作

這樣做後,就可以将

Frq_Cnt_1.0添加到目前項目的 IP庫中,下一步是将

其添加到塊設計中 ,為了此次試驗效果,本實驗還添加了 OLED IP核,添加方法

同上。

4. 由于前面的過程非常詳細,很多步驟省略,搭建完成後的系統如下圖所示

ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作

5.在源窗格中,選擇系統框圖 system.bd””,右擊并選擇 Generate Output Products,預設設定,直接點 generate,運作結束後,點選 OK。

ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作
ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作

6.在源窗格中,選擇系統框圖 system.bd””,右擊并選擇 Create HDL Wrapper

選擇第二項 Let Vivado manage Wrapper and auto update,點選 OK

ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作
ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作
添加限制檔案,如下:
set_property PACKAGE_PIN U10 [get_ports DC]
set_property PACKAGE_PIN U9 [get_ports RES]
set_property PACKAGE_PIN AB12 [get_ports SCLK]
set_property PACKAGE_PIN AA12 [get_ports SDIN]
set_property PACKAGE_PIN U11 [get_ports VBAT]
set_property PACKAGE_PIN U12 [get_ports VDD]
set_property IOSTANDARD LVCMOS33 [get_ports DC]
set_property IOSTANDARD LVCMOS33 [get_ports RES]
set_property IOSTANDARD LVCMOS33 [get_ports SCLK]
set_property IOSTANDARD LVCMOS33 [get_ports SDIN]
set_property IOSTANDARD LVCMOS33 [get_ports VBAT]
set_property IOSTANDARD LVCMOS33 [get_ports VDD]
set_property PACKAGE_PIN Y9 [get_ports {clk}]
set_property IOSTANDARD LVCMOS33 [get_ports {clk}]
set_property PACKAGE_PIN Y11 [get_ports {sig_in}]
set_property IOSTANDARD LVCMOS33 [get_ports {sig_in}]
set_property PACKAGE_PIN AA11 [get_ports {CLK1M_OUT}]
set_property IOSTANDARD LVCMOS33 [get_ports {CLK1M_OUT}]
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets sig_in_IBUF]
           
  1. 在 Flow Navigator視窗中的 Program and Debug部分, 單擊 Generate Bitstream 将出現一個對話框,要求儲存所做的修改,單擊 Save儲存; 也可能

    會出現一個對話框,顯示“ No Implementation Result Available”,單擊 Yes運作 綜

    合 和實作。 生成比特流可能會在 綜合 後 執行 整個實作過程,單擊是以在出現提

    示時運作實作。 實作 可能需要一段時間才能完成,具體取決于 計算機 的性能。

    8.點選 File > Export > Export Hardware, 確定勾選 Include bitstream 選項

    ZYNQ7000 (二十)等精度頻率計的原理分析和執行個體實作

    9.選擇 File>Launch SDK,打開 SDK,注意所有與設計相關的檔案(包

    括 IP)已經在上一步導出到 SDK中,導出的資源中包括 ZedboardOLED_v1_0 IP核的驅動。

    SDK 工程部分的 C 工程建立工程也不詳細講解,前面已經重複很多次了,

    這裡隻給出 C 代碼略作分析。

#include <stdio.h>
#include "sleep.h"
#include "xil_io.h"
#include "oled.h"
//void print(char *str);
#define REG_Cin *( volatile unsigned int *) (0x43C10000 + 4 )
#define REG_Cref *( volatile unsigned int *) (0x43C10000 + 0 )
#define REG_CLR *( volatile unsigned int * ) (0x43C10000 + 8 )
#define REG_EN *( volatile unsigned int *) (0x43C10000 + 12 )
void START_CNTR(void) {
REG_CLR = 1 ;
REG_CLR = 0 ;
REG_EN = 1 ;
}
void STOP_CNTR (){
REG_EN = 0 ;
}
void INIT_CNTR(){
REG_EN = 0 ;
REG_CLR = 1 ;
REG_CLR = 0 ;
}
int main()
{
char s [30] ;
Xil_Out32(OLED_BASE_ADDR,0xff);
OLED_Init(); //初始化液晶初始化液晶
OLED_ShowString(0,16, "BY SYSCLK.COM");
double Fref,Fin,Cref,Cin
Fref = 100000000.0000 ;
INIT_CNTR();
while(1)
{
START_CNTR() ;
sleep(7) ;
STOP_CNTR();
Cin = (double )REG_Cin * 1.00 ;
Cref =(double ) REG_Cref *1.00 ;
Fin = ( Fref * Cin ) / Cref ;
sprintf(s,"%lf",(double )Fin);
OLED_ShowString(0,0,(const u8* ) s);
OLED_Refresh_Gram();
printf("%s\n",s);
}
return 0;
}
           

下面下載下傳到闆子驗證

,本次試驗,我沒看到應有的現象,重在過程。(希望下面

做的同學給予意見)。