0

我已经在 quartus II 中做 verilog HDL 2 个月了,还没有合成我的任何代码。我正在努力编写分数除法电路。当然也有很多问题...

我想知道如何连接两个寄存器以形成一个更大的寄存器,我可以向右移位,在时钟脉冲的每个正边沿都会发生数据移位......新创建的寄存器中的数据有3 个零 (MSB) 后跟来自另一个称为除法器的寄存器的 4 个数据位。
例如B=[0 0 0]:[1 0 1 0]

我试过以下

module FRACDIV (divider,clk,B,START,CLR);

input       [3:0]  divider;
input           START, CLR, clk;
output      [6:0] B;

    reg [6:0]       B;


always @ (posedge clk)
    begin
        B = {3'd0, divider};
            if (START == 1'b1)
        begin
        B=B+B<<1;
        end
    end

endmodule

任何帮助将不胜感激,因为我已经尝试了 5 个小时来解决这个问题......


摩根先生,

感谢您的小费。非阻塞语句确实有帮助。然而,代码可能不会移动,因为 B 总是在每个时钟脉冲处重新初始化,因为它在 if 语句之外。

有了新的一天和新的头脑,并且由于您使用非阻塞语句的建议,我尝试了这个......

module FRACDIV(divider,clk,B,START,CLR);
input       [3:0] divider;
input           START, CLR, clk;
output      [6:0] B;

    reg [6:0] B;

    always @ (posedge clk) 
    begin
      if (START) begin
        B <= {3'b0, divider};
      end
      else begin
         B <= B <<1;
      end
    end
endmodule

当 START 为 HIGH 时,if 语句将数据加载到 B 中。当 START 为低电平时,数据在时钟的每个上升沿移动。无论如何要使 B 中的数据在没有 if 语句的情况下使用连接数据加载后立即开始移动?

只是好奇,我仍然觉得这段代码不是最有效的。

4

1 回答 1

0

当暗示触发器时,建议使用<=非阻塞分配。

声明输出时,您还应该能够将其作为 reg 进行 delcare,除非您使用严格的 verilog-95 语法。

module FRACDIV (
  input       [3:0] divider,
  input             START, CLR, clk,
  output reg  [6:0] B
);

always @ (posedge clk) begin 
  B <= {3'd0, divider};
  if (START == 1'b1) begin 
    B<=B+B<<1;  //This will overide the previous statement when using `<=`
  end 
end
endmodule

这将以与您的合成代码在 FPGA 上执行的方式相同的方式进行模拟。

于 2013-09-11T10:57:47.503 回答