2016-08-03 156 views
0

我正在實現一個16位數的重複位移位器。要做到這一點,我有一個計數器,可以計算當我達到4'b1111時轉移和重置的次數。然後我有一個分配語句將MSB提供給輸出。但是,邏輯使得輸出每次跳過第一個MSB。 在發生任何移位之前,包含第一個MSB的最簡潔的方法是什麼?如何從零計數器verilog開始

CODE

module DAC_Control(
    input [15:0]data_in, 
    input clk, 
    input rst, 
    output data_out, 
    output reg cs, 
    output reg enable 
); 

//bit counter 
    reg [3:0] bit_counter; 

//to help with shifting 
    reg [15:0] shifter; 

    always @(data_in) 
    shifter <= data_in; 

//shifter 
    always @(posedge (clk)) begin 
    if (rst) begin 
     bit_counter <= 4'b0; 
     enable <= 1'b0; 
     cs <= 1'b1; 
     end 
    else if (bit_counter == 4'b1111) begin 
     bit_counter <= 4'b0; 
     enable <= 1'b1; 
     cs <= 1'b1; 
    end 
    else begin //this is the problem area 
     bit_counter <= bit_counter + 1'b1; 
     enable <= 1'b0; 
     cs <= 1'b0; 
     shifter <= shifter << 1; 

    end 
    end 

    assign data_out = shifter[15]; 

endmodule 

回答

2

首先這將是最好有一個觸發捕獲DATA_IN。如果不是那麼在模擬,如果data_in之間的變化在移動它將更新移位器,並導致預期的輸出改變。根據資格事件捕獲data_in將是更可取的(例如,下面例子中的counter_enable)。 綜合將產生一個錯誤,因爲shifter有兩個驅動程序。一個連續分配shifter <= data_in;和其他移位邏輯shifter <= shifter << 1;

更新後的示例代碼應該序列化數據。

module DAC_Control(
    input [15:0]data_in, 
    input counter_enable, 
    input clk, 
    input rst, 
    output data_out, 
    output reg cs, 
    output reg enable 
); 

//bit counter 
    reg [3:0] bit_counter; 

//to help with shifting 
    reg [15:0] shifter; 

//shifter 
    always @(posedge (clk)) begin 
    if (rst) begin 
     bit_counter <= 4'b0; 
     shifter <= 0; 
     end 
    else if (counter_enable == 1) begin 
     shifter <= data_in; 
     bit_counter <= 4'b0; 
    end 
    else begin 
     shifter <= shifter << 1; // shifting 
     bit_counter <= bit_counter + 1'b1; // counter 
    end 
    end 

    always @(posedge (clk)) begin 
    if (rst) begin 
     enable <= 1'b0; 
     cs <= 1'b1; 
     end 
    else if (bit_counter == 4'b1111) begin 
     enable <= 1'b1; 
     cs <= 1'b1; 
    end 
    else begin 
     enable <= 1'b0; // generate enable signals 
     cs <= 1'b0; 
    end 
    end 

    assign data_out = shifter[15]; 

endmodule 
+0

謝謝!我沒有說明data_in僅在發送使能脈衝時纔會改變,所以這不是問題。但是你的代碼應該解決從第二個MSB開始而不是第一個問題。但是,你說你的代碼給綜合提供了一個錯誤?人們如何解決這個問題? – qasddd

+1

原代碼有合成錯誤,在上面的例子中,作爲移位器被分配在一個位置的東西應該是好的。 –

+1

這意味着該啓用然後可以用於內部鎖存數據 –