我已经在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语句的连接数据后立即开始移位?
只是好奇,我仍然觉得这段代码不是最有效的。
答案 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上执行的相同方式。