我对一些高级VHDL编程相对较新,并且遇到了一段时间我遇到的问题。 我会尽量在问题描述中做得非常透彻。
我正在使用带有SPARTAN-6 FPGA的Digilent Nexys-3板
以下是我要实施的内容:
为此,我使用内存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采样速度)