VERILOG语法书写时,心中一定想到硬件。每一个语法表达式对应一个硬件电路。如果对应不起来,肯定会出错!
按照上面这个规范,我们来分析你三种表达方式:
写法1:reg [15:0]cnt_2; always @(posedge clk or negedge rst_n) begin if(!rst_n) cnt_2<=0; else if(cnt_2==16'd50000) cnt_2<=0; cnt_2<=cnt_2+1; end
该表达式是标准写法,可以综合成一个标准的计数器电路。
写法2:reg [15:0]cnt_2; always @(posedge clk or negedge rst_n) begin cnt_2<=cnt_2+1; if(!rst_n) cnt_2<=0; else if(cnt_2==16'd50000) cnt_2<=0; end
该表达式错误在于,在RST_N由高变低时,根据语法表示式理解,CNT_2 要求加1,同时又要求CNT_2清0. 在任何时候,硬件只能完成一个动作,同一时刻要求2个动作,硬件就会无所适从了,所以编译器报错了。
写法3:reg [15:0]cnt_2; always @(posedge clk or negedge rst_n) begin if(!rst_n) cnt_2<=0; else if(cnt_2==16'd50000) cnt_2<=0; else cnt_2<=cnt_2+1; end
该表达正确,满足异步复位的标准电路,且在不同条件下,可以产生不同值。 |