verilog中的两个时钟分区

时间:2014-06-09 12:38:18

标签: verilog clock division

我试图将输入时钟除以2,即输出时钟应该是输入时钟频率的一半。

module clk_div(in_clk, out_clk, rst);
  input  in_clk;
  input  rst;
  output out_clk;
  reg    out_clk;

always @(posedge in_clk) begin
  if (!rst) begin
    out_clk <= 1'b0;
  end
  else 
    out_clk <= ~out_clk;
end
endmodule

测试平台

module dd;
  // Inputs
  reg clk_in;
  reg reset;

  // Outputs
  wire clk_out;

  // Instantiate the Unit Under Test (UUT)
  clk_div uut (
    .clk_in(clk_in), 
    .reset(reset), 
    .clk_out(clk_out)
  );

  always #10 clk_in =~clk_in ;

  initial begin
    // Initialize Inputs
    clk_in = 0;
    reset  = 0;
    #100;
    reset  = 1;
  end   
endmodule

输出波形仅显示正在生成的输入时钟。无论我尝试什么,输出时钟波形都不会出现。这个代码对于时钟分为两个是否正确?

3 个答案:

答案 0 :(得分:2)

您需要更改实例中的端口名称。将您的实例更改为:

clk_div uut (
    .in_clk(clk_in), 
    .rst(reset), 
    .out_clk(clk_out)
);

我通过此修复得到了2分。

您的代码在我的2个模拟器上有编译错误。它真的为你编译了吗?

答案 1 :(得分:0)

我认为问题在于您需要使用逻辑否定运算符(!)而不是按位求反运算符(~)。请参阅信息here

有关将时钟除以2的完整,经过验证的示例see here

答案 2 :(得分:0)

我使用以下代码作为时钟分频器。只需更改参数并获得所需的输出......

 module clk_div(
                clk,
                rst,
                count);

parameter count_width=27;
parameter count_max=25000000;

output [count_width-1:0] count;
reg [count_width-1:0] count;
input clk,rst;


initial
count<=0;

always@(posedge clk)
if(rst)
begin
    count=0;
end


else 
begin
if (count<count_max-1)
begin
    count<=count+1;
end


else if (count==count_max)
begin
    count <=~count;
end


else if (count>count_max)
begin
    count<=0;
end
end
endmodule