<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > FPGA:數字示波器 1 - 首款設計

FPGA:數字示波器 1 - 首款設計

作者: 時(shí)間:2024-01-12 來(lái)源:EEPW編譯 收藏

以下是此處構建的內容:

本文引用地址:http://dyxdggzs.com/article/202401/454716.htm

接收兩個(gè)時(shí)鐘:

  • 一個(gè)緩慢的“系統”時(shí)鐘,固定在25MHz。

  • ADC采樣時(shí)鐘(更快,假設100MHz),連接到ADC和。

擁有這兩個(gè)時(shí)鐘為設計提供了靈活性。 但這也意味著(zhù)我們需要一種方法將信息從一個(gè)時(shí)鐘域傳輸到另一個(gè)時(shí)鐘域。 為了驗證硬件是否正常工作,讓我們走一條簡(jiǎn)單的路線(xiàn),使用FIFO。 從ADC采集的樣本以全ADC速度(100MHz)存儲在 FIFO中。

然后,FIFO內容被讀回、序列化,并以更慢的速度(115200波特)在串行端口上發(fā)送。 最后,我們將串行輸出連接到接收每個(gè)字節并顯示信號跡線(xiàn)的 PC。

對于第一次嘗試,沒(méi)有跟蹤觸發(fā)機制。 ADC存儲以隨機間隔啟動(dòng),因此跡線(xiàn)將左右跳轉,但目前還好。

設計注意事項

在100MHz頻率下,FIFO在大約10us內充滿(mǎn)。 這是相當快的。 一旦吃飽了,我們就必須停止喂食。 存儲的內容需要完全發(fā)送到 PC,然后才能再次開(kāi)始饋送 FIFO。

這里使用的串行通信工作在 115200 波特,因此大約為 10KB/s。 1024 個(gè)樣本傳輸大約需要 100 毫秒。 在此期間,示波器是“盲”的,因為我們丟棄了來(lái)自ADC的數據。 所以它在 99.99% 的時(shí)間里是盲目的。 這是此類(lèi)體系結構的典型特征。

當我們稍后添加觸發(fā)機制時(shí),這可以部分補償,因為當觸發(fā)器處于布防狀態(tài)時(shí),它會(huì )以全ADC速度工作,并且只要觸發(fā)條件發(fā)生,它就可以保持布防狀態(tài)。 稍后會(huì )詳細介紹。

注冊輸入

ADC輸出數據總線(xiàn)使用8個(gè)引腳連接到FPGA,我們稱(chēng)之為“data_flash[7:0]”。 這些產(chǎn)品的速度高達100MHz。 由于速度很快,因此最好在它們進(jìn)入 FPGA 時(shí)立即“注冊”它們。

reg [7:0] data_flash_reg;
always @(posedge clk_flash) data_flash_reg <= data_flash;

現在,“data_flash_reg”完全位于FPGA內部,可以饋送到FPGA FIFO。

先進(jìn)先出

FIFO 為 1024 字深 x 8 位寬。 由于我們每個(gè)時(shí)鐘從ADC接收8位,因此我們可以存儲1024個(gè)ADC樣本。 在100MHz時(shí),填滿(mǎn)FIFO大約需要10us。

FIFO使用FPGA內部提供的同步靜態(tài)RAM模塊。 每個(gè)存儲塊通??梢源鎯?512x8 位。因此,FIFO 使用 2 個(gè)塊。
FIFO邏輯本身是使用FPGA供應商的“函數生成器”創(chuàng )建的。 Xilinx 稱(chēng)其為“coregen”,而 Altera 則稱(chēng)其

“Megafunctions wizard”。在這里,讓我們使用 Altera 的 Quartus 來(lái)創(chuàng )建這個(gè)文件。
所以現在,使用FIFO只是一個(gè)連接問(wèn)題。

fifo myfifo(.data(data_flash_reg), .wrreq(wrreq), .wrclk(clk_flash), .wrfull(wrfull), .wrempty(wrempty), .q(q_fifo), .rdreq(rdreq), .rdclk(clk), .rdempty(rdempty));

使用FIFO很好,因為它可以處理不同的時(shí)鐘。 我們將FIFO的寫(xiě)入側連接到“clk_flash”(100MHz),將FIFO的讀取側連接到“clk”(25MHz)。

FIFO為每個(gè)時(shí)鐘域提供完整和空信號。 例如,“wrempty”是可以在寫(xiě)入時(shí)鐘域(“clk_flash”)中使用的空信號,“rdempty”可以在讀取時(shí)鐘域(“clk”)中使用。

使用FIFO很簡(jiǎn)單:寫(xiě)入它只需斷言“wrreq”信號(并將數據提供給“.data”端口),同時(shí)從中讀取斷言“rdreq”(數據來(lái)自“.q”端口)。

寫(xiě)入 FIFO

要開(kāi)始寫(xiě)入 FIFO,我們等到它為空。 當然,在上電時(shí)(配置FPGA之后),這是真的。
只有當它滿(mǎn)了時(shí),我們才會(huì )停下來(lái)。 然后這個(gè)過(guò)程又開(kāi)始了......我們等到它是空的......喂它直到它吃飽為止......停。

reg fillfifo;
always @(posedge clk_flash)
if(~fillfifo)
  fillfifo <= wrempty; // start when empty
else
  fillfifo <= ~wrfull; // stop when full

assign wrreq = fillfifo;

讀取到FIFO

我們從FIFO讀取,只要它不是空的。每個(gè)字節讀取都發(fā)送到串行輸出。

wire TxD_start = ~TxD_busy & ~rdempty;
assign rdreq = TxD_start;

async_transmitter async_txd(.clk(clk), .TxD(TxD), .TxD_start(TxD_start), .TxD_busy(TxD_busy), .TxD_data(q_fifo));

我們使用 async_transmitter 模塊對數據進(jìn)行序列化,并將其傳輸到一個(gè)名為“TxD”的引腳。

完整的設計

我們的第一個(gè)工作示波器設計,不是很好嗎?

module oscillo(clk, TxD, clk_flash, data_flash);
input clk;
output TxD;

input clk_flash;
input [7:0] data_flash;

reg [7:0] data_flash_reg; always @(posedge clk_flash) data_flash_reg <= data_flash;

wire [7:0] q_fifo;
fifo myfifo(.data(data_flash_reg), .wrreq(wrreq), .wrclk(clk_flash), .wrfull(wrfull), .wrempty(wrempty), .q(q_fifo), .rdreq(rdreq), .rdclk(clk), .rdempty(rdempty));

// The flash ADC side starts filling the fifo only when it is completely empty,
// and stops when it is full, and then waits until it is completely empty again
reg fillfifo;
always @(posedge clk_flash)
if(~fillfifo)
  fillfifo <= wrempty; // start when empty
else
  fillfifo <= ~wrfull; // stop when full

assign wrreq = fillfifo;

// the manager side sends when the fifo is not empty
wire TxD_busy;
wire TxD_start = ~TxD_busy & ~rdempty;
assign rdreq = TxD_start;

async_transmitter async_txd(.clk(clk), .TxD(TxD), .TxD_start(TxD_start), .TxD_busy(TxD_busy), .TxD_data(q_fifo));

endmodule




關(guān)鍵詞: FPGA 數字示波器

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>