如何仅使用时钟在 Verilog 中设计串行到并行缓冲区?
How do I design Serial to Parallel Buffer in Verilog only using clocks?
我希望在 Verilog 中设计串并转换器,将快速时钟串行输入转换为较慢时钟并行输入。我尝试了以下在 RTL 中工作但未在 Cadence Conformal 上验证的代码。 nclk 比 clk 快 16 倍。串行数据以 nclk 速率输入,并行数据以 clk 速率输出。
sEEG - 串行输入
eegOut - 并行输出
由于流片焊盘限制,我只能将clk和nclk作为我的操作参考。
以下是我想出的代码,它在功能模拟中运行良好,但形式验证失败。
module deserializer(sEEG, nclk, clk, eegOut);
input sEEG;
input nclk,clk;
reg [15:0] temp;
output reg [15:0] eegOut;
reg [4:0] i;
always @(negedge nclk) begin
temp[i] = sEEG;
i = i + 1;
end
always@(posedge clk) begin
i<=0;
eegOut <= temp;
end
endmodule
我觉得您应该使用四位来索引 16 个元素。如果您对模块进行参数化,则可以通过以下方式完成:
# (parameter WIDTH = 16)
然后将其用作:
localparam BIT_SEL = $clog2(WIDTH); //..this should give you "4" if WIDTH = 16
reg [BIT_SEL-1:0] i;
此外,您可能想要包括一个时钟同步器,您不想要亚稳态问题,一个简单的方法是包括“双触发器”,实际上是缓冲数据并将其复制到下一个慢时钟周期(增加 1 个慢时钟周期延迟)。所以,也许这行得通:
module deserializer
# (parameter WIDTH = 16)
(sEEG, nclk, clk, eegOut);
input sEEG;
input nclk,clk;
reg [WIDTH-1:0] temp;
reg [WIDTH-1:0] temp_reg; //..synchronizer
output reg [WIDTH-1:0] eegOut;
always @(negedge nclk) begin
temp[WIDTH-2:0] <= temp[WIDTH-1:1];
temp[WIDTH-1] <= sEEG;
end
always@(posedge clk) begin
temp_reg <= temp;
eegOut <= temp_reg;
end
endmodule
我希望在 Verilog 中设计串并转换器,将快速时钟串行输入转换为较慢时钟并行输入。我尝试了以下在 RTL 中工作但未在 Cadence Conformal 上验证的代码。 nclk 比 clk 快 16 倍。串行数据以 nclk 速率输入,并行数据以 clk 速率输出。
sEEG - 串行输入 eegOut - 并行输出
由于流片焊盘限制,我只能将clk和nclk作为我的操作参考。
以下是我想出的代码,它在功能模拟中运行良好,但形式验证失败。
module deserializer(sEEG, nclk, clk, eegOut);
input sEEG;
input nclk,clk;
reg [15:0] temp;
output reg [15:0] eegOut;
reg [4:0] i;
always @(negedge nclk) begin
temp[i] = sEEG;
i = i + 1;
end
always@(posedge clk) begin
i<=0;
eegOut <= temp;
end
endmodule
我觉得您应该使用四位来索引 16 个元素。如果您对模块进行参数化,则可以通过以下方式完成:
# (parameter WIDTH = 16)
然后将其用作:
localparam BIT_SEL = $clog2(WIDTH); //..this should give you "4" if WIDTH = 16
reg [BIT_SEL-1:0] i;
此外,您可能想要包括一个时钟同步器,您不想要亚稳态问题,一个简单的方法是包括“双触发器”,实际上是缓冲数据并将其复制到下一个慢时钟周期(增加 1 个慢时钟周期延迟)。所以,也许这行得通:
module deserializer
# (parameter WIDTH = 16)
(sEEG, nclk, clk, eegOut);
input sEEG;
input nclk,clk;
reg [WIDTH-1:0] temp;
reg [WIDTH-1:0] temp_reg; //..synchronizer
output reg [WIDTH-1:0] eegOut;
always @(negedge nclk) begin
temp[WIDTH-2:0] <= temp[WIDTH-1:1];
temp[WIDTH-1] <= sEEG;
end
always@(posedge clk) begin
temp_reg <= temp;
eegOut <= temp_reg;
end
endmodule