4

我对 HDL 语言很陌生。我有一个关于如何编程移位寄存器的问题。(我知道我转向另一个方向)。书为什么用wire[N-1:0] r_next?我的实施有什么缺点?谢谢

我的第一次尝试如下

module lesson04#(parameter N=8)(
    input wire clk, reset,
    input wire data,
    output wire out
);

reg [N-1: 0] r_reg;


always @(posedge clk or negedge reset)
begin
    if(!reset)
         r_reg =0;
    else 
        r_reg[0]=data;
        r_reg = r_reg<<1;
end

assign out =r_reg[N-1];
endmodule 

但是这本书给出了:

module lesson04#(parameter N=8)(
    input wire clk, reset,
    input wire data,
    output wire out
);

reg [N-1: 0] r_reg;
wire[N-1:0] r_next;

always @(posedge clk or negedge reset)
begin
    if(!reset)
         r_reg =0;
    else 
        r_reg <= r_next;
end

assign r_next= {data, r_reg[N-1:1]};
assign out =r_reg[N-1];
endmodule
4

2 回答 2

6

首先,不要忘记您的begin-end围绕代码段:

else begin
     r_reg[0]=data;
     r_reg = r_reg<<1;
end

没有这个,只会r_reg[0]=data出现在语句的else子句中if。这将起作用,但由于顺序逻辑描述中的阻塞语句被认为是不好的风格......

其次,对于连续块建模,请使用非阻塞分配 ( <=),否则您的计算可能会“失败”(谷歌非阻塞与阻塞获取更多信息)。您的示例可能非常有效(您是否在模拟器中尝试过?)但是如果事情变得更复杂并且添加了更多变量,事情可能会中断。

always @(posedge clk or negedge reset)
begin
    if(!reset)
         r_reg <= 0;
    else begin // This is horrible! Don't write code like this!
        r_reg[0] = data;     // blocking
        r_reg <= r_reg<<1;   // non-blocking
    end
end

由于上述原因,有时建议将组合逻辑与顺序逻辑分开,以便您可以将非阻塞分配写入顺序块中的寄存器,并在组合块中进行阻塞,而不必担心调度。

要以这种方式编码,您需要使用当前状态计算下一个输出应该是什么,因此r_next答案中的总线。我认为,如果所有触发器都以这种方式与周围的组合逻辑分离,它往往也有助于综合工具。

此外,如果您的复位为低电平有效(即LOWresets ),则应将其命名为,例如resetbor reset_n

于 2010-08-19T13:17:39.533 回答
3

你的实现产生了与本书完全不同的输出。您应该通过构建一个简单的测试平台来驱动您的输入并运行模拟来向自己证明这一点。您将看到本书的输出将输入数据移动了一个时钟周期,而您的输出将输入数据移动了八个时钟周期。

顺便说一句,你已经缩进了你的always块,我被引导相信这不是你想要的。这就是您的块的实际行为方式:

always @(posedge clk or negedge reset)
begin
    if(!reset) begin
         r_reg =0;
    end else begin
        r_reg[0]=data;
    end
    r_reg = r_reg<<1;
end

我总是在语句中明确使用begin/end关键字if/else来避免这种混淆。

它模拟的方式r_reg始终为 0,因为您将第一个赋值 ( r_reg[0]=data;) 与第二个 ( r_reg = r_reg<<1;) 混淆了。另一个区别是书上分配data给移位寄存器的 MSB,但你把它分配给 LSB。

如果您使用的是不错的 linting 和综合工具,您可能会收到一堆代码警告。这会提醒您进行一些更改。

于 2010-08-19T13:19:57.657 回答