Booth的算法Verilog可合成

时间:2014-05-17 15:07:50

标签: algorithm verilog fpga synthesis

我正在尝试为Xilinx FPGA实现Booth的算法(有限状态机实现)。 基本上,在启动信号时,我将初始化我的辅助寄存器,然后我将进入状态0,在那里我将开始比较2位并进行移位。我将重复这一点,直到达到状态4.

assign Result = P[8:1];

always@(posedge clk or negedge start)
    if(start == 1)
    begin
            // initialize with start values
        state <= 3'd0;
    end

    else
    if(state == 3'd0 || state == 3'd1 || state == 3'd2 || state == 3'd3)
    begin
       // compare bits and shift data
    end
endmodule

测试模块

clk = 0;
a = 4'b0011;
b = 4'b0011;
b = ~b+1;
start = 1;
#10;
start = 0;
在#5时间单位后,

clk变为~clk。

我没有FPGA,所以我无法测试程序(我将在课堂上测试它。)

我正在用伊卡洛斯进行测试。问题是辅助寄存器在第一次产生时钟之前没有被初始化。

为了正确初始化辅助变量并保持代码可合成,我该怎么办?我尝试过使用for循环和初始开始,模拟工作正常,但它不适用于FPGA(因为我必须使用#delays)。

1 个答案:

答案 0 :(得分:2)

对于ASIC,最好使用低电平有效复位来设置初始值,但对于FPGA,通常只需在initial块中设置初始值。

initial begin
  state = 'd0 ;
end

always@(posedge clk) begin
  if(state == 3'd0 || state == 3'd1 || state == 3'd2 || state == 3'd3)begin
    // compare bits and shift data
    state <= 3'd4 ;
  end
endmodule

使用低电平有效复位。

always@(posedge clk or negedge rst_n) begin
  if (~rst_n) begin
    state <= 'd0 ;
  end 
  else begin
    if(state == 3'd0 || state == 3'd1 || state == 3'd2 || state == 3'd3)begin
      // compare bits and shift data
      state <= 3'd4 ;
    end
  end
endmodule