如果条件具有外部选择的值

时间:2014-06-16 10:21:04

标签: counter verilog

我是Verilog的新手,这可能是一个愚蠢的问题,但Verilog解决此问题的首选代码流是什么:

简单计数器,将外部clk(INP)计数到特定值。如果计数器与该值匹配,则它会在一个clk周期内上升输出线(DRDY),然后将其降低为0.有一个外部输入(SR),我想设置比较值,因此如果SR = 0 ,那么计数最多为500000,如果SR = 1则最多为1000000.我可以用一个值来完成,但是我想扩展我的模块的功能。

提前谢谢。

到目前为止,我的代码只有一个值比较:

module ec(INP, RST, SR, DRDY, DRDY2);

input INP, RST, SR;
output reg DRDY, DRDY2;

reg [23:0] Q;





always @(posedge INP or negedge RST)
begin
    if(!RST)
        begin
        Q <= 24'd0;
        DRDY <= 1'b0;
        end
    else if( Q == 24'd1000000) 
        begin
            Q <= 24'd0;
            DRDY <= 1'b1;
            DRDY2 <=~DRDY2;
        end             
    else
        begin   
        Q <= Q + 1;
        DRDY <= 1'b0;
        end
end

endmodule

1 个答案:

答案 0 :(得分:0)

处理2个选项的简单方法是展开if语句:

always @(posedge INP or negedge RST) begin
  if(!RST) begin
    Q    <= 24'd0;
    DRDY <= 1'b0;
  end
  else if( 
    ( (SR ==1'b0) && (Q == 24'd1000000) ||
      (SR ==1'b1) && (Q == 24'd500000)
     ) begin
        //...
   end             
else begin   
  //..
end

这在代码中看起来很混乱,因此可以分成计数目标逻辑,如果要支持更多选项,则切换到case语句而不是if。

reg [23:0] cnt_target ;
always @* begin 
  if (SR == 1'b1) begin
    cnt_target = 24'd1000000 ;
  else begin
    cnt_target = 24'd500000  ;
  end
end

always @(posedge INP or negedge RST) begin
  if(!RST) begin
    Q    <= 24'd0;
    DRDY <= 1'b0;
  end
  else if( Q == cnt_target) begin
        //...
   end             
  else begin   
    //..
  end

注意:如果SR动态更改,您可能需要考虑使用Q >= cnt_target,而不必等待Q溢出。对于我来说,加>=的合成往往小于==