hyp7617 发表于 2011-4-16 19:24:55

请问有高手可以帮帮忙做基于FPGA的中值滤波C程序仿真

本帖最后由 hyp7617 于 2011-4-16 19:48 编辑

拜托了,各位高手

基本步骤我知道

三是在后面时钟、什么引脚设置的时候就不知所措了

谢谢各位高手了

我做毕业设计,需要仿真截图

QQ 992501270

是VerilogHDL语言的程序,已通过。module median(clk,reset,load,din,mult,dout,over,a3,b3,c3,a2,b2,c2,a1,b1,c1);

inputclk;
inputreset;
inputload;       //load是控制信号,load为高,接收cpu提供的数据
inputdin;
inputmult;//信号放大的倍数
output dout;
output over;      //当处理完一个点时产生一个时钟周期宽度的信号。
reg   over;
output a1,a2,a3,b1,b2,b3,c1,c2,c3;
reg   state;
reg   cur_state;

reg    img_x;
reg    img_y;
reg    pix;
reg    piy;
reg    we0,we1,we2;
reg    run_edge;
reg    addr;
reg    wrdata;
wire   rddata0,rddata1,rddata2;


reg    a_max,a_mid,a_min,b_max,b_mid,b_min,c_max,c_mid,c_min;
reg    max,mid,min,mid_mid,mid_max,mid_min;
reg    q_max,q_mid,q_min;
reg    d0,d1,d2,d3;
reg    sum0,sum1,sum2,sum3;
reg    sum;
reg    temp0;
reg    temp;
reg    a1,a2,a3,b1,b2,b3,c1,c2,c3;
reg    en;

parameter s0 = 4'd0,
          s1 = 4'd1,
          s2 = 4'd2,
          s3 = 4'd3,
                  s4 = 4'd4,
                  s5 = 4'd5,
                  s6 = 4'd6 ,
                  s7 = 4'd7,
                  s8 = 4'd8,
                  s9 = 4'd9,
                  s10 = 4'd10,
                  s11 = 4'd11,
                  s12 = 4'd12,
                  s13 = 4'd13,
                  s14 = 4'd14,
                  s15 = 4'd15;

assigndout = temp;

