新闻中心

EEPW首页>嵌入式系统>设计应用> FPGA:数字示波器 2 - 双端口 RAM

FPGA:数字示波器 2 - 双端口 RAM

作者: 时间:2024-01-12 来源:EEPW编译 收藏

FIFO使我们能够非常快速地获得工作设计。
但对于我们简单的示波器来说,这有点矫枉过正。

我们需要一种机制来存储来自一个时钟域(100MHz)的数据,并在另一个时钟域(25MHz)中读取数据。 一个简单的双端口RAM就可以做到这一点。 缺点是两个时钟域之间的所有同步(FIFO为我们所做的)现在必须“手动”完成。

本文引用地址://m.amcfsurvey.com/article/202401/454719.htm

触发

“基于 FIFO”的示波器设计没有明确的触发机制。
让我们改变一下。 现在,每次从串行端口接收到字符时,示波器都会被触发。 当然,这仍然不是一个非常有用的设计,但我们稍后会对其进行改进。

我们使用“async_receiver”从串行端口接收数据:

wire[7:0] RxD_data;
async_receiverasync_rxd(.clk(clk), .RxD(RxD), .RxD_data_ready(RxD_data_ready), .RxD_data(RxD_data));


每当收到一个新角色时,“RxD_data_ready”就会升高一个时钟。 我们用它来触发示波器。

同步

我们需要将这种“RxD_data_ready变高”的信息从“clk”(25MHz)域传输到“clk_flash”(100MHz)域。

首先,当接收到字符时,信号“startAcquisition”变为高电平。

regstartAcquisition;
wireAcquisitionStarted;

always@(posedgeclk)
if(~startAcquisition)
startAcquisition <= RxD_data_ready;
else
if(AcquisitionStarted)
startAcquisition <= 0;


我们使用 2 个触发器形式的同步器(将此“startAcquisition”传输到另一个时钟域)。

regstartAcquisition1;always@(posedgeclk_flash) startAcquisition1 <= startAcquisition;
regstartAcquisition2;always@(posedgeclk_flash) startAcquisition2 <= startAcquisition1;


最后,一旦另一个时钟域“看到”信号,它就会“回复”(使用另一个同步器“获取”)。

regAcquiring;
always@(posedgeclk_flash)
if(~Acquiring)
Acquiring <= startAcquisition2; // start acquiring?
else
if(&wraddress) // done acquiring?
Acquiring <= 0;

regAcquiring1;always@(posedgeclk) Acquiring1 <= Acquiring;
regAcquiring2;always@(posedgeclk) Acquiring2 <= Acquiring1;
assignAcquisitionStarted = Acquiring2;


回复将重置原始信号。

双端口RAM

现在触发器可用,我们需要一个双端口RAM来存储数据。
请注意 RAM 的每一侧如何使用不同的时钟。

ram512ram_flash(
.data(data_flash_reg), .wraddress(wraddress), .wren(Acquiring), .wrclock(clk_flash),
.q(ram_output), .rdaddress(rdaddress), .rden(rden), .rdclock(clk)

);


使用二进制计数器可以轻松创建 ram 地址总线。
首先是写地址:

reg[8:0] wraddress;
always@(posedgeclk_flash)if(Acquiring) wraddress <= wraddress + 1;


和读取地址:

reg[8:0] rdaddress;
regSending;
wireTxD_busy;

always@(posedgeclk)
if(~Sending)
Sending <= AcquisitionStarted;
else
if(~TxD_busy)
begin
rdaddress <= rdaddress + 1;
if(&rdaddress) Sending <= 0;
end


请注意每个计数器如何使用不同的时钟。

最后,我们将数据发送到 PC:

wireTxD_start = ~TxD_busy & Sending;
wirerden = TxD_start;

wire[7:0] ram_output;
async_transmitterasync_txd(.clk(clk), .TxD(TxD), .TxD_start(TxD_start), .TxD_busy(TxD_busy), .TxD_data(ram_output));

完整的设计

moduleoscillo(clk, RxD, TxD, clk_flash, data_flash);
inputclk;
inputRxD;
outputTxD;

inputclk_flash;
input[7:0] data_flash;

///////////////////////////////////////////////////////////////////
wire[7:0] RxD_data;
async_receiverasync_rxd(.clk(clk), .RxD(RxD), .RxD_data_ready(RxD_data_ready), .RxD_data(RxD_data));

regstartAcquisition;
wireAcquisitionStarted;

always@(posedgeclk)
if(~startAcquisition)
startAcquisition <= RxD_data_ready;
else
if(AcquisitionStarted)
startAcquisition <= 0;

regstartAcquisition1;always@(posedgeclk_flash) startAcquisition1 <= startAcquisition ;
regstartAcquisition2;always@(posedgeclk_flash) startAcquisition2 <= startAcquisition1;

regAcquiring;
always@(posedgeclk_flash)
if(~Acquiring)
Acquiring <= startAcquisition2;
else
if(&wraddress)
Acquiring <= 0;

reg[8:0] wraddress;
always@(posedgeclk_flash)if(Acquiring) wraddress <= wraddress + 1;

regAcquiring1;always@(posedgeclk) Acquiring1 <= Acquiring;
regAcquiring2;always@(posedgeclk) Acquiring2 <= Acquiring1;
assignAcquisitionStarted = Acquiring2;

reg[8:0] rdaddress;
regSending;
wireTxD_busy;

always@(posedgeclk)
if(~Sending)
Sending <= AcquisitionStarted;
else
if(~TxD_busy)
begin
rdaddress <= rdaddress + 1;
if(&rdaddress) Sending <= 0;
end

wireTxD_start = ~TxD_busy & Sending;
wirerden = TxD_start;

wire[7:0] ram_output;
async_transmitterasync_txd(.clk(clk), .TxD(TxD), .TxD_start(TxD_start), .TxD_busy(TxD_busy), .TxD_data(ram_output));

///////////////////////////////////////////////////////////////////
reg[7:0] data_flash_reg;always@(posedgeclk_flash) data_flash_reg <= data_flash;

ram512ram_flash(
.data(data_flash_reg), .wraddress(wraddress), .wren(Acquiring), .wrclock(clk_flash),
.q(ram_output), .rdaddress(rdaddress), .rden(rden), .rdclock(clk)
);

endmodule




关键词:FPGA数字示波器

评论


相关推荐

技术专区

关闭