在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2173|回复: 9

[求助] Verilog语法问题

[复制链接]
发表于 2015-8-17 23:52:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
寄存器变量不要在两个always块中赋值,如果在两个块中赋值,quartus会报错,Error (10028): Can't resolve multiple constant drivers for net "clk_out" at div.v(45)但是在modelsim中,却不会报错?这是为什么???求解答。
发现这个问题的过程是因为我想通过50m时钟得到10k时钟和10hz时钟,,
如果代码如下:则在modelsim中不能得到10hz时钟,,只能得到10khz,,
module ts(clk,rst, clk_10k, clk_1);
    input clk;
    input rst;
    output clk_10k;
    output clk_1;
     reg clk_10k;
    reg clk_1;
    reg clk_out;
    reg [11:0] n;
    reg [8:0] m;




//-----------------fenpin-----------------------

    always@(posedge clk)

begin

    if(!rst)

begin

    clk_10k <= 1'b0;

end            
         

   else

begin

    n <= n + 12'd1;

    if( n == 12'd2500)

begin

   n <= 12'h0;

   clk_10k <= ~clk_10k;

end


end


end


    always@(posedge clk_10k)

begin

    m <= m + 9'd1;  

    if( m == 9'd500)

begin

   m <= 9'h0;

   clk_1 <= ~clk_1;

end


end

    always@( posedge clk_10k)//??

begin

    k <= k + 2'd1;

    if( k == 2'd3)

begin

   k <= 2'd0;

   clk_out <= ~clk_out;

end


end

endmodule




如果代码改为:。。则两者均能得到,,可是不是说一个变量不能在两个always块中赋值吗??
module ts(clk,rst, clk_10k, clk_1);
    input clk;
    input rst;
    output clk_10k;
    output clk_1;
    reg clk_10k;
    reg clk_1;
    reg clk_out;
    reg [11:0] n;
    reg [8:0] m;



//-----------------fenpin-----------------------

    always@(posedge clk)

begin

    if(!rst)

begin

    clk_10k <= 1'b0;


    clk_1 <= 1'b0;


    n <= 0;


    m <= 0;


end  
           
         

   else

begin

    n <= n + 12'd1;

    if( n == 12'd2500)

begin

   n <= 12'h0;

   clk_10k <= ~clk_10k;

end


end


end


    always@(posedge clk_10k)

begin

    m <= m + 9'd1;  

    if( m == 9'd500)

begin

   m <= 9'h0;

   clk_1 <= ~clk_1;

end


end



endmodule
发表于 2015-8-18 08:45:58 | 显示全部楼层
感觉正常的话应该是第一个可以编译通过,没有产生时钟,我认为可能是你的计数器没有赋初始值
reg [8:0] m=9'd0;
或者用复位给给初始值
发表于 2015-8-18 09:12:12 | 显示全部楼层
回复 2# z894811350

请教,寄存器赋初值是可综合的语法吗?
发表于 2015-8-18 09:47:27 | 显示全部楼层
回复 3# yeephycho


   这个不太懂,我之前遇到过寄存器不赋初始值,仿真的时候它不计数,总之是可以编译和仿真的。
发表于 2015-8-18 10:44:42 | 显示全部楼层
看楼主的代码头皮发麻……能否把中间的空行去掉,看半天翻不完
发表于 2015-8-18 14:28:47 | 显示全部楼层
代码不能这样写,寄存器不能在多个块中赋值,不然不同仿真器会得到不同仿真结果。一般分频这么做:
always @(posedge Clk or negedge RstN)
if(RstN == 1'b0)
begin   
    Cnt <= 0;
    ClkDiv <= 1'b0;
end
else
begin
    if(Cnt == CntDiv)
        Cnt <= 0;
    else
        Cnt <= Cnt + 1'b1;

    if(Cnt == CntDiv)
        ClkDiv <= ~ClkDiv;
end
发表于 2015-8-18 14:51:59 | 显示全部楼层
quartus是综合,modelsim是仿真,两码事。
modelsim里只要语法不错就行。
quartus里的代码必须是可综合的。
寄存器在2个always里赋值语法上是允许的,实际仿真中是强烈不推荐的,综合是不行的。
发表于 2015-8-18 15:48:01 | 显示全部楼层
回复 4# z894811350


    我印象里, reg赋初值只能在仿真中起作用. 综合时候不起作用~
发表于 2015-8-18 16:06:19 | 显示全部楼层
回复 8# yeephycho
发表于 2015-8-18 23:04:34 | 显示全部楼层
两个always块对同一个变量赋值,这样会形成多驱动,不推荐
寄存器赋初值,最好用复位给
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-25 14:44 , Processed in 0.046005 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表