功能: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之旅。所以關於硬體...