做乙個FSK的收發試驗 之一

2021-10-03 05:10:26 字數 4131 閱讀 6815

這裡使用我們之前寫好的簡易的dds模組。我們先回顧一下用到的這個my_dds模組。

/*

my_dds my_dds(

.clk( ) ,

.rst( ) ,

.clr ( ) ,

.cnt( ) ,

.step( ) ,

.sin( ) ,

.cos( ) ,

); */

module my_dds(

input clk ,rst,clr ,

input [15:0] cnt,

input [7:0] step ,

output [11:0] sin ,cos

);reg local_rst ;

always@(posedge clk) local_rst <= rst | clr ;

reg [8:0] degree = 0 , sin_degree,cos_degree,nxt_degree ;

always @(posedge clk) sin_degree<=degree;

always @(posedge clk) cos_degree<=degree + 90 ;

always @* nxt_degree=degree + step ;

reg [15:0] c =0 ;

wire c_of = (cnt==0) || ( c>=cnt ) ;

always @(posedge clk) if (local_rst) c <= 0 ; else if ( c_of ) c <= 0; else c <= c + 1 ;

always @(posedge clk) if (local_rst ) degree <= 0; else if ( c==0 )

begin if (nxt_degree>=360) degree <=0;else degree <= nxt_degree ; end

sin_lut_table sin_lut_table( .clk(clk ), .addr(sin_degree ) , .q(sin ) );

sin_lut_table cos_lut_table( .clk(clk ), .addr(cos_degree ) , .q(cos ) );

endmodule

這裡改變頻率需要修改cnt或者step(或者同時修改)。我們假設要傳送簡單的1bit資料,0和1兩種情況有分別對應的cnt和step.

clk這裡也用的是基帶的取樣時鐘.我們嘗試寫**。

/*

fsk_modulator fsk_modulator (

.bb_clk(),

.bit_in() ,

.cnt0(),

.cnt1(),

.step0(),

.step1(),

.sin() ,

.cos()

);*/

module fsk_modulator(

input bb_clk,

input bit_in ,

input [15:0] cnt0,cnt1,

input [7:0] step0,step1,

output reg [11:0] sin ,cos );

wire [11:0] sin_w,cos_w;

always @(posedge bb_clk)sin<=sin_w;

always @(posedge bb_clk)cos<=cos_w;

wire [15:0] cnt0_w,cnt1_w ;

wire [7:0 ] step0_w,step1_w ;

synchronizer #( .width(16) )synchronizer_cnt0(.clk(bb_clk),.in(cnt0),.out(cnt0_w));

synchronizer #( .width(16) )synchronizer_cnt1(.clk(bb_clk),.in(cnt1),.out(cnt1_w));

synchronizer #( .width(8) )synchronizer_step0(.clk(bb_clk),.in(step0),.out(step0_w));

synchronizer #( .width(8) )synchronizer_step1(.clk(bb_clk),.in(step1),.out(step1_w));

reg [15:0] cnt = 0;

reg [7:0] step = 0 ;

always@(posedge bb_clk) cnt <= ( bit_in ) ? cnt1_w : cnt0_w ;

always@(posedge bb_clk) step <= ( bit_in ) ? step1_w : step0_w ;

my_dds my_dds(.clk( bb_clk ) ,.rst( 1'b0 ) ,.clr ( 1'b0 ) ,.cnt( cnt) ,.step( step) ,.sin(sin_w ) ,.cos(cos_w ) );

endmodule

這裡用到了synchronizer這個模組將資料跨越時鐘域傳遞過來。關於這個模組在其他的blog裡面有詳細分析。這個模組寫好放在這裡。之後我們再寫接收部分的模組。

在解調這裡我們用過零檢測的方法,我們不關心資料的具體數值,考察當收到連續的兩個其中乙個小0,接下來乙個大於等於0這個事件。我們記錄下來連續的兩個之間時間差,這樣就能判別出來傳送的是哪個頻率,也就是說是1對應的頻率還是1對應的頻率。就實現了fsk的解調。

嘗試寫**如下:

/*

fsk_demodulator #(.short_value (0) ) fsk_demodulator (

.bb_clk( ),

.bit_out( ) ,

.v_short( ) ,

.v_long( ) ,

.flag_bit( )

);*/

module fsk_demodulator #(parameter short_value = 0 )(

input bb_clk,

output reg bit_out ,

input [15:0] v_short , v_long ,

input flag_bit );

wire flag_bit_cross;

wire [15:0] v_short_w , v_long_w ;

synchronizer #( .width(16) )synchronizer_v_short(.clk(bb_clk),.in(v_short),.out(v_short_w));

synchronizer #( .width(16) )synchronizer_v_long(.clk(bb_clk),.in(v_long),.out(v_long_w));

edge_det edge_det(.clk(bb_clk),.sig(flag_bit),.pos(),.neg(flag_bit_cross));

reg [15:0] c;always @ (posedge bb_clk)c <= (flag_bit_cross)?0:(c+1);

always @ (posedge bb_clk)if (flag_bit_cross)

begin if(cv_long_w)bit_out <= ~ short_value ;end

endmodule

這裡只檢查符號位flag_bit,檢測到從下到上穿越0點時,就統計一下跟上次的間隔,如果小於閾值v_short就認為是short_value,否則當大於v_long時候就認為是 short_value的取反。在這之間的數值我們不考察,輸出依舊保持之前的輸出。

這裡為什麼要用flag_bit_cross這個名稱作為連線。檢測flag_bit取的是下降沿的數值,而因為flag_bit為1時候表示負數,為0時候表示整數,所以也就是實際代表的是波形從負數到整數或者0的轉換嗎,體現在基帶波形上是乙個上公升過程。因此這裡不說上公升也不說下降,而說穿越吧flag_bit_cross。

寫了這些**,接下來就可以先**一下檢視一下**本身有沒有小錯誤。下乙個blog再寫吧。

做乙個2ASK試驗 之一

2ask除錯模式比較簡單,就是用有訊號和沒有訊號來表示0,1。現在問題就是如何從基帶層面判斷乙個訊號是有還是沒有。當然是通過幅度。我們做乙個模組算出波谷的絕對值,和波峰相加就得到了幅度。之後設定兩個閾值,大於這個閾值1就認為是數值1,小於閾值0就認為是數值0,而在0,1之間的就保持之前的數值狀態。m...

做乙個programmer,而不做乙個coder

programmer是程式的思考者,而coder只是乙個執行者 勞心者製人,勞力者制於人 如果專案不緊的情況下,應該從需求做起,最好能夠窮盡所有的需求,遇到與別人模組互動的情況,規定好與別人互動的介面。然後才是開始設計,抓住需求當中的名詞,想想是否設計成為類,然後根據測試用例,來設計框架結構,至少要...

做乙個心靈富翁

你是否想過 怎樣的人生才是真的有價值?怎樣的生活才算自在而沒有遺憾?得到與失去 付出與收受 快樂與傷心 成功與失敗 我們又該如何看待其中的必然與不必然?親愛的,人生真的很複雜,複雜到我們窮其一生也難以解開奧秘 既然解不開,我們何妨單純看待呢!只要尋找一種屬於自己的簡單的幸福。簡單的幸福裡,也能有真實...