2ASK調制技術總的來說很簡單,先産生二進制基帶信号,産生一個載波信号,利用一個2選1開關電路進行輸出。比如為1輸出載波,為0則置0。
按照這樣的思想,我們可以得出2FSK、2PSK的調制。對于2FSK,要産生兩個不同頻率的載波信号,最後為1輸出一個,為0輸出另外一個。2PSK則隻用産生一個,為1,輸出,為0取反輸出。
下面介紹2ASK整體子產品的實作,最後文末給出整個示例工程。至于2FSK、2PSK,大家應該能舉一反三,輕松完成。
我們先來确定一些參數。比如說我這裡選取系統時鐘為50M,經過50分頻後為1M,利用分頻後的時鐘來産生基帶信号,那麼碼元速率就為1M。至于載波信号,我這裡選取4M。這些參數大家可以按照實際情況來改。
時鐘分頻子產品
module clk_div(
input clk,
output reg clk_out
);
reg [13:0] cnt;
parameter N = 50;
always @(posedge clk)
begin
if(cnt == N/2 - 1)begin
cnt <= 14'b0;
clk_out <= ~clk_out;
end
else
cnt <= cnt + 1'b1;
end
endmodule
二進制序列生成子產品
module MXL(
input clk,
output reg out
);
reg[4:0]tmp = 5'b0;
always @(posedge clk)
begin
if(tmp > 5'd31)
tmp <= 5'd0;
else
tmp <= tmp + 1'b1;
case(tmp)
5'd0: out <= 0;
5'd1: out <= 0;
5'd2: out <= 1;
5'd3: out <= 1;
5'd4: out <= 1;
5'd5: out <= 1;
5'd6: out <= 0;
5'd7: out <= 0;
5'd8: out <= 0;
5'd9: out <= 0;
5'd10: out <= 1;
5'd11: out <= 1;
5'd12: out <= 1;
5'd13: out <= 1;
5'd14: out <= 0;
5'd15: out <= 0;
5'd16: out <= 1;
5'd17: out <= 0;
5'd18: out <= 1;
5'd19: out <= 0;
5'd20: out <= 1;
5'd21: out <= 1;
5'd22: out <= 0;
5'd23: out <= 1;
5'd24: out <= 1;
5'd25: out <= 0;
5'd26: out <= 1;
5'd27: out <= 1;
5'd28: out <= 1;
5'd29: out <= 1;
5'd30: out <= 0;
5'd31: out <= 0;
endcase
end
endmodule
NCO子產品(生成載波信号)
該子產品基于查表法,sin_table提供。
頻率計算方法,這裡我們選取16位cnt,時鐘為50M,那麼頻率為50M*5243/2^16=4M
可以通過改變cnt,利用上述計算方式,生成任意頻率信号。
module nco(
input clk,
output reg [7:0]sin
);
reg [15:0]cnt;
wire [7:0]sin_table_out;
initial cnt <= 0;
always @(posedge clk)
begin
cnt <= cnt + 16'd5243;
sin <= sin_table_out;
end
sin_table INS_SINTABLE(cnt[15:7],sin_table_out);
endmodule
2選1開關電路
module choose(
input [7:0]data_in,
input sel,
output [7:0]data_out
);
reg[7:0]daout;
always @(sel)
begin
if(sel)
daout <= data_in;
else
daout <= 8'd0;
end
assign data_out = daout;
endmodule
最後附上用Signal Tap仿真出來的圖

哈哈,一個簡單的2ASK調制仿真就出來了。如果感興趣的話就按照我開頭所講的方法,把2FSK和2PSK實作一下吧。
最後附上整個示例工程檔案
連結:https://pan.baidu.com/s/17YGL-9Stcr_uSsyEiJg0SQ
提取碼:ahqz
參考資料
https://blog.csdn.net/VCA821/article/details/80768078