使用官方的HDL試驗ADC資料 之一

2021-10-03 04:16:30 字數 4021 閱讀 1822

這裡主要是對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...