我对一些高级VHDL编程相对较新,并且遇到了一段时间我遇到的问题 . 我会尽量在我的问题描述中做得非常彻底 .

我正在使用带有SPARTAN-6 FPGA的Digilent Nexys-3板

这是我想要实现的:

  • 从ADC SPI总线读取数据并将其存储到BRAM中 .

  • 为此,我使用内存IP核生成器实例化一个块RAM

ADC_BRAM: bram
port map( ..
          ..
          addra => addra,
          dina => ADC_DATA,
          ..
          ..
         );

addra,ADC_DATA(存储在std_logic_vector中的SPI总线上的数据)在ADC模块中FSM的“read_adc”状态期间分配 .

  • 在ADC采样100点后,我停止写入BRAM
main: process(clk)
begin
if(rising_edge(clk)) then

case state is

when  read_adc =>
.....   
.....   
.....   
if(addra < "1100100") then
.....   
   <some code>  
   addra <= addra + 1;
.....            
elsif (addra = "1100100") then
   state <= endofconversion;
end if;

when endofconversion =>
    addra <= "00000000";
    wea   <= "0"; -- write enable for BRAM

    state <= read_bram;
  • 接下来,我想从BRAM访问数据并使用USB-UART发送它 .

  • 据我所知,所有BRAM都是同步的,因此必须用进程(clk,reset)来实现 .

  • 目前我已经在上述相同的过程中实现了状态“read_bram”

main: process(clk)
begin
if(rising_edge(clk)) then

case state is

<some code> 

when endofconversion =>
    addra <= "00000000";
    wea   <= "0"; -- write enable for BRAM

    state <= read_bram;

when read_bram =>
.... 
<some code>
....
end case;
  • 现在,UART时钟需要比读取ADC的速率慢得多 .

我的问题是“ How do i implement the read operation of the BRAM using a much slower clock, which will ensure proper functioning of the UART" ?

我还尝试了另一种方法,其中BRAM模块在顶级文件中定义,我将从ADC模块生成的“addra,ADC_DATA”发送到BRAM模块的端口映射 .

现在,在顶级如果我创建一个较慢的时钟来从BRAM读取数据(“douta”)并将其发送到UART,我需要在此过程中生成“addra”并将其发送到BRAM端口“addra”

这导致连接到信号“addra”的“多个驱动器”的问题,因为其值在ADC模块(更快的时钟)和顶级模块(更慢的时钟)的“process()”中改变 .

请帮帮我 . 如果问题描述不清楚,我可以提供更多信息 .

TLDR; How can i use 2 separate clocks while implementing synchronous memory BRAM - "faster clock => write into BRAM" -- based on ADC sampling rate - " slower clock => read from BRAM" -- based on UART clk (slower BAUD rate than ADC sampling speed)