移动连接寄存器

时间:2013-09-11 10:24:01

标签: verilog hdl

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

我想知道如何连接两个寄存器以形成一个更大的寄存器,我可以向右移位,在时钟脉冲的每个正边沿发生数据移位......新的数据创建的寄存器有3个零(MSB),后跟另一个名为divider的寄存器中的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语句的连接数据后立即开始移位?

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

1 个答案:

答案 0 :(得分:0)

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

在声明输出时,您还应该能够将它作为一个注册表,除非您使用严格的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上执行的相同方式。