在Verilog HDL中如何使用系统任务$readmemb

作者&投稿:宜怖 (若有异议请与网页底部的电邮联系)
在Verilog HDL中如何使用系统任务readmemb大神们帮帮忙~

系统任务$readmemb和$readmemh 这两个系统任务用来从文件中读取数据到存储器中。可以在仿真的任何时刻被执行使用,使用格式共六种: (1) $readmemb(“<数据文件名>”,<存储器名>); (2) $readmemb(“<数据文件名>”,<存储器名>,<起始地址>); (3) $readmemb(“<数据文件名>”,<存储器名>,<起始地址>,<结束地址>); (4) $readmema(“<数据文件名>”,<存储器名>); (5) $readmema(“<数据文件名>”,<存储器名,<起始地址>>); (6) $readmema(“<数据文件名>”,<存储器名>,<起始地址>,<结束地址>); 在这两个系统任务中,被读取的数据文件的内容只能包含:空白位置(空格、换行、制表格、注释行、二进制或十六进制的数字。数字中不能包含位宽说明和格式说明,对于$readmemb系统任务,每个数字必须使二进制数字,对于$readmemh系统任务,每个数字必须使十六进制数字。数字中不定值x或X,高阻值z或Z,和在下划线(_)的使用方法及代表的意义与一般Verilog HDL程序中的用法和意义是一样的。另外,数字必须用空白位置或注释行来分隔开。 对于上面6种系统任务格式,需补充说明一下5点: (1) 如果系统任务声明语句中和数据文件里都没有进行地址说明,则默认存放起始地址为该存储器定义语句中的起始地址。数据文件里的数据被连续存放到该存储器中,直到该存储单元存满为止或数据文件里的数据存完。 (2) 如果系统任务中说明了存放的起始地址,没有说明存放的结束地址,则数据从起始地址开始存放,存到该存储器定义语句中的结束地址为止。 (3) 如果系统任务声明语句中,结束地址和起始地址都进行了说明,则数据文件里的数据按该起始地址开始存放到存储单元中,直到该结束地址,而不考虑该存储器的定义语句的起始地址和结束地址。 (4) 如果地址信息在系统任务和数据文件里面都进行了说明,那么数据文件里的地址必须在系统任务中地址参数声明的范围之内。否则提示错误,并且装载数据到存储器中的操作被中断。 (5) 如果数据文件里的数据个数和系统任务中起始地址及结束地址暗示的数据个数不同的话,也要提示错误信息。

系统任务$readmemb和$readmemh
这两个系统任务用来从文件中读取数据到存储器中。可以在仿真的任何时刻被执行使用,使用格式共六种:
(1) $readmemb(“”,);
(2) $readmemb(“”,,);
(3) $readmemb(“”,,,);
(4) $readmema(“”,);
(5) $readmema(“”,>);
(6) $readmema(“”,,,);
在这两个系统任务中,被读取的数据文件的内容只能包含:空白位置(空格、换行、制表格、注释行、二进制或十六进制的数字。数字中不能包含位宽说明和格式说明,对于$readmemb系统任务,每个数字必须使二进制数字,对于$readmemh系统任务,每个数字必须使十六进制数字。数字中不定值x或X,高阻值z或Z,和在下划线(_)的使用方法及代表的意义与一般Verilog HDL程序中的用法和意义是一样的。另外,数字必须用空白位置或注释行来分隔开。
对于上面6种系统任务格式,需补充说明一下5点:
(1) 如果系统任务声明语句中和数据文件里都没有进行地址说明,则默认存放起始地址为该存储器定义语句中的起始地址。数据文件里的数据被连续存放到该存储器中,直到该存储单元存满为止或数据文件里的数据存完。
(2) 如果系统任务中说明了存放的起始地址,没有说明存放的结束地址,则数据从起始地址开始存放,存到该存储器定义语句中的结束地址为止。
(3) 如果系统任务声明语句中,结束地址和起始地址都进行了说明,则数据文件里的数据按该起始地址开始存放到存储单元中,直到该结束地址,而不考虑该存储器的定义语句的起始地址和结束地址。
(4) 如果地址信息在系统任务和数据文件里面都进行了说明,那么数据文件里的地址必须在系统任务中地址参数声明的范围之内。否则提示错误,并且装载数据到存储器中的操作被中断。
(5) 如果数据文件里的数据个数和系统任务中起始地址及结束地址暗示的数据个数不同的话,也要提示错误信息。

系统任务$readmemb和$readmemh
这两个系统任务用来从文件中读取数据到存储器中。可以在仿真的任何时刻被执行使用,使用格式共六种:
(1) $readmemb(“<数据文件名>”,<存储器名>);
(2) $readmemb(“<数据文件名>”,<存储器名>,<起始地址>);
(3) $readmemb(“<数据文件名>”,<存储器名>,<起始地址>,<结束地址>);
(4) $readmema(“<数据文件名>”,<存储器名>);
(5) $readmema(“<数据文件名>”,<存储器名,<起始地址>>);
(6) $readmema(“<数据文件名>”,<存储器名>,<起始地址>,<结束地址>);
在这两个系统任务中,被读取的数据文件的内容只能包含:空白位置(空格、换行、制表格、注释行、二进制或十六进制的数字。数字中不能包含位宽说明和格式说明,对于$readmemb系统任务,每个数字必须使二进制数字,对于$readmemh系统任务,每个数字必须使十六进制数字。数字中不定值x或X,高阻值z或Z,和在下划线(_)的使用方法及代表的意义与一般Verilog HDL程序中的用法和意义是一样的。另外,数字必须用空白位置或注释行来分隔开。
对于上面6种系统任务格式,需补充说明一下5点:
(1) 如果系统任务声明语句中和数据文件里都没有进行地址说明,则默认存放起始地址为该存储器定义语句中的起始地址。数据文件里的数据被连续存放到该存储器中,直到该存储单元存满为止或数据文件里的数据存完。
(2) 如果系统任务中说明了存放的起始地址,没有说明存放的结束地址,则数据从起始地址开始存放,存到该存储器定义语句中的结束地址为止。
(3) 如果系统任务声明语句中,结束地址和起始地址都进行了说明,则数据文件里的数据按该起始地址开始存放到存储单元中,直到该结束地址,而不考虑该存储器的定义语句的起始地址和结束地址。
(4) 如果地址信息在系统任务和数据文件里面都进行了说明,那么数据文件里的地址必须在系统任务中地址参数声明的范围之内。否则提示错误,并且装载数据到存储器中的操作被中断。
(5) 如果数据文件里的数据个数和系统任务中起始地址及结束地址暗示的数据个数不同的话,也要提示错误信息。

正好我昨天也遇到这个问题,
1. 把文件名改成 *.dat试试。
2. *.data 中的数据个数和你的Vmem的个数要一致,上述程序,dat文件中要有4个数据,多一个少一个好像都不行。
3. $readmemb 是读二进制文件, $readmemh是16进制文件,个人觉得后面一个方便些。
4. 数据文件名那里只写文件名好了,如果找不到,把文件放在同一个工程目录下试试

$readmemb函数要求读的是二进制数据文件
$readmemh可以读十六进制数

路径是/ 不是\~

我来救你,必须必须必须用/,而不是\,你直接复制文件路径是\,是错的,用/就对了,别问我怎么知道的,血的教训


民和回族土族自治县13562544189: 在Verilog HDL中如何使用系统任务readmemb大神们帮帮忙 -
成屠润丹: 系统任务$readmemb和$readmemh 这两个系统任务用来从文件中读取数据到存储器中.可以在仿真的任何时刻被执行使用,使用格式共六种: (1) $readmemb(“<数据...

民和回族土族自治县13562544189: 如何用verilog hdl写串口程序?
成屠润丹: 串口程序就分三个模块来写,就是发送模块、接受模块还有就是波特率模块,其中波特率模块两个模块都要用所以在顶层模块要调用两次但不是复用,只是两个相同的模块而已

民和回族土族自治县13562544189: verilog HDL 里pullup.pulldown怎么用的 -
成屠润丹: `timescale 1ns/1ps module test(); reg a; reg d; wire b; wire c; wire e; reg clk;always #10 clk = ~clk;initial beginclk =1'b0; d = 1'bx; #100; a = 1'b1; #100; a = 1'b0; #100; d = 1'bz; #100; $finish; end pulldown(b); pulldown(c); pulldown(e); assign b = ...

民和回族土族自治县13562544189: 如何用verilog HDL语言实现对一个方波序列的周期检测 -
成屠润丹: module (clk, clk2, rst_2, period); input clk,clk2,rst_2; output [9:0] period; reg [9:0] period; reg clk_1d; reg cnt[9:0]; wire clk_pos; always @ ( posedge clk2 or negedge rst_2 ) begin if ( rst_2 == 1'b0 ) begin clk_1d <= 1'b0; end else begin clk_1d <= clk; ...

民和回族土族自治县13562544189: 如何用Verilog HDL语言产生四个不同的随机数? -
成屠润丹: 可以用$random

民和回族土族自治县13562544189: 如何利用Verilog HDL语言实现6位数字动态扫描电路 -
成屠润丹: 因为是用语言做你的6位数字动态扫描电路,所以你大可不必追求某个器件,某个引脚,因为器件是你自己编,有用的端口做出来,没用的就可以不做,哥们我耗时3个小时帮你做了这个,时间紧凑,只是实现了你的需求,没有更多的修饰,当然...

民和回族土族自治县13562544189: 如何用verilog hdl设计一个产生任意频率的振荡器,谢谢了 -
成屠润丹: 通过一个相位累加器和一个相位---幅度转换器来实现.相位累加器以步进K累加,K称为频率控制字,用来控制输出波形的频率;相位---幅度转换器是将相位累加器输出的相位值转为波形对应的幅度值,简单的实现方式就是做一个查找表,比如要输出正弦波,就将一个周期正弦波进行等间隔采样、量化,存为一个查找表,利用相位累加器的输出对查找表进行寻址就可以了.输出频率 = (fclk/2^N)*K,其中N为相位累加器的位数.

民和回族土族自治县13562544189: 怎么用Verilog HDL 编写一个七段LED译码器 -
成屠润丹: module decode4_7(a,b,c,d,e,f,g,D3,D2,D1,D0); output a,b,c,d,e,f,g; input D3,D2,D1,D0; reg a,b,c,d,e,f,g; always @(D3 or D2 or D1 or D0) begin case({D3,D2,D1,D0}) 4'd0:{a,b,c,d,e,f,g}=7'b1111110; 4'd1:{a,b,c,d,e,f,g}=7'b0110000; 4'd2:{...

民和回族土族自治县13562544189: 如何使用verilog hdl 中的测试程序...·include"count4.v"这句老是报错,, -
成屠润丹: 路径没写好吧 一般在做verilog代码测试时,代码文件放到rtl文件夹 测试文件放到sim文件夹,工作建个文件夹working emacs写个filelist 把需要用到的文件.v test.v 写进去 run下就可以了 这样就不会造成文件乱七八糟的情况 重复录入等的麻烦

民和回族土族自治县13562544189: 你好,如何用Verilog HDL实现CMI编码? -
成屠润丹: 1. CMI码预备知识 CMI又称传号反转码,是一种二电平非归零码.其中“0”码用固定的负、正电平表示,“1”码用交替的正、负电平表示.具有以下优点:(1)不存在直流分量,且低频分量较小;(2)信息码流中具有很强的时钟分量,便于...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网