Memory 使用verilog的先进先出(FIFO)

Memory 使用verilog的先进先出(FIFO),memory,cpu,verilog,cpu-architecture,hdl,Memory,Cpu,Verilog,Cpu Architecture,Hdl,你好,我真的需要这方面的帮助,因为它让我发疯我使用斯巴达3E和以下是先进先出的.v文件和之后的.ucf文件。。。我只是想知道为什么我不能写入/读取内存,即使我没有得到错误,当我生成二进制文件和程序的fpga 模块fifo( 在中输入[3:0]数据, 输入时钟、rst、rd、wr、, 输出为空、满、, 输出寄存器[3:0]先进先出, 输出寄存器[3:0]数据输出 ); reg[3:0]先进先出ram[0:7]; 注册[2:0]注册登记,注册登记; 分配空=(fifo_cnt==0); 分配完整

你好,我真的需要这方面的帮助,因为它让我发疯我使用斯巴达3E和以下是先进先出的.v文件和之后的.ucf文件。。。我只是想知道为什么我不能写入/读取内存,即使我没有得到错误,当我生成二进制文件和程序的fpga


模块fifo(
在中输入[3:0]数据,
输入时钟、rst、rd、wr、,
输出为空、满、,
输出寄存器[3:0]先进先出,
输出寄存器[3:0]数据输出
); 
reg[3:0]先进先出ram[0:7];
注册[2:0]注册登记,注册登记;
分配空=(fifo_cnt==0);
分配完整=(fifo_cnt==8);
始终@(posedge clk)
开始:写

如果(wr&&!full)fifo_ram[wr_ptr]好的话,我在一块使用Altera Cyclone IV部件的de0纳米板上尝试了这个,并且能够让它工作,所以你的逻辑很好。我添加的一件事是rd和wr信号的边缘检测

使用您当前的代码(和我的板),当您按下开关时,我得到了许多连续的读写。因此,一次按下wr开关将填充fifo,一次按下读取开关将清空fifo

我将rd输入信号重命名为rd_in,将wr信号重命名为wr_in,并添加了以下代码:

always @( posedge clk ) 
begin: edge_detect
  rd_in_d <= rd_in;
  wr_in_d <= wr_in;

  rd = (rd_in && !rd_in_d);
  wr = (wr_in && !wr_in_d);
end
始终@(posedge clk)
开始:边缘检测

先进先出(fifo)代码看起来很好,似乎模拟正常。我看到数据输入总线连接到滑动开关,数据输出总线连接到LED。如何切换rd/wr信号?我正在尝试将rd/wr信号分配给斯巴达3E上的按钮,即“K17”和“H13”。。。。顺便说一句,我刚刚编辑了一个我以前在.ucf文件中犯的错误,我写的是clock而不是clk,但无论如何仍然不起作用。我假设电路板有一个固定的时钟,并且它确实位于位置“C9”?还有,你确定你的rst/wr/rd信号的极性正确吗?是的,C9是50MHz的时钟,rst/wr/rd信号的连接。看了斯巴达3E数据表后,它们似乎对我来说是正确的,但不确定它为什么现在工作:/It’It’It’It’That That令人沮丧的兄弟。。。顺便问一下,我必须声明输入为导线还是无需!!?你说的“我不会读/写”到底是什么意思?rd_in_d,wr_in_d,rd和wr被声明为reg right!!西亚诺:你太棒了,非常感谢你让我度过了美好的一天:)我很高兴这对你有用。第一次尝试让某些东西在实际硬件上工作可能会让人望而生畏,因为在很多地方可能会出现问题。如果这个问题对您有效,请确保将其检查为已回答,以便浏览这些问题的其他人知道它已回答。
# ==== Clock Source ==== 
NET "clk" LOC = "C9" | IOSTANDARD = LVCMOS33; 
NET "clk" PERIOD = 5ns HIGH 40%; 


NET "rst"     LOC "D18" | IOSTANDARD = LVTTL | PULLDOWN ;  
NET "wr"      LOC "H13" | IOSTANDARD = LVTTL | PULLDOWN ;  
NET "rd"      LOC "K17" | IOSTANDARD = LVTTL | PULLDOWN ;


# ==== Slide Switches (SW) ==== 
NET "data_in<0>" LOC = "L13" | IOSTANDARD = LVTTL | PULLUP ; #// SW1 
NET "data_in<1>" LOC = "L14" | IOSTANDARD = LVTTL | PULLUP ; #// SW2
NET "data_in<2>" LOC = "H18" | IOSTANDARD = LVTTL | PULLUP ; #// SW3
NET "data_in<3>" LOC = "N17" | IOSTANDARD = LVTTL | PULLUP ; #// SW4


# ==== Discrete LEDs (LED) ==== 
NET "data_out<3>" LOC = "F11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "data_out<2>" LOC = "E11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "data_out<1>" LOC = "E12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "data_out<0>" LOC = "F12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ; 

NET "empty"   LOC "E9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "full"    LOC "F9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
always @( posedge clk ) 
begin: edge_detect
  rd_in_d <= rd_in;
  wr_in_d <= wr_in;

  rd = (rd_in && !rd_in_d);
  wr = (wr_in && !wr_in_d);
end