hls ask 调制
平滑濾波器的設計與實現(FIR)
h(n):相當于平滑系數,
采樣率:相當于采樣時鐘,就是驅動查找其幅值的時鐘
載波頻率:正弦波的周期是多少,
每個采樣周期采樣點: 采樣率 / 載波頻率
數據速率定義:已載波為載體的數據bit變化率,比如10個載波的周期是1個數據bit,那么bit率是載波頻率的1/12.5
這次我們用C++編寫了一個模擬ask調制。
本次設計中采樣時鐘使用 40MHz,數據頻率 100KHz,載波頻率 1.25MHz。既在 40MHz 的時鐘下,每個載波周期內有 40MHz/1.25MHz = 32 個采樣點;
該模塊設計思路是先內部聲明兩個數組,分別存放sin和cos波形對應的值;
模塊內部有一個計數器,在 40MHz 時鐘作用下,從 0 到 32 進行循環計數;模塊每輸入一個數,進行一次判斷,當輸入數據為 0 時,輸出為 0,當輸入數據為 1時,輸出 sin 與 cos 數組里與當前計數器對應的值每個數據周期里有 40MHz / 100KHz = 400 個采樣點;
首先產生一個波形,我們依舊是是利用matlab 先模擬出波形,然后取點,將值保存下來,到時直接賦值給對應的數組。
由于根據我們前面的計算,我們每個載波周期需要32個采樣點,所以我們在matlab 中生成將一個周期內取32點,并且將數數值保存下來,又因為標準的正弦信號的幅值范圍是-1到+1,所以我們的數據可以乘以255(9位)然后再保存下來,到時只需要賦值給我們的對應的數組就行了。其中,由于在乘積的時候,最后有小數,所以我們利用matlab中的round函數進行四舍五入取整,保存才來。
matlab程序
clc; clear all; t = 0:1/32:31/32; y1 = 255*sin(2*pi*t); y2 = 255*cos(2*pi*t); y1 = round(y1); %進行四舍五入 y2 = round(y2); file = fopen('ram.txt','w+'); fprintf(file,'%d ,',y1); fprintf(file,'\r\n'); fprintf(file,'%d ,',y2); figure(1); subplot(2,1,1);plot(t,y1); subplot(2,1,2);plot(t,y2); fclose(file);
其中關于HLS中的程序。
首先我們是用任意精度數據類型來定義我們的數據或者變量,ask 即就是當的需要調制的值是1時,輸出其波形,輸入數據為 0 時,輸出為 0,當輸入數據為 1時,輸出 sin 與 cos。
這是我們需要的程序。其中這個程序已經是約束過后的程序,我們選擇的約束的方式是AXI_stream,#pragma HLS RESOURCE variable=sin_table core=ROM_1P_BRAM latency=1 這是將這個設置為block rom, latency 都是設置為1,。
我們將程序寫完后,再寫了一個testbeech, 測試效果如何。下面是測試文件,測試代碼我們的思路與Verilog一致,就是我們要提供 一個激勵,然后進行測試就可以了。測試代碼如下
#include"tx.ask.h" int main(){ap_int<1> random_bits[64] = {1, 0, 1, 1, 0, 0, 1 ,1,1, 0, 1, 1, 0, 0, 1 ,1,1, 0, 1, 1, 0, 0, 1 ,1,1, 0, 1, 1, 0, 0, 1 ,1,1, 0, 1, 1, 0, 0, 1 ,1,1, 0, 1, 1, 0, 0, 1 ,1,1, 0, 1, 1, 0, 0, 1 ,1,1, 0, 1, 1, 0, 0, 1 ,1};ap_int<16> cos,sin;for(int i = 0; i < 64 *400 ; i++){tx_ask(random_bits[i / 400],&sin,&cos);}return 0 ; }然后我們可以進行RTL,聯合仿真查看波形,
?上圖中可以看出其滿足ASK調制,下圖我們將波形放大之后,可以看出其輸出的波形是正弦與余弦(相差π/2)
?說明:本人寫此博客只是為了記錄自己跟著尤老師學習關于通信ic 的課程,若本人寫的內容有誤,歡迎各位指出
總結
以上是生活随笔為你收集整理的hls ask 调制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mac下安装jdk8
- 下一篇: java 递归调整为队列