Flyback 发表于 2012-6-14 14:34:27

大跃进之FPGA--新手使用modelsim,仿真ep1c3内部M4K建立的rom失败

接触FPGA一个月了,开始学习也有3个星期

看的夏宇闻老师的“Verilog的数字系统设计教程”第二版,使用的SF-EP1C的简易开发板,具体芯片是EP1C3

这几天也写了流水灯,分频器,数码管显示之类的练习代码,今天使用芯片内部的M4K配置了个单口ROM,也用mif文件写入了数据,下到板子上能读出rom数据,运行正常

然后就想试试testbench仿真一下,给了激励信号,程序里有个二分频输出,仿真波形正常

M4K配置的单口ROM仿真读出来的数据全是0

软件 quratus 11 仿真modelsim-altera

仿真M4K是否需要什么特殊设置

Flyback 发表于 2012-6-14 22:35:21

FPGA的关注度果然很低……

问题还没解决,努力中

Nuker 发表于 2012-6-14 23:35:14

信息不够详细,没法帮到你。

chenguanglu 发表于 2012-6-15 07:59:44

仿真要用hex文件

Flyback 发表于 2012-6-15 08:11:22

Nuker 发表于 2012-6-14 23:35 static/image/common/back.gif
信息不够详细,没法帮到你。

新手,请见谅
//-----------------------
代码很简单,如下

module pulse (clk, rst_n, addr, pulse_out ,dout);

input                        clk,rst_n;
input        addr;
output                pulse_out;
outputdout;
//=====================================
reg pulse_out;
//-------------------------------------
//对时钟二分频,输出测试波形
always@(posedge clk or negedge rst_n)
begin
        if(!rst_n)
                pulse_out <= 0;
        else
                pulse_out <= ~pulse_out;
end
//-------------------------------------
//M4K-ROM 16位宽,32字节
m4k_rom sheet(
        .address(addr),
        .clock(clk),
        .q(dout)
        );
endmodule

测试代码如下