always @(posedge clk or negedge reset)
begin
    if (reset == 0)
    begin
      en <= 1;
      over <= 1'b0;
      img_x <= 11'd0;
      img_y <= 2'd0;
      we0 <= 1'b0;
      we1 <= 1'b0;
      we2 <= 1'b0;
      pix <= 11'd0;
      piy <= 2'd0;
      run_edge <= 1'b0;
      state <= s0;
      cur_state <= s0;
    end
    else
    begin
      if (load & en)
      begin
            case (state)
            s0:begin
                   if(img_x < 11'd1728)
                   begin
                     addr <= img_x;
                     state <= s0;
                     wrdata <= din;
                     img_x <= img_x + 11'd1;
                     if (img_y == 0)
                           we0 = 1;
                     elseif(img_y == 1)
                           we1 = 1'b1;
                     else
                           we2 = 1'b1;   
                   end
                   else
                   begin
                     state <=s1;
                     img_x <= 11'd0;
                     we0 <= 1'b0;
                     we1 <= 1'b0;
                     we2 <= 1'b0;
                   end
               end
            s1:begin
                   addr <= pix;
                   pix <= pix + 11'd1;
                   en <= 0;
                   run_edge <= 1'b1;
                   if (piy == 2'd0)
                     begin
                     cur_state <= s0;
                     a3 <= rddata0;
                     b3 <= rddata1;
                     c3 <= rddata2;
                     end
                   else if (piy == 2'd1)
                     begin
                     cur_state <= s1;
                     a3 <= rddata2;
                     b3 <= rddata0;
                     c3 <= rddata1;
                     end
                   else
                     begin
                     cur_state <= s2;
                     a3 <= rddata1;
                     b3 <= rddata2;
                     c3 <= rddata0;
                     end
               end   
            endcase
      end
      else if (run_edge & !load)
      begin
            case (cur_state)
            s0:begin
                   piy = 2'd0;
                   a1 <= a2;
                   b1 <= b2;
                   c1 <= c2;
                   a2 <= a3;
                   b2 <= b3;
                   c2 <= c3;
                   a3 <= rddata0;
                   b3 <= rddata1;
                   c3 <= rddata2;
                   cur_state <= s3;
               end
            s1:begin
                   piy = 2'd1;
                   a1 <= a2;
                   b1 <= b2;
                   c1 <= c2;
                   a2 <= a3;
                   b2 <= b3;
                   c2 <= c3;
                   a3 <= rddata2;
                   b3 <= rddata0;
                   c3 <= rddata1;
                   cur_state <= s3;
               end
            s2:begin
                   piy <= 2'd2;
                   a1 <= a2;
                   b1 <= b2;
                   c1 <= c2;
                   a2 <= a3;
                   b2 <= b3;
                   c2 <= c3;
                   a3 <= rddata1;
                   b3 <= rddata2;
                   c3 <= rddata0;
                   cur_state<= s3;
                end
            s3:begin
                   d0 <= (b2 > a2 ) ? (b2 - a2): (a2 - b2);
                   d1 <= (b2 > b1 ) ? (b2 - b1): (b1 - b2);
                   d2 <= (b2 > b3 ) ? (b2 - b3): (b3 - b2);
                   d3 <= (b2 > c2 ) ? (b2 - c2): (c2 - b2);
                   cur_state <= s4;
                end
            s4:begin
                   sum0 <= (d0 > 4) ?1'b0 : 1'b1;
                   sum1 <= (d1 > 4) ?1'b0 : 1'b1;
                   sum2 <= (d2 > 4) ?1'b0 : 1'b1;
                   sum3 <= (d3 > 4) ?1'b0 : 1'b1;
                   cur_state <= s5;
               end
            s5:begin
                   sum <= (sum0 + sum1) + (sum2 + sum3);
                   cur_state <= s6;
               end
            s6:begin
                   if ( (sum > 3'd1) && (sum < 3'd4) )
                   begin
                     //edge_out = 0;//low edge ,and not to disposal
                     cur_state <= s13;
                     q_mid <= b2;
                   end
                   else
                      //edge_out = 1;   //highneed to median
                      cur_state <= s7;
               end
            s7:begin
                   if (a1>a2)
                   begin
                     a_max<=a1;
                     a_min<=a2;
                   end
                   else
                   begin
                     a_max<=a2;
                     a_min<=a1;
                   end      
                   if (b1 > b2)   
                   begin
                     b_max<=b1;
                     b_min<=b2;
                   end
                   else
                   begin
                     b_max<=b2;
                     b_min<=b1;
                   end   
                   if(c1>c2)   
                   begin
                     c_max<=c1;
                     c_min<=c2;
                   end
                   else
                   begin
                     c_max<=c2;
                     c_min<=c1;
                   end   
                   cur_state<=s8;
               end
            s8:begin
                   if (a3>a_max)
                   begin         
                     a_max<=a3;
                     a_mid<=a_max;
                     a_min<=a_min;
                   end
                   else
                   begin
                     if (a3>a_min)      
                     begin
                           a_max<=a_max;
                           a_mid<=a3;
                           a_min<=a_min;
                     end
                     else
                     begin
                           a_max<=a_max;
                           a_mid<=a_min;
                           a_min<=a3;
                     end
                   end
                   if (b3>b_max)
                   begin         
                     b_max<=b3;
                     b_mid<=b_max;
                     b_min<=b_min;
                   end
                   else
                   begin
                     if(b3>b_min)      
                     begin
                           b_max<=b_max;
                           b_mid<=b3;
                           b_min<=b_min;
                     end
                     else
                     begin
                           b_max<=b_max;
                           b_mid<=b_min;
                           b_min<=b3;
                     end
                  end
                   if(c3>c_max)
                   begin         
                     c_max<=c3;
                     c_mid<=c_max;
                     c_min<=c_min;
                   end
                   else
                   begin
                     if(c3>c_min)      
                     begin
                           c_max<=c_max;
                           c_mid<=c3;
                           c_min<=c_min;
                     end
                     else
                     begin
                           c_max<=c_max;
                           c_mid<=c_min;
                           c_min<=c3;
                     end
                  end   
                   cur_state<=s9;
               end                  
            s9:begin
                   if (a_max>b_max)
                     max<=b_max;
                   else
                     max<=a_max;
                   if (a_mid>b_mid)
                   begin
                     mid_max<=a_mid;
                     mid_min<=b_mid;
                   end   
                   else
                   begin
                     mid_max<=b_mid;
                     mid_min<=a_mid;
                   end
                   if (a_min>b_min)   
                     min<=a_min;
                   else
                     min<=b_min;
                   cur_state<=s10;      
                end
            s10:begin
                  if (c_mid > mid_max)
                        mid<=mid_max;
                  else
                  begin
                  if (c_mid<mid_min)      
                        mid<=mid_min;
                  else
                        mid<=c_mid;
                  end
                  if (c_max>max)   
                        max<=max;
                  else
                        max<=c_max;
                  if (c_min>min)   
                        min<=c_min;
                  else
                        min<=min;
                  cur_state<=s11;   
                end            
            s11:begin
                  if (max>mid)
                  begin
                        q_max<=max;
                        q_min<=mid;
                  end
                  else
                  begin
                        q_max<=mid;
                        q_min<=max;
                  end
                  cur_state<=s12;   
                end   
            s12:begin
                  if (min>q_max)
                     q_mid<=q_max;
                  else
                  begin
                        if (min<q_min)
                            q_mid<=q_min;
                        else
                           q_mid<=min;   //q_mid is the mid which to replace the initial number
                  end
                  cur_state <= s13;
                end
            s13:begin
                  temp0 <= q_mid * mult;
                  cur_state <= s14;
                end
            s14:begin
                  over <= 1;
                  if (temp0 > 8'd255)
                        temp <= 8'd255;
                  else
                        temp <= temp0;
                  cur_state <= s15;
                end
            s15:begin
                  over <= 0;
                  if (pix == 11'd1728)
                  begin
                        run_edge <= 0;
                        state <= s0;
                        en <=1;
                        pix <= 0;
                        if (piy == 0)
                            piy = 2'd1;
                        else if (piy == 1)   
                            piy = 2'd2;
                        else
                            piy = 2'd0;   
                        
                        if (img_y == 0)
                            img_y = 1;
                        else if (img_y == 1)   
                            img_y = 2;
                        else
                            img_y =0;   
                  end
                  else
                  begin
                        pix <= pix + 2'd1;
                        if (piy == 2'd0)
                            cur_state <= s0;
                        else if (piy == 2'd1)
                            cur_state <= 2'd1;
                        else
                            cur_state <= 2'd2;
                        addr <= pix;
                  end
                end
            endcase
      end   
    end
end
ramr1(clk,we0,addr,wrdata,rddata0);
ramr2(clk,we1,addr,wrdata,rddata1);
ramr3(clk,we2,addr,wrdata,rddata2);
endmodule

module ram(clk,we,addr,wrdata,rddata);

output rddata;
input addr;
input wrdata;
input we, clk;
reg addr_reg;

reg mem ;
        always @ (posedge clk)
        begin
                if (we) mem <= wrdata;
                addr_reg <= addr;
        end
        assign rddata = mem;
       
endmodule

iFPGA 发表于 2011-4-17 02:28:17

虽然很简单,但是老哥我上班太忙,没有时间弄这些东西

hng1123 发表于 2011-4-17 10:26:54

自己做毕业设计,

hyp7617 发表于 2011-4-18 23:48:32

你们都酸了吧
这可是研究生的论文设计
我们老师把它作为我们的本科毕业设计
我只能服了他了

tjxgz 发表于 2011-5-25 15:24:56

哪位大哥嫩解释一下啊

wywhust 发表于 2011-5-25 22:38:54

用verilog不就可以仿真了吗,为什么要用c·······qq:774592087
页: [1]
查看完整版本: 请问有高手可以帮帮忙做基于FPGA的中值滤波C程序仿真