块ram(BRAM)使用不同的时钟进行读写

时间:2016-05-25 23:53:00

标签: vhdl

我对一些高级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总线上的数据)在" read_adc"期间分配。 ADC模块中的FSM状态。

  • 在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)实现。

  • 目前我已经实施了国家&#34; read_bram&#34;在与上述相同的过程中

    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的速率慢得多。

我的问题是&#34; 如何使用更慢的时钟实现BRAM的读操作,这将确保UART的正常运行。 ?

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

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

这导致&#34;多个司机&#34;连接到信号&#34; addra&#34;,因为它的值在&#34;过程中变化()&#34; ADC模块(更快的时钟)和顶层模块(更慢的时钟)。

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

TLDR;在实现同步存储器BRAM时,如何使用2个独立的时钟   - &#34;更快的时钟=&gt;写入BRAM&#34; - 基于ADC采样率   - &#34;慢时钟=&gt;阅读BRAM&#34; - 基于UART clk(较低的BAUD率而不是ADC采样速度)

0 个答案:

没有答案