如何从零计数器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
我正在为一个 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