乘法,除法一样,在FPGA上的实现方式,无外乎3种:NIOSII上的软件实现,LEs实现,硬件实现。
至于除法通过LEs来实现,复杂的可以通过除法IP Core,而比较简单的除法大可以通过计数器实现。
比方说,计算:3600/60=?
是不是可以这样呢:
reg[11:0] cnt1,cnt2,result;
reg done_r;
always @(posedge clk or negedge rst_n)
if(!rst_n) begin cnt1 <= 12'd0; cnt2 <= 12'd0; result <= 12'd0; done_r <= 1'b0; end
else if(cnt1 < 12'd3600)
begin
cnt1 <= cnt1+1'b1;
if(cnt2 == 12'd59) begin cnt2 <= 12'd0; result <= result+1'b1; end
else cnt2 <= cnt2+1'b1;
end
else done_r <= 1'b1;
下面是我设计电子时钟的一段代码,在时间进位控制时关于除法有以下三种方法的对比:
方法一:完全用除法
方法二:部分用除法
方法三:完全不用除法
通过以上对比,可以很明显看出,一旦调用除法模块,势必会占用更大的面积,但是它可以大大减少设计代码的工作量,所以具体情况要综合考虑。
注:“在 quartus II 9.0 版本中 ,“除法器”可以自己定义。但是在 10.0 版本, 返些选项就消失了。尤其是说消失,还不如说更“默认化”了。默认下“除法器”和“求余器”是 32 位输出。但是经过“编译”过后,编译器会“自动优化”最适合的位宽。所以这也是为什么,在声明时是 32 位呢!除此之外,“除法器”和“求余器”.v 文件会“自劢添加”在原本 .v 文件的局次之下。”
|