2017-10-18 86 views
0

我試圖實現4個時鐘信號,在Verilog中一個接一個地被激活。我寫了一個模塊,但林不知道如何做一個測試平臺它,因爲即時得到錯誤:創建一個4步時鐘

error: clk_pc Unable to assign to unresolved wires. 

我想到這樣一個結果:

1000 
0100 
0010 
0001 
1000 
0100 
... 

這是模塊:

module clock_divisor(input clk0, 
        input clk1, 
        input clk2, 
        input clk3, 
        output clk0_out, 
        output clk1_out, 
        output clk2_out, 
        output clk3_out); 

    reg clk0_out,clk1_out,clk2_out,clk3_out; 
    always @(posedge clk0 or posedge clk1 or posedge clk2 or posedge clk3) begin 
     if(clk0 == 1)begin 
      assign clk0_out = 0; 
      assign clk1_out = 1; 
      assign clk2_out = 0; 
      assign clk3_out = 0; 
     end 
     else if(clk1 == 1)begin 
      assign clk0_out = 0; 
      assign clk1_out = 0; 
      assign clk2_out = 1; 
      assign clk3_out = 0; 
     end 
     else if(clk2 == 1)begin 
      assign clk0_out = 0; 
      assign clk1_out = 0; 
      assign clk2_out = 0; 
      assign clk3_out = 1; 
     end 
     else if(clk3 == 1)begin 
      assign clk0_out = 1; 
      assign clk1_out = 0; 
      assign clk2_out = 0; 
      assign clk3_out = 0; 
     end 
    end 

endmodule 

而我的測試平臺:

module testbench(); 
    reg clk_pc, clk_instruction_memory, clk_alu, clk_registers, reset; 
    // Clock Management 
    clock_divisor clock_divisor (clk_pc, 
           clk_instruction_memory, 
           clk_alu, 
           clk_registers, 
           clk_pc, 
           clk_instruction_memory, 
           clk_alu, 
           clk_registers); 
    initial begin 
     clk_pc = 1; 
    end 

    initial 
    #500 $finish; 


    initial begin 
    //$display (" Pc\tCLK\treset\tCurrent-inst"); 
    //$monitor(" %d\t%b\t%b\t%h", pc, clk_pc, reset, current_instruction); 

    //Monitor Clocks 
    $display (" CLK0\tCLK1\tCLK2\tCLK3"); 
    $monitor(" %b\t%b\t%b\t%b", clk_pc, clk_instruction_memory, clk_alu, clk_registers); 
    end 

endmodule 

任何人都可以告訴我爲什麼我得到這個錯誤,我怎麼讓我的模塊按預期工作?

+1

什麼樣的錯誤?也。停止使用'procedural assignments',這些是'always'塊中'assign'的語句。在您的測試平臺中,您需要修改模塊的輸入。你沒有,因此沒有什麼變化。 – Serge

+0

感謝您的評論:我得到:'錯誤:clk_pc無法分配給未解決的電線。「我應該用什麼來代替程序性任務? –

+0

在這種情況下,您應該使用正常的非阻塞賦值。即'clk1_out <= 1;' – Serge

回答

1

(對不起,我的名聲太低評論)

與其他人一樣說,總是塊不使用程序分配。順序元素只能有非阻塞賦值(< =)和僅阻塞賦值(=)的組合元素。不要在代碼塊中混合它們。另外,由於始終在塊靈敏度列表中有多個信號,因此您的設計將不合成

如果您想同步您的時鐘信號,只需使用其中一個並同步其他人即可。如果使用4位旋轉移位寄存器並將時鐘輸出分配給移位寄存器中的相應位,則這很簡單。

移位寄存器:所有時鐘輸出

module clock_divisor(input clk0, 
       input rst_i, 
       output clk0_out, 
       output clk1_out, 
       output clk2_out, 
       output clk3_out); 

reg [3:0] shift_reg; 

always @ (posedge clk0 or negedge rst_i) begin 
    if(rst_i) begin 
     shift_reg <= 4'd1; 
    end 
    else begin 
     shift_reg <= {shift_reg[2:0], shift_reg[3]}; 
    end 
end 

assign clk0_out = shift_reg[0]; 
assign clk1_out = shift_reg[1]; 
assign clk2_out = shift_reg[2]; 
assign clk3_out = shift_reg[3]; 

endmodule 

enter image description here

頻率是一樣的CLK0!他們只有180°相移。

但如果你真的想使一個時鐘分頻器,只需使用一個簡單的計數器:

module clock_divisor(input clk0, 
       input rst_i, 
       output clk0_out, 
       output clk1_out, 
       output clk2_out, 
       output clk3_out); 

reg [3:0] counter; 

always @ (posedge clk0 or negedge rst_i) begin 
    if(rst_i) begin 
     counter <= 4'd0; 
    end 
    else begin 
     counter <= counter + 1'd1; 
    end 
end 

assign clk0_out = counter[0]; 
assign clk1_out = counter[1]; 
assign clk2_out = counter[2]; 
assign clk3_out = counter[3]; 

endmodule 

enter image description here

現在,CLK_OUT的頻率的有:

  • clk0_out = 2 * clk0
  • clk1_out = 4 * clk0
  • clk2_out = 8 * clk0
  • clk3_out = 16 * CLK0

希望這可以幫助你!

P.S.不要忘記爲寄存器添加復位信號!這是至關重要的,所以你的設計可以從一個已知的狀態開始。