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
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
der ursprüngliche Code hat Synthesefehler, im obigen Beispiel, wie der Shifter in einem einzigen Ort zugewiesen ist, sollten die Dinge gut sein. –
es bedeutet, die Freigabe kann dann intern verwendet werden, um Daten zu verriegeln –