求助关于ise与microblaze数据交互问题

时间:2022-01-07 21:13:12
我是用的13.4版本的,方式是用的shared bram,将bram端口a挂在microblaze上,端口b引出到ise中,vhdl程序如下,由于所用板子原因,加了一个倍频核
entity cpu_top is
  port (
    fpga_0_LEDS_GPIO_IO_O_pin : out std_logic_vector(0 to 3);
    clk_10 : in std_logic  );
end cpu_top;

architecture STRUCTURE of cpu_top is
COMPONENT my_dcm
PORT(
CLKIN_IN : IN std_logic;
RST_IN : IN std_logic;          
CLKFX_OUT : OUT std_logic;
CLKIN_IBUFG_OUT : OUT std_logic;
LOCKED_OUT : OUT std_logic
);
END COMPONENT;
  component cpu is
    port (
      fpga_0_LEDS_GPIO_IO_O_pin : out std_logic_vector(0 to 3);
      fpga_0_clk_1_sys_clk_pin : in std_logic;
      fpga_0_rst_1_sys_rst_pin : in std_logic;
      bram_out_BRAM_EN_B_pin : in std_logic;
      bram_out_BRAM_WEN_B_pin : in std_logic_vector(0 to 3);
      bram_out_BRAM_Addr_B_pin : in std_logic_vector(0 to 31);
      bram_out_BRAM_Din_B_pin : out std_logic_vector(0 to 31);
      bram_out_BRAM_Dout_B_pin : in std_logic_vector(0 to 31);
      xps_gpio_en_0_GPIO_IO_pin:in std_logic  --控制软核读取信号
    );
  end component;

  attribute BOX_TYPE : STRING;
  attribute BOX_TYPE of cpu : component is "user_black_box";
  
  signal clk_50,locked:std_logic;
  signal temp_in,temp_out:std_logic_vector(0 to 31);
  signal cnt:std_logic_vector(0 to 31);
  signal wen_b:std_logic_VECTOR(0 TO 3):="1111";
  signal led:std_logic:='1';


process(clk_50)
variable cnt_1:std_logic_vector(0 to 15);
variable cnt_2:std_logic_vector(0 to 15);
variable wen:std_logic_vector(0 to 3);
begin
if(rising_edge(clk_50))then
if cnt_1=x"0011" then
wen:="0000";
led<='0';
else
cnt_1:=cnt_1+1;
cnt_2:=cnt_2+1;
end if;
end if;
wen_b<=wen;
cnt<=x"0000"&cnt_1;
temp_in<=x"0000"&cnt_2;
end process;

begin
Inst_my_dcm: my_dcm PORT MAP(
CLKIN_IN => clk_10,
RST_IN => '0',
CLKFX_OUT => clk_50,
CLKIN_IBUFG_OUT => open,
LOCKED_OUT => locked
);

  cpu_i : cpu
    port map (
      fpga_0_LEDS_GPIO_IO_O_pin => fpga_0_LEDS_GPIO_IO_O_pin,  --读取完成后点亮led
      fpga_0_clk_1_sys_clk_pin => clk_50,
      fpga_0_rst_1_sys_rst_pin => locked,
      bram_out_BRAM_EN_B_pin => '1',
      bram_out_BRAM_WEN_B_pin => wen_b,
      bram_out_BRAM_Addr_B_pin => cnt,
      bram_out_BRAM_Din_B_pin => temp_out,
      bram_out_BRAM_Dout_B_pin => temp_in,
      xps_gpio_en_0_GPIO_IO_pin=>led
    );
end architecture STRUCTURE;


对应c代码如下:
#include <stdio.h>
#include "platform.h"
#include "xil_io.h"
#include "xparameters.h"
#include "xgpio.h"
#include <xio.h>
#include "xbram.h"
#include "xgpio_l.h"

int main()
{
int j,m=0;
XBram_Config *ConfigPtr;

u32 bram_data[256]={0x0};
while(1)
{
i=XIo_In32((u32*)XPAR_XPS_GPIO_EN_0_BASEADDR);
while(i==0x0)
{

/* for(i=0;i<256;i++)
{
XIo_Out32((u32*)(XPAR_BRAM_OUT_IF_CNTLR_BASEADDR+i),0x1);
}
*/
// for(m=0;m<9999999;m++);
ConfigPtr = XBram_LookupConfig(XPAR_BRAM_OUT_IF_CNTLR_DEVICE_ID);
if (ConfigPtr == (XBram_Config *) NULL) {
break; }
for(j=0;j<256 ;j++)
{
bram_data[j]=XIo_In32((u32*)(XPAR_BRAM_OUT_IF_CNTLR_BASEADDR+j));
}
XIo_Out32(XPAR_LEDS_BASEADDR, 0xF);
k=1;
break;
}
if (k==1) break;
}
    return 0;
}
我分步测试发现就没有进入到第二个while循环中去,然后我把循环去掉,直接读取,
读取出来的数不是我写进去的数,而且是连着的四个数是一样的,是写的过程不对吗?
我在c里面直接自己写自己读取就是对的,大神们救救我吧,搞不出来都不让我回家,赶紧回家过年了 呜呜呜。。。。

5 个解决方案

#1


ISE那边读写正常吗?

#2


ise那边只是写数据,然后在sdk里面读出来,但是读不到数据,所以肯定是ise这边没写成功,但是不是这样写还能怎么写呢? 疑惑啊  还请帮忙看看啊  多谢  。 把bram端口引到ise端,然后让en和wen始终有效,给地址给数据不就写进去了吗?是不是还有别的需要注意的呢 ?

#3


引用 1 楼 falloutmx 的回复:
ISE那边读写正常吗?


引用 1 楼 falloutmx 的回复:
ISE那边读写正常吗?

ise那边只是写数据,然后在sdk里面读出来,但是读不到数据,所以肯定是ise这边没写成功,但是不是这样写还能怎么写呢? 疑惑啊  还请帮忙看看啊  多谢  。 把bram端口引到ise端,然后让en和wen始终有效,给地址给数据不就写进去了吗?是不是还有别的需要注意的呢 ?

#4


...我也碰到这问题,可以问问楼主解决了吗?还有怎么从ISE读ram里的内容啊

#5


你好,我现在也遇到这个问题,在C语言中自己写自己读也是连续输出四个相同的数据,不知道为什么。求指导。。

#1


ISE那边读写正常吗?

#2


ise那边只是写数据,然后在sdk里面读出来,但是读不到数据,所以肯定是ise这边没写成功,但是不是这样写还能怎么写呢? 疑惑啊  还请帮忙看看啊  多谢  。 把bram端口引到ise端,然后让en和wen始终有效,给地址给数据不就写进去了吗?是不是还有别的需要注意的呢 ?

#3


引用 1 楼 falloutmx 的回复:
ISE那边读写正常吗?


引用 1 楼 falloutmx 的回复:
ISE那边读写正常吗?

ise那边只是写数据,然后在sdk里面读出来,但是读不到数据,所以肯定是ise这边没写成功,但是不是这样写还能怎么写呢? 疑惑啊  还请帮忙看看啊  多谢  。 把bram端口引到ise端,然后让en和wen始终有效,给地址给数据不就写进去了吗?是不是还有别的需要注意的呢 ?

#4


...我也碰到这问题,可以问问楼主解决了吗?还有怎么从ISE读ram里的内容啊

#5


你好,我现在也遇到这个问题,在C语言中自己写自己读也是连续输出四个相同的数据,不知道为什么。求指导。。