私は16ビットの数値に対して繰り返しビットシフタを実装しています。これを行うには、4'b1111に達したときに何回シフトしてリセットしたのかを数えるビットカウンタがあります。次に、MSBを出力に供給するassign文があります。ただし、このロジックにより、毎回出力が最初の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
ありがとうございます!私はイネーブルパルスが送信されたときだけdata_inが変化することを明確にしていないので、それは問題ではありません。しかし、あなたのコードでは、最初のMSBではなく2番目のMSBから始まる問題を修正する必要があります。しかし、あなたのコードが合成のエラーを出すとしますか?どのようにその周りに得ることができますか? – qasddd
シフターが1つの場所に割り当てられているので、上記のサンプルでは元のコードに合成エラーがあります。 –
これは、イネーブルを使用してデータをラッチするために内部で使用できることを意味します。 –