AM解調的FPGA實現

2021-08-15 00:10:10 字數 4170 閱讀 9244

功能:am解調

平台:vivado 2016.4 和 matlab r2017a

簡單說明一下對資料取反的思路:如果是無符號數,則不存在符號位,也就是說資料都是正數,不需要取絕對值;如果是有符號數,通過檢測最高位的符號位,如果符號位是1,則表示資料是負數,對資料取反,如果符號位是0,則表示資料是正數,不需要取反操作。

always @(posedge clk or negedge rst_n) begin

if(!rst_n) begin

data_tdata <= 0;

endelse if(am_mod[15] == 1) begin

data_tdata <= -; //如果符號位是1,對資料取反

endelse if(am_mod[15] == 0) begin

data_tdata <= am_mod; //如果符號位是0,資料不變

endelse begin

data_tdata <= data_tdata;

endend

關於vivado的fir ip核可以說是功能很強大的,但這裡不需要其他複雜的功能,只需要簡單的生成乙個的低通濾波器就行了。

類似於rom核的生成,配置fir同樣需要matlab配合。可見,matlab的功能是多麼強大。這裡matlab的主要作用是對濾波器的效能進行**並生成相應的抽頭係數。

其他保持預設即可:

同樣,在ip核配置介面也可以檢視濾波器的幅頻特性:

ip核生成完畢後,就可以編寫ip核的呼叫模組了。

module fir_control(

input clk,

input rst_n,

input signed [15:0] s_axis_data_tdata,

output reg [7:0] data_out

);wire s_axis_data_tready;

wire m_axis_data_tvalid;

wire [39:0] m_axis_data_tdata; //濾波器輸出訊號

always @(posedge clk or negedge rst_n) begin

if(!rst_n) begin

data_out <= 0;

endelse begin

data_out <= m_axis_data_tdata[33:26]; //根據**結果進行截位

endend//--------------呼叫fir核----------------//

fir fir_inst0(

.aclk (clk),

.s_axis_data_tvalid (1), //拉高時ip核開始工作

.s_axis_data_tready (s_axis_data_tready),

.s_axis_data_tdata (s_axis_data_tdata), //輸入訊號

.m_axis_data_tvalid (m_axis_data_tvalid), //拉高時表明資料輸出有效

.m_axis_data_tdata (m_axis_data_tdata) //輸出訊號

);//---------------------------------------//

endmodule

需要注意的是:

m_axis_data_tdata訊號是濾波器的資料輸出訊號,我們在使用時一般都要對此資料進行截位操作,如何進行截位需要根據**結果來確定。比如,在這個工程中,我需要的濾波器的輸出資料是8位,但不能一下子擷取高8位,而且m_axis_data_tdata是個40位的資料,從**波形來看m_axis_data_tdata[39:34]都是符號位,因此從33位開始往下擷取8位資料(當然也可以從34位開始截,這樣的話就多了一位符號位,相應的資料位就變少了一位)。

經過fir濾波後的波形其實就是乙個疊加了直流分量的調製訊號。在本工程中,am調製是100%調製,也就是說解調時經過fir後的訊號的最小值為0,可以把它看作是無符號的數,直接經da輸出就行了。

如果不是100%調製呢?也就是說解調時經過fir後的訊號的最小值是大於0的,那麼這個大於0的量就相當於直流,需要去掉後再經da輸出。

因此,在這個工程中,不需要去直流處理。下面給出頂層檔案的**。

module top(

input clk,

input rst_n,

output [7:0] am_demod

);//--------------------------------//

reg signed [15:0] data_tdata;

wire signed [15:0] am_mod;

//--------------------------------//

//-----------取絕對值-------------//

always @(posedge clk or negedge rst_n) begin

if(!rst_n) begin

data_tdata <= 0;

endelse if(am_mod[15] == 1) begin

data_tdata <= -; //如果符號位是1,對資料取反

endelse if(am_mod[15] == 0) begin

data_tdata <= am_mod; //如果符號位是0,資料不變

endelse begin

data_tdata <= data_tdata;

endend//--------------------------------//

//-----------am已調訊號------------//

modulate modulate_inst0(

.clk (clk),

.rst_n (rst_n),

.am_mod (am_mod)

);//--------------------------------//

//----------濾波器控制模組---------//

fir_control fir_control_inst2(

.clk (clk),

.rst_n (rst_n),

.s_axis_data_tdata (data_tdata),

.data_out (am_demod)

);//--------------------------------//

endmodule

`timescale 1ns/1ps

module tb_am();

//***************====解調部分********************//

//----------介面設定----------//

reg sclk;

reg rst_n;

wire [7:0] am_demod;

//--------------------------//

initial sclk = 1;

always #5 sclk = ~sclk; //100m時鐘

initial begin

rst_n = 0;

#500

rst_n = 1;

end//----------解調模組----------//

top top_inst(

.clk (sclk),

.rst_n (rst_n),

.am_demod (am_demod)

);//---------------------------//

endmodule

基於MATLAB的AM調製解調

am調製解調原理 過程實現 遇到的問題及解決辦法 結束語am解調程式清單 摘要現在的社會越來越發達,科學技術不斷的在更新,在訊號和模擬電路裡面經常要用到調製與解調,而am的調製與解調是最基本的,也是經常用到的。用am調製與解調可以在電路裡面實現很多功能,製造出很多有用又實惠的電子產品,為我們的生活帶...

AM3730 GPMC匯流排與FPGA通訊

最近這一兩個月研究am3730的gpmc與fpga的通訊,我負責的主要是涉及到gpmc這一塊,由於之前就沒有linux基礎,剛開始的時候進展很慢,還時不時的面臨來自外界的壓力,所以那會很痛苦。前乙個月用來熟悉linux和摸清乙個方向,摸清gpmc在核心的目錄之後,開始真正的gpmc之旅。整個gpmc...

AM335x中GPMC與FPGA通訊

最近這一兩個月研究am3730的gpmc與fpga的通訊,我負責的主要是涉及到gpmc這一塊,由於之前就沒有linux基礎,剛開始的時候進展很慢,還時不時的面臨來自外界的壓力,所以那會很痛苦。前乙個月用來熟悉linux和摸清乙個方向,摸清gpmc在核心的目錄之後,開始真正的gpmc之旅。所以關於硬體...