`timescale 1 ns/ 1 ps
module pulse_vlg_tst();
// constants                                          
// general purpose registers
reg eachvec;
// test vector input registers
reg addr;
reg clk;
reg rst_n;
// wires                                             
wire dout;
wire pulse_out;

// assign statements (if any)                        
pulse i1 (
// port map - connection between master ports and signals/registers   
        .addr(addr),
        .clk(clk),
        .dout(dout),
        .pulse_out(pulse_out),
        .rst_n(rst_n)
);
//--------------------------------
initial                                                
begin                                                                                             
//$display("Running testbench");   
        clk = 0;
        forever
                #5 clk = ~clk;                  
end                                                   
//--------------------------------
reg        cnt;
initial
begin
        rst_n = 0;
        addr = 0;
        cnt = 5'b11111;
        #1000;
                rst_n = 1;
       
        while(cnt)
        begin
                #55;
                        cnt = cnt-1'b1;
                #1;
                        addr = cnt;       
        end
        $stop;
end

McuPlayer 发表于 2012-6-15 08:34:10

是不是没有编译altera的库?

Flyback 发表于 2012-6-15 09:26:56

McuPlayer 发表于 2012-6-15 08:34 static/image/common/back.gif
是不是没有编译altera的库?

我是在quartus设置好直接调用modelsim-altera,单独使用modelsim还在看help

Nuker 发表于 2012-6-15 10:23:16

流程应该没有问题,问题是你的ROM有指定.mif文件初始化吗?

Flyback 发表于 2012-6-15 10:26:39

Nuker 发表于 2012-6-15 10:23 static/image/common/back.gif
流程应该没有问题,问题是你的ROM有指定.mif文件初始化吗?

rom已经指定了mif文件,并且手动输入了数据,下载到板子上也是正确的

不知道仿真的时候是否需要特殊设置

Nuker 发表于 2012-6-15 10:28:32

最好将你的整个工程发上来,帮你看看。

Flyback 发表于 2012-6-15 10:38:13

Nuker 发表于 2012-6-15 10:28 static/image/common/back.gif
最好将你的整个工程发上来,帮你看看。

谢谢
使用的Q11.1

chenguanglu 发表于 2012-6-15 10:51:32

再给你说或一遍 仿真要用hex文件

Flyback 发表于 2012-6-15 11:07:45

chenguanglu 发表于 2012-6-15 10:51 static/image/common/back.gif
再给你说或一遍 仿真要用hex文件

是指对应rom数据的hex文件吗,我刚把mif文件存为hex文件,编译仿真还是老样子,这个hex文件的加载时要单独设置吗

chenguanglu 发表于 2012-6-15 11:41:06

编译后看hex文件格式还对吗把hex文件往modelsim仿真目录下拷一份

Flyback 发表于 2012-6-15 11:59:15

chenguanglu 发表于 2012-6-15 11:41 static/image/common/back.gif
编译后看hex文件格式还对吗把hex文件往modelsim仿真目录下拷一份

hex格式
:02000000FA0AFA
:02000100640891
:02000200C8062E
:020003003208C1
:02000400FA0AF6
:0200050064088D
:02000600C8062A
:02000700320ABB
:02000800FA0AF2
……

看了一下,数据是对的,仿真目录下是有的
在modelsim中查看是指memory list吗,这里看到的数据都是0

chenguanglu 发表于 2012-6-15 12:05:57

那我也没办法了

Flyback 发表于 2012-6-15 13:42:51

本帖最后由 Flyback 于 2012-6-15 15:22 编辑

chenguanglu 发表于 2012-6-15 12:05 static/image/common/back.gif
那我也没办法了

文字无法表达我的感激之情{:titter:} {:titter:} {:titter:}
感谢ls各位的帮助
按照各位的提示,确定是modelsim没有读到hex数值

之前生成的封装文件我命名是m4k_rom.v
hex文件名是rom.hex

刚刚把hex的文件名修改为m4k_rom.hex

然后就奇迹般地出现数据了……

//-------------------------分割线--------------------------
仿真成功的原因不是由于文件名修改相同,原因暂时不明,楼下等高手讲解

Nuker 发表于 2012-6-15 14:53:04

我认为问题出现在这里
# ** Warning: (vsim-3534) - Failed to open file "./src/rom.mif" for reading.
# No such file or directory. (errno = ENOENT)    : d:/altera/11.1/modelsim_ase/win32aloem/../altera/verilog/src/altera_mf.v(187)
#    Time: 0 psIteration: 0Instance: /pulse_vlg_tst/i1/sheet/altsyncram_component
# ERROR: cannot read ./src/rom.mif.

而你的两个rom.mif在以下位置(相对于modelsim运行目录而言):
../../src/rom.mif
./rom.mif

Nuker 发表于 2012-6-15 14:55:29

而./src/rom.mif是你在生成ROM IP的时候指定的(m4k_rom.v第120&133行)。

Nuker 发表于 2012-6-15 15:16:06

仿真的时候调用的参数在第84行:
altsyncram_component.init_file = "./src/rom.mif",
将这行改为
altsyncram_component.init_file = "../../src/rom.mif",
即可仿真,并不一定需要hex格式,理论上hex/bin/mif格式都应该支持的。

Flyback 发表于 2012-6-15 15:20:31

本帖最后由 Flyback 于 2012-6-15 15:29 编辑

Nuker 发表于 2012-6-15 14:55 static/image/common/back.gif
而./src/rom.mif是你在生成ROM IP的时候指定的(m4k_rom.v第120&133行)。

刚刚看了下,果然是这样

我在使用megawizard的时候指定mif文件选择后file name 是./src/rom.mif,这时仿真是找不到数据的

但是我瞎捣鼓一阵后,退出又指定mif文件时file name 是./rom.mif,这时仿真就正常了

Nuker 发表于 2012-6-15 15:29:24

对,所以,看warring和error信息很重要。
以上出错信息是在你modelsim目录下msim_transcript文件里看到的,在你modelsim的transcript窗口同时也显示出来的。

Flyback 发表于 2012-6-15 23:18:30

刚刚写程序的时候,无意中发现加载mif文件,路径有时是./src/rom.mif,有时是./rom.mif的原因了

quartus默认相对路径是对于工程文件的位置的,工程文件和src文件夹在一个目录下,所以加载mif文件时,路径为./src/rom.mif

当我打开src文件夹下的文件,或者做其他对src文件夹下的操作后,默认路径就跟着变了,这时候加载的话,路径就变成./rom.mif

fdcnuaa 发表于 2014-7-20 15:52:42

MARK,保留一下,恐怕以后会用到。

a7458969 发表于 2014-7-22 13:07:24

注意MODELSIM 仿真只支持HEX文件哦
页: [1]
查看完整版本: 大跃进之FPGA--新手使用modelsim,仿真ep1c3内部M4K建立的rom失败