我正在尝试为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)。
答案 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