我已经在 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 语句的情况下使用连接数据加载后立即开始移动?
只是好奇,我仍然觉得这段代码不是最有效的。