找回密码
 注册
搜索
查看: 912|回复: 2

[讨论] 初学者请大家帮忙看看我的程序错在哪

[复制链接]
发表于 2007-12-10 22:39:46 | 显示全部楼层 |阅读模式
我要实现的功能是:
输入信号主频mclk,启动信号start,输出信号en和分频后的时钟信号clken。
启动信号来之前,en和clken都为0。启动信号为一个主频信号脉宽的脉冲,当检测到其为1时,en置为1,clken是mclk的100分频。在start为0时,en为0,clken也是0。
可我用波形仿真出的结果是:en始终是1(这是我最困惑的地方),clken也从开始就分频(分频结果是对的)。问题是这两个输出信号都不是在启动信号的上升沿到来之后才有,而是从仿真开始就工作。
不知我的问题说清了没有,还请达人指教。
module clken(mclk,clken,en,start);
input mclk;
input start;
output clken;
output en;
reg clken;
reg en;
reg [6:0]counter;

localparam counter1=7'h63;
always @ (posedge mclk)
begin
    en<=1'b0;
if(start==1)
  begin
  counter<=counter1;
  clken<=0;
  en<=1'b1;
  end

else
     begin
       if(en==0)
          begin
          clken<=0;
          en<=en;
          end
      
      else
         begin
           if(counter>=counter1)
              begin
              clken<=1'b1;
              counter<=0;
              end
          else
              begin
              clken<=1'b0;
              counter<=counter+1;
              end
           en<=en;
         end
       end
end
endmodule
[em04]
发表于 2007-12-16 22:34:10 | 显示全部楼层
程序写的真是够烂的
你的en在一个always 里赋值多次,而且建议加入一个reset信号,对内部的一些信号赋初值
点评回复

使用道具 举报

发表于 2007-12-17 06:26:37 | 显示全部楼层
感觉你的逻辑似乎是这样:当START置高,则en直接置高,而start为低时对en没有直接影响,此时程序转入最外层的else块执行,由于前面en已经被置高,则if(en==0)那一段不会执行,继续向下,可以发现,你没有再对en赋值,只有一个保持语句即en&lt;=en,当然en的电平会一直为高了,建议在if(counter&gt;=counter1)那一段下面加一个en&lt;=1'b0;还有,我觉得也许保持语句没有必要,只要你不对某个变量赋值,它的值就不会变,这样程序可以精简点。而且对这种一位的信号,如果需要判断它的值,建议在verilog里面可以试着简化一点,如if(en==1)可以简化成if(en),而if(en==0)可以简化成if(!en)。
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-11-24 11:39 , Processed in 0.044114 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表