這裡主要是對dac資料通道的unpack模組進行分析和替換。
dac就是發射部分,就是基帶通過dds方式「畫」出波形,供給9361進行混頻和發射。我們官方hdl專案裡面提供了從記憶體ddr3到ad9361引腳的資料通道。我們之前的blog都已經分析了,這裡再簡單回顧一下。
首先使用axi_dmac,將資料經過ps的hp高速介面從ddr3取出。這裡取出來是64位的,我們要根據實際要傳送的是2t還是1t進行區分,這就使用到了unpack這個模組。如果是雙路(2t)將64位分成4路16位分配給data0到data3 (分別對應tx1,tx2的i通道和q通道)。如果是單路(1t)將64位的高32位分成2路16位分配給data0,data1,之後 將64位的低32位分成2路16位分配給data0,data1。
這4路資料從unpack模組出來後就到了乙個雙時鐘fifo進行跨時鐘域的資料傳遞,將工作在基帶的unpack資料傳遞工作在fb_clk下的介面時鐘。之後就被9361發出。
實際動手試驗。
我們在sdk裡面設定使用dma產生dds。
這裡注意通關於dds資料纏身有多個通道,被遮蔽掉的data_sel_dds模式就是利用附加在ad9361介面控制部分的邏輯產生dds訊號。除此之外還有介面校準時所用的其他資料模式。 這裡的dma方式就是一種對外的方式。
我們先抓一下2r2t的波形:
可以看到,64位數資料進來後背分配在data3,data2,data1,data0上。也就是說
assign =din64[63:0] ;
由於每個週期出乙個資料,因此dac_valid訊號(起到乙個rd_fifo的作用)。這裡每週期都是64位資料被送出,所以dac_valid一直是1.
接下來看1r1t的情況。
我們看到先傳輸低32位,assign=din64[31:0] ;隻後在下乙個週期傳輸高32位assign=din64[63:32] ;
由於兩週期傳輸乙個資料,因此看到dac_valid是取一週期資料停一週期。
1r1t跟2r2t的差別體現在enable這四根線路上,當四根線都是1表示2r2t模式,enable[3:0] == 4'b0011 ,表示1r1t模式。
另外跟adc輸出那部分的分析一致的情況是無論選擇tx1還是tx2作為1r1t,傳送時候都是enable[3:0] == 4'b0011,並且資料也都輸出在data1和data0上。
有了上述的分析,我們可以寫**,實現這個unpack的替換。
module my_unpack (
input clk,
input enable0,enable1,enable2,enable3,valid_0,valid_1,valid_2,valid_3,
output valid_out_0,valid_out_1,valid_out_2,valid_out_3 ,
output reg [15:0] dout0,dout1,dout2,dout3 ,
input [63:0]din64,
output reg do_read
);parameter mode_2r2t = 4'b1111;
parameter mode_1r1t = 4'b1100;
reg [3:0] mode ; always@(posedge clk) mode<=;
reg [63:0] r64 ; always@(posedge clk)if (mode ==mode_2r2t ) r64 <= din64; else if (f) r64 <= din64 ;
assign =4'b1111;
reg f=0;always @ (posedge clk) f<=~f;
always @ (posedge clk ) if (mode ==mode_2r2t )begin <= r64 ;do_read <= 1 ;end
else if (mode==mode_1r1t) begin <= (f==0)? r64[31:0] : r64[63:32] ; do_read <= f; end
else <=0;
endmodule
這個**咱們簡答寫個測試平台檢測一下吧
module tb ;
initial begin
$dumpfile("tb.vcd");
$dumpvars( 0 , tb );
#10000000;
$finish;
endreg clk = 0 ;
always #5 clk = ~clk ;
///reg [63:0] din64 = 64'haaaa_9999_8888_7777 ;
reg [63:0] din64 = 64'h0004_0003_0002_0001 ;
/*reg [15:0] r0 = 'haaaa,r1,r2,r3;
always @(posedge clk) r0 <= r0 + 4 ;
always @(posedge clk) r1 <= r0 + 1 ;
always @(posedge clk) r2 <= r0 + 2 ;
always @(posedge clk) r3 <= r0 + 3 ;
*/wire do_read ;
always @(posedge clk) if (do_read)din64 <= din64 + 64'h0001_0001_0001_0001 ;
wire [15:0] dout0,dout1,dout2,dout3;
my_unpack my_unpack (
.clk( clk ),
.enable0( 1 ),
.enable1( 1 ),
.enable2( 0 ),
.enable3( 0 ),
.valid_0( 1 ),
.valid_1( 1 ),
.valid_2( 1 ),
.valid_3( 1 ),
.valid_out_0( ),
.valid_out_1( ),
.valid_out_2( ),
.valid_out_3( ) ,
.dout0( dout0 ),
.dout1( dout1 ),
.dout2( dout2 ),
.dout3( dout3 ) ,
.din64( din64 ),
.do_read( do_read )
);endmodule
跑一下,看看1r1t波形時候情況:
看到**結果跟抓ila抓到波形是一直的。另外這裡的do_read輸出就是上述邏輯分析儀抓到的dac_valid訊號,也是完全一致的。
之後我們跑一下2r2t 方式,就是講enable 都設定為1.**出來的波形如下:
可以看到64位資料也是平鋪給4路16位的。跟邏輯分析儀所抓波形一致。
接下來就可以將此模組替換原來的unpack模組,肯定會直接獲得成功。暫時不做了。先繼續琢磨強化一下資料通路。
重新上傳
取消
golang官方rpc包的使用
rpc remote rrocedure call,遠端過程呼叫 是乙個計算機通訊協議。rpc協議假定某些傳輸協議的存在,如tcp和udp,為通訊程式之間攜帶資訊資料。在osi網路通訊模型中,rpc跨越了傳輸層和應用層。rpc採用c s模式,請求程式就是乙個客戶機,而服務提供程式就是乙個伺服器。首先...
試驗python讀取外部資料的幾種方式
python讀取外部csv格式資料,此處資料非大資料 6tb 讀取大資料利用分段方法 主要介紹使用python自帶的函式read readlines讀取資料轉換為資料框,和使用pandas自帶的函式read csv讀取csv資料的對比 資料是csv格式,按readlines讀取時,每次讀取一行,並且...
c 使用官方驅動操作mongodb資料庫
ps 大二學生,寫寫只是為了記錄和發現,境界較低,不喜勿噴。tips 假設你已經在 windows 下安裝好了 mongodb 並且開啟了資料庫服務。也就是說,你的 mongodb 能在 mongo shell 裡跑了 然後在 中新增一下 using mongodb.driver using mon...