- reg [31:0]Count;
- //写法1:正确
- always@(posedge sys_clk50,negedge rst_n) begin
- if(!rst_n) begin
- Count <=32'd0;
- end
- else begin
- Count <=Count+1;
- if(Count >= 5000) begin //写法正确
- Count <=0;
- end
- end
- end
-
- //写法2:编译报错
- always@(posedge sys_clk50,negedge rst_n) begin
- if(!rst_n) begin
- Count <=32'd0;
- end
- else begin
- Count <=Count+1;
- end
- //-------------------------编译报错
- if(Count >= 5000) begin
- Count <=0;
- end
- end
复制代码
verilog刚学,,不太明白,报错的提示也不理解,谢谢先
别用那种方式了。那是不对的。编译器再聪明,你还得理解语言造成的行为后再写出明确无歧义的编码才行。
你怎么老提顺序执行,这不是基于MCU的C语言。
fpga就是一堆寄存器加组合逻辑,是基于当前执行下一个clock。一个对象是顺序的;多个对象之间是并行的。
Count <=Count+1;
if(Count >= 5000) begin //写法正确
Count <=0;
end
看看你这个,当count==5000时, Count <=Count+1;和 Count <=0;同时被执行,你到底是想加1 ? 还是 置0 呢?
明显存在歧义,如果不是综合工具够聪明,你这就是自造麻烦。你应该先弄清楚语言的含义,就不会写出不合实际的代码了。
没有深刻理解非阻塞赋值。 这样写虽然不推荐,实际上逻辑上是正确的。
1、写代码要从仿真的角度看。
count <= count + 1 ;
if(count == 5000) count <= 0;
两条语句顺序执行。 同时准备count的值(并行)。 第一条语句加一后,count的值到了5000.。。。
第二条语句准备的值是4999. 所有不能使得count复位。从寄存器的角度来看,这也是正确的,也就是更新值要在一个时钟之后。
2、楼主的第二种写法,语法不能算错。 编译有错是因为要求: 条件语句要受到敏感信号的控制,也就是要受到rst信号的控制。
一周热门 更多>