2016-08-03 23 views
0

Ich implementiere einen wiederholenden Bit-Shifter für eine 16-Bit-Nummer. Um dies zu tun, habe ich einen kleinen Zähler, der zählt, wie oft ich verschoben und zurückgesetzt habe, wenn ich 4'b1111 erreiche. Dann habe ich eine assign-Anweisung, die das MSB an eine Ausgabe füttert. Die Logik macht es jedoch so, dass die Ausgabe das erste MSB jedes Mal überspringt. Was ist der prägnanteste Weg, das erste MSB einzuschließen, bevor irgendeine Verschiebung stattgefunden hat?Wie mit Null-Zähler zu beginnen 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 

Antwort

2

Zum einen wäre es besser, einen Auslöser zu haben, die Daten_Ein zu erfassen. Wenn nicht, dann in der Simulation, wenn sich das data_in zwischen den Verschiebungen ändert, wird es den Shifter aktualisieren und bewirken, dass sich die erwartete Ausgabe ändert. Es wäre vorzuziehen, data_in basierend auf einem qualifizierenden Ereignis (z. B. counter_enable in dem folgenden Beispiel) zu erfassen. Synthese wird einen Fehler erzeugen, da shifter zwei Treiber hat. Eine der kontinuierlichen Zuordnung shifter <= data_in; und andere die Verschiebung Logik shifter <= shifter << 1;

Aktualisierte Beispielcode sollte die Daten serialisieren.

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

Vielen Dank! Ich habe nicht klargestellt, dass sich data_in nur ändert, wenn der Enable-Impuls gesendet wird, also ist das nicht das Problem. Aber Ihr Code sollte das Problem beheben, dass es am 2. MSB statt am 1. MSB beginnt. Sie sagen jedoch, Ihr Code gibt einen Fehler für die Synthese? Wie könnte man das umgehen? – qasddd

+1

der ursprüngliche Code hat Synthesefehler, im obigen Beispiel, wie der Shifter in einem einzigen Ort zugewiesen ist, sollten die Dinge gut sein. –

+1

es bedeutet, die Freigabe kann dann intern verwendet werden, um Daten zu verriegeln –