如何从零计数器verilog开始

How to start with zero counter verilog

我正在为一个 16 位数实现一个重复移位器。为此,我有一个位计数器来计算我移动了多少次,并在到达 4'b1111 时重置。然后我有一个将 MSB 提供给输出的分配语句。但是,逻辑使得输出每次都跳过第一个 MSB。 在发生任何移位之前包含第一个 MSB 的最简洁方法是什么?

代码

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。如果不是,则 在模拟 中,如果 data_in 在移位之间发生变化,它将更新移位器并导致预期输出发生变化。最好根据符合条件的事件捕获 data_in(例如下面示例中的 counter_enable)。 Synthesis 将产生错误,因为 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