verilog四种循环方式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

verilog四种循环方式
verilog有四中循环方式
分别是 forever,repeat while for
initial
begin
clk = 0;
wait(reset == 1'b1)
forever #25 clk = ~clk;
end
其中wait 为电平控制,与posedge 和negedge不一样的是,他们是触发控制
if (reset = 1'b0)
repeat(10)
begin
temp = data[15];
data = {data<<1,temp};
end
location = 0;
if(data[0] == 0)
location = 32;
else
while(data[0] == 0)
begin
location += 1;
data <<1;
end
for就省略了。

还有一种零延迟循环,即
always
begin
....
end
在具体的编程过程中,碰到了这样的问题,起初用for循环来实现,发现仿真的结果都一样,都是最后一个地址的值,原因是由于for在执行过程中很快,导致前面读出的值都被后面的值覆盖,最终出现最后一个值的情况。

以下是简单的for的实例,不能实现正确的读取rom。

module for(clk,dout);
input clk;
output [3:0] dout;
reg [3:0] dout;
reg [3:0] i;
wire[3:0]table_in;
wire [3:0]table_out;
always @( posedge clk )
for(i=0;i<16;i=i+1)
dout<=table_out;
assign table_in=i;
rom wt(.table_in(table_in),.table_out(table_out));
endmodule
为了实现循环读取rom,可以将for语句改作if-else语句来实现,
就可以了。

实例如下:
module for2(clk,dout);
input clk;
output [3:0] dout;
reg [3:0] dout;
reg [3:0] i;
wire[3:0]table_in;
wire [3:0]table_out;
always @( posedge clk or posedge reset)
if (i==16)
begin
i<=0;
end
else
begin
dout<=table_out;
i<=i+1;
end
assign table_in=i;
rom wt(.table_in(table_in),.table_out(table_out));
endmodule
通过这样子的转换,就可以顺利实现rom的循环读取,另外,经过测试,好像在一个模块中使用两个rom是不可以的,虽然在语法上
没有什么错,但是在仿真的时候第二个rom会报错。

相关文档
最新文档