我对一些高级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)