verilog中寄存器的初始值问题,

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了verilog中寄存器的初始值问题,相关的知识,希望对你有一定的参考价值。

module rs(q,qn,s,r);
output q,qn;
input s,r;
reg q,qn;
reg q1,qn1;
always@(*)
begin
q1=~(s&qn1);
qn1=~(r&q1);
q=q1;
qn=qn1;
end
endmodule
我刚刚学习verilog,q1,qn1没有初始化。这个程序时怎么执行的,是不是寄存器有默认的初始值。还有附加一个问题,输出什么时候有wire类型。

1、首先,verilog是硬件描述语言,不是软件编程语言,所以没有“执行”的概念,也没有“默认初始值”的概念;

2、你这几句描述的是一个组合逻辑循环(combinational Loop),这是硬件设计里的错误,初学者往往会出现这种错误;

3、如果非要把你的东西“转化”为硬件的话,如下图所示:

追问

我看到课本上有一个这样的例子,没有看懂,我想知道,这是什么样的错误。课本上的这样的例子比较多

参考技术A 输出有wire 通常是用在程序例化的时候才会用到~通常你不用initial语句给寄存器定义初值的话默认结果应该是1~因为你进行与操作而且还取反~所以出来是1~q1和qn1原始值应该是0~!

verilog 二维数组是如何初始化的啊?

我现在是要将matlab中已实现的算法用verilog实现,其中,我在matlab中e=[1;zeros(n-1,1)],在verilog中我不知道如何比较好的初始化,我现在想得是先定义reg signed [20:0] e[n-1:0];再对e赋值,这样行吗?还有怎样赋值呢?是用for循环吗?

你说的这种情况我在前几天的毕设中也遇到过,这种情况只能用fpga中的寄存器或者RAM块来实现.
具体的话,你说的这种定义是不可行的,可以参考上面几位说的用lpm_rom ip核来实现--就是在FPGA中实现一个订制ROM或者RAM,选用哪种看实际情况.像你这种算法处理的话应该用RAM来反复进行算法的计算.
还有一点需要注意的是FPGA实现算法尽量用流水线来实现.因为FPGA的寄存器资源有限.数据的反复计算再存储可能需要大量的寄存器,这样可能造成实现困难,解决方法要看你实现的算法能不能进行一些优化.比如像FFTip里用到的一个小技巧一组数据计算后又存到原来的寄存器组中.
自己的一点小经验希望能帮到你

参考资料:FPGA verilog语法 eda

参考技术A 您说的二维数组在verilog中表示一个储存器,ram或rom。
建立这个储存器两种初始化方法一种就是:有规律的数据用for是可以赋值的

但是如果是很多无规律的数据需要您建立lpm_rom,并将数据写入.mif文件后加载到rom中,

欢迎追问。
参考技术B module test(
input wire rst_n // Reset, Active Low
,input wire clk
//
// Add other inputs and outputs here
//
);
integer k;
parameter n = 10; // set the value of n here
reg signed [20:0] e[0:n-1];
always @(posedge clk or negedge rst_n) begin
if(~rst_n) begin
for(k=0;k<n;k=k+1) e[k] <= 21'h0; // set initial value of matrix to all zero here
end
else begin
// change the value of e here normally
end
end

endmodule本回答被提问者和网友采纳
参考技术C 你说的二维数组实际上是一个memory类型的变量,verilog里是没有数组的。这个有很多方式,楼上的方法可以,可以用initial. 还可以用文件来初始化:$readmemb 或 $readmemh。看你想干什么用,设计的时候要对应硬件模型

以上是关于verilog中寄存器的初始值问题,的主要内容,如果未能解决你的问题,请参考以下文章

verilog 寄存器初始化

问个verilog二维寄存器初始化的问题

Verilog中wire与reg类型的区别

Verilog里面如何初始化数组才能被Quartus II综合?

如何使用 Verilog 任务将值输出到寄存器?

verilog中不支持的值类型是