打印
[Actel FPGA]

Libero中有除法器模块么?

[复制链接]
2601|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huzixian|  楼主 | 2010-5-18 21:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
huzixian|  楼主 | 2010-5-18 21:38 | 只看该作者
或者那位高手写过除法器的程序啊。能不能发一个给我啊?就是最简单的那种除法器,也没有浮点运算,也没有精度要求。

使用特权

评论回复
板凳
6019赵文| | 2010-5-18 21:40 | 只看该作者
没有除法器模块

使用特权

评论回复
地板
LPC300| | 2010-5-18 21:57 | 只看该作者
我有,给你贴出来吧。

// divider.v
module divider12(clock,reset,word1,word2,Start,quotient,remainder,Ready,Error);

parameter L_divn = 12;
parameter L_divr = 6;
parameter S_idle = 0,S_Adivr = 1,S_Adivn = 2,S_div = 3,S_Err = 4;
parameter L_state = 3,L_cnt = 5,Max_cnt = L_divn-L_divr;
parameter s1 = 1;
input[L_divn-1:0] word1;
input[L_divr-1:0] word2;
input clock,reset,Start;
output[L_divn-1:0] quotient;
output[L_divn-1:0] remainder;
output Ready,Error;

reg output_state,next_output_state;
reg[L_state-1:0] state,next_state;
reg Load_words,Subtract,Shift_dividend,Shift_divisor;
reg[L_divn-1:0] quotient,quotient_reg,remainder_reg;
reg[L_divn:0] dividend;
reg[L_divr-1:0] divisor;
reg[L_cnt-1:0] num_shift_dividend,num_shift_divisor;
reg[L_divr:0] comparison;
wire MSB_divr = divisor[L_divr-1];
wire Ready = ((state==S_idle)&&!reset);
wire Error = (state==S_Err);
wire Max = (num_shift_dividend==Max_cnt+num_shift_divisor);
wire sign_bit = comparison[L_divr];

always@(state or dividend or divisor or MSB_divr)
begin
      case(state)
           S_Adivr:if(MSB_divr == 0)
                     comparison = dividend[L_divn:L_divn-L_divr]+{1'b1,~(divisor<<1)}+1'b1;
                     else
                     comparison = dividend[L_divn:L_divn-L_divr]+{1'b1,~(divisor[L_divr-1:0])}+1'b1;
            default: comparison = dividend[L_divn:L_divn-L_divr]+{1'b1,~(divisor[L_divr-1:0])}+1'b1;
      endcase
end

assign remainder_reg = (dividend[L_divn-1:L_divn-L_divr])-num_shift_divisor;

always@(posedge clock)
begin
        if(reset)begin        
              state <= S_idle;
              output_state <= s1;
        end
        else begin
              state <= next_state;
              output_state <= next_output_state;
        end
end

always@(state or word1 or word2 or comparison or sign_bit or Max)
begin
          Load_words = 0;
          Shift_dividend = 0;
          Shift_divisor = 0;
          Subtract = 0;
        case(state)
             S_idle:case(Start)
                    0:next_state = S_idle;
                    1:if(word2 == 0)
                         next_state = S_Err;
                       else if(word1)
                       begin
                         next_state = S_Adivr;
                         Load_words = 1;
                       end
                       else
                         next_state = S_idle;
                      endcase
             S_Adivr:case(MSB_divr)
                     0:if(sign_bit == 0)
                     begin
                        next_state = S_Adivr;
                        Shift_divisor = 1;
                     end
                        else if(sign_bit == 1)
                     begin
                        next_state = S_Adivn;
                     
                     end
                     1:next_state = S_div;
                     endcase
             S_Adivn:case({Max,sign_bit})
                     2'b00:next_state = S_div;
                     2'b01:
                     begin
                           next_state = S_Adivn;
                           Shift_dividend = 1;
                     end
                     2'b10:
                     begin
                           next_state = S_idle;
                           Subtract = 1;
                     end
                     2'b11:
                            next_state = S_idle;
                   endcase
            
              S_div:case({Max,sign_bit})
                     2'b00:begin
                     next_state = S_div;
                     Subtract = 1;
                     end
                     2'b01:
                     next_state = S_Adivn;
                     2'b10:begin
   
                           next_state = S_div;
                           Subtract = 1;
                     end
                     2'b11:begin
                            next_state = S_div;
                            Shift_dividend = 1;
                     end
                     endcase
               default:next_state = S_Err;
               endcase
end


always@(posedge clock)
begin
          if(reset)
        begin
          divisor <=0;
          dividend <=0;
          quotient_reg <=0;
          num_shift_dividend <=0;
          num_shift_divisor <=0;
        end
        else if(Load_words == 1)begin
          dividend <= word1;
          divisor <= word2;
          quotient_reg <=0;
          num_shift_dividend <= 0;
          num_shift_divisor <= 0;
        end
          else if(Shift_divisor)
        begin
          divisor <= divisor<<1;
          num_shift_divisor <= num_shift_divisor+1;
        end
           else if(Shift_dividend)
        begin
           dividend <= dividend<<1;
           quotient_reg <= quotient<<1;
           num_shift_dividend <= num_shift_dividend+1;
        end
           else if(Subtract)
        begin
            dividend[L_divn:L_divn-L_divr] <=comparison;
            quotient_reg[0] <= 1;
        end
end
always@(Ready or output_state)begin
        case(output_state)
        s1:case(Ready)
           0:next_output_state = s1;
           1:begin
           quotient = quotient_reg;
           remainder = remainder_reg;
           end
           endcase
        default:next_output_state = s1;
        endcase
end   
endmodule

使用特权

评论回复
5
LPC300| | 2010-5-18 22:14 | 只看该作者
被除数12位 除数6位,20位的话自己修改下前面的参数就行,不过位数越高速度越慢

使用特权

评论回复
6
huzixian|  楼主 | 2010-5-19 22:57 | 只看该作者
这程序运行不了,检查出有

3 ERROR(S), 0 WARNING(S).
ERROR:  The command 'check_hdl' failed.
ERROR:  Failure when executing Tcl script. [ Line 1 ]
ERROR:  The Execute Script command failed.

楼上的高手你能运行的了么?这程序我看得太复杂了,不知道你能帮小弟改一改不?

使用特权

评论回复
7
LPC300| | 2010-5-19 23:05 | 只看该作者
不好意思贴错了,把上面程序的remainder_reg定义成wire型,把remainder定义成reg型就没错了,这程序也是我上网找的,仿真了下可以用,就没想着改

使用特权

评论回复
8
huzixian|  楼主 | 2010-5-19 23:19 | 只看该作者
能有啦!谢谢啊

不过有些管脚的控制信号没弄清楚。start管脚是用来控制什么的?是那种电平控制或者是哪种边沿控制

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

262

主题

1534

帖子

2

粉丝