2016-08-03 17 views
0

私は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 

答えて

2

まずDATA_INをキャプチャするためにトリガを持っている方が良いでしょう。そうでなければシミュレーションで、シフトの間にdata_inが変化すると、シフターが更新され、予想される出力が変化します。適格イベント(例えば、以下の例ではcounter_enable)に基づいてdata_inをキャプチャすることが好ましい。 は、shifterに2つのドライバがあるため、エラーが発生します。 1つの連続的な割り当て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ではなく2番目のMSBから始まる問題を修正する必要があります。しかし、あなたのコードが合成のエラーを出すとしますか?どのようにその周りに得ることができますか? – qasddd

+1

シフターが1つの場所に割り当てられているので、上記のサンプルでは元のコードに合成エラーがあります。 –

+1

これは、イネーブルを使用してデータをラッチするために内部で使用できることを意味します。 –

関連する問題