马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
请各位大侠帮忙分析解答。 我把之前的在spartan-3a上实现的代码,放到spartan-6上综合后发现,所占的LUT比在spartan-3a上用的还多。本来spartan-6是6输入查找表应该用的少才对,感觉两块片子的架构不一样。经过分析发现问题出现在一段代码上,mcu通过总线对fpga内部寄存器操作,就是通过地址区分不同的寄存器,对各种寄存器进行赋值。这个操作两种器件所利用的LUT的数目区别很大。 下面的程序是我做了个近似的例子,根据地址对两个寄存器赋值。结果资源利用情况spartan-3a只用了9个LUT,spartan-6却用了36个LUT。如下图所示。请大家帮忙分析下,代码上需要做些什么改进。 module test( output[15:0] do1, output[15:0] do2, output[15:0] addr_lock, input[15:0] di, input clk, input rst, input ale, inout[15:0] data, input wr, input rd ); reg rd1; reg wr1; reg[15:0] do_int; reg[15:0] di_reg; reg[15:0] do_reg1; reg[15:0] do_reg2; wire[15:0] addr; reg[15:0] data_out; assign addr = (ale) ? data :addr; assign data = (~rd )? data_out : 16'hzzzz; assign addr_lock = addr; always@(posedge clk or negedge rst) if(~rst) begin rd1<= 1'b1; wr1<= 1'b1; end else begin rd1<= rd; wr1<= wr; end always@(posedge clk or negedge rst) if(~rst) begin do_reg1 <= 'd0; do_reg2 <= 'd0; end else if(rd1&&~rd) case(addr) 16'd1: do_reg1 <= data; 16'd2: do_reg2 <= data; endcase assign do1 = do_reg1; assign do2 = do_reg2; endmodule
|