集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 2543|回复: 5

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

[复制链接]
hyp7617 发表于 2011-4-16 19:24:55 | 显示全部楼层 |阅读模式
本帖最后由 hyp7617 于 2011-4-16 19:48 编辑

拜托了,各位高手

基本步骤我知道

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

谢谢各位高手了

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

QQ 992501270

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

  2. input  clk;
  3. input  reset;
  4. input  load;       //load是控制信号,load为高,接收cpu提供的数据
  5. input  [7:0]din;
  6. input  [2:0]mult;  //信号放大的倍数
  7. output [7:0]dout;
  8. output over;      //当处理完一个点时产生一个时钟周期宽度的信号。
  9. reg   over;
  10. output [7:0]a1,a2,a3,b1,b2,b3,c1,c2,c3;
  11. reg   [3:0]state;
  12. reg   [3:0]cur_state;

  13. reg    [10:0]img_x;
  14. reg    [1:0]img_y;
  15. reg    [10:0]pix;
  16. reg    [10:0]piy;
  17. reg    we0,we1,we2;
  18. reg    run_edge;
  19. reg    [10:0]addr;
  20. reg    [7:0]wrdata;
  21. wire   [7:0]rddata0,rddata1,rddata2;


  22. reg    [7:0]a_max,a_mid,a_min,b_max,b_mid,b_min,c_max,c_mid,c_min;
  23. reg    [7:0]max,mid,min,mid_mid,mid_max,mid_min;
  24. reg    [7:0]q_max,q_mid,q_min;
  25. reg    [7:0]d0,d1,d2,d3;
  26. reg    sum0,sum1,sum2,sum3;
  27. reg    [2:0]sum;
  28. reg    [9:0]temp0;
  29. reg    [7:0]temp;
  30. reg    [7:0]a1,a2,a3,b1,b2,b3,c1,c2,c3;
  31. reg    en;

  32. parameter s0 = 4'd0,
  33.           s1 = 4'd1,
  34.           s2 = 4'd2,
  35.           s3 = 4'd3,
  36.                   s4 = 4'd4,
  37.                   s5 = 4'd5,
  38.                   s6 = 4'd6 ,
  39.                   s7 = 4'd7,
  40.                   s8 = 4'd8,
  41.                   s9 = 4'd9,
  42.                   s10 = 4'd10,
  43.                   s11 = 4'd11,
  44.                   s12 = 4'd12,
  45.                   s13 = 4'd13,
  46.                   s14 = 4'd14,
  47.                   s15 = 4'd15;

  48. assign  dout = temp;

  49. always @(posedge clk or negedge reset)
  50. begin
  51.     if (reset == 0)
  52.     begin
  53.         en <= 1;
  54.         over <= 1'b0;
  55.         img_x <= 11'd0;
  56.         img_y <= 2'd0;
  57.         we0 <= 1'b0;
  58.         we1 <= 1'b0;
  59.         we2 <= 1'b0;
  60.         pix <= 11'd0;
  61.         piy <= 2'd0;
  62.         run_edge <= 1'b0;
  63.         state <= s0;
  64.         cur_state <= s0;
  65.     end
  66.     else
  67.     begin
  68.         if (load & en)
  69.         begin
  70.             case (state)
  71.             s0:begin
  72.                    if(img_x < 11'd1728)  
  73.                    begin
  74.                        addr <= img_x;
  75.                        state <= s0;
  76.                        wrdata <= din;
  77.                        img_x <= img_x + 11'd1;
  78.                        if (img_y == 0)
  79.                            we0 = 1;
  80.                        else  if(img_y == 1)
  81.                            we1 = 1'b1;
  82.                        else
  83.                            we2 = 1'b1;   
  84.                    end
  85.                    else
  86.                    begin
  87.                        state <=s1;
  88.                        img_x <= 11'd0;
  89.                        we0 <= 1'b0;
  90.                        we1 <= 1'b0;
  91.                        we2 <= 1'b0;
  92.                    end
  93.                end
  94.             s1:begin
  95.                    addr <= pix;
  96.                    pix <= pix + 11'd1;
  97.                    en <= 0;
  98.                    run_edge <= 1'b1;
  99.                    if (piy == 2'd0)
  100.                      begin
  101.                        cur_state <= s0;
  102.                        a3 <= rddata0;
  103.                        b3 <= rddata1;
  104.                        c3 <= rddata2;
  105.                      end
  106.                    else if (piy == 2'd1)
  107.                      begin
  108.                        cur_state <= s1;
  109.                        a3 <= rddata2;
  110.                        b3 <= rddata0;
  111.                        c3 <= rddata1;
  112.                      end
  113.                    else
  114.                      begin
  115.                        cur_state <= s2;
  116.                        a3 <= rddata1;
  117.                        b3 <= rddata2;
  118.                        c3 <= rddata0;
  119.                      end
  120.                end   
  121.             endcase
  122.         end
  123.         else if (run_edge & !load)
  124.         begin
  125.             case (cur_state)
  126.             s0:begin
  127.                    piy = 2'd0;
  128.                    a1 <= a2;
  129.                    b1 <= b2;
  130.                    c1 <= c2;
  131.                    a2 <= a3;
  132.                    b2 <= b3;
  133.                    c2 <= c3;
  134.                    a3 <= rddata0;
  135.                    b3 <= rddata1;
  136.                    c3 <= rddata2;
  137.                    cur_state <= s3;
  138.                end
  139.             s1:begin
  140.                    piy = 2'd1;
  141.                    a1 <= a2;
  142.                    b1 <= b2;
  143.                    c1 <= c2;
  144.                    a2 <= a3;
  145.                    b2 <= b3;
  146.                    c2 <= c3;
  147.                    a3 <= rddata2;
  148.                    b3 <= rddata0;
  149.                    c3 <= rddata1;
  150.                    cur_state <= s3;
  151.                end
  152.             s2:begin
  153.                    piy <= 2'd2;
  154.                    a1 <= a2;
  155.                    b1 <= b2;
  156.                    c1 <= c2;
  157.                    a2 <= a3;
  158.                    b2 <= b3;
  159.                    c2 <= c3;
  160.                    a3 <= rddata1;
  161.                    b3 <= rddata2;
  162.                    c3 <= rddata0;
  163.                    cur_state<= s3;
  164.                 end
  165.             s3:begin
  166.                    d0 <= (b2 > a2 ) ? (b2 - a2)  : (a2 - b2);
  167.                    d1 <= (b2 > b1 ) ? (b2 - b1)  : (b1 - b2);
  168.                    d2 <= (b2 > b3 ) ? (b2 - b3)  : (b3 - b2);
  169.                    d3 <= (b2 > c2 ) ? (b2 - c2)  : (c2 - b2);
  170.                    cur_state <= s4;
  171.                 end
  172.             s4:begin
  173.                    sum0 <= (d0 > 4) ?  1'b0 : 1'b1;
  174.                    sum1 <= (d1 > 4) ?  1'b0 : 1'b1;
  175.                    sum2 <= (d2 > 4) ?  1'b0 : 1'b1;
  176.                    sum3 <= (d3 > 4) ?  1'b0 : 1'b1;
  177.                    cur_state <= s5;
  178.                end
  179.             s5:begin
  180.                    sum <= (sum0 + sum1) + (sum2 + sum3);
  181.                    cur_state <= s6;
  182.                end
  183.             s6:begin
  184.                    if ( (sum > 3'd1) && (sum < 3'd4) )
  185.                    begin
  186.                        //edge_out = 0;  //low edge ,and not to disposal
  187.                        cur_state <= s13;
  188.                        q_mid <= b2;
  189.                    end
  190.                    else
  191.                       //edge_out = 1;     //high  need to median
  192.                       cur_state <= s7;
  193.                end
  194.             s7:begin
  195.                    if (a1>a2)
  196.                    begin
  197.                        a_max<=a1;
  198.                        a_min<=a2;
  199.                    end
  200.                    else
  201.                    begin
  202.                        a_max<=a2;
  203.                        a_min<=a1;
  204.                    end      
  205.                    if (b1 > b2)   
  206.                    begin
  207.                        b_max<=b1;
  208.                        b_min<=b2;
  209.                    end
  210.                    else
  211.                    begin
  212.                        b_max<=b2;
  213.                        b_min<=b1;
  214.                    end   
  215.                    if(c1>c2)   
  216.                    begin
  217.                        c_max<=c1;
  218.                        c_min<=c2;
  219.                    end
  220.                    else
  221.                    begin
  222.                        c_max<=c2;
  223.                        c_min<=c1;
  224.                    end   
  225.                    cur_state<=s8;
  226.                end
  227.             s8:begin
  228.                    if (a3>a_max)
  229.                    begin         
  230.                        a_max<=a3;
  231.                        a_mid<=a_max;
  232.                        a_min<=a_min;
  233.                    end
  234.                    else
  235.                    begin
  236.                        if (a3>a_min)      
  237.                        begin
  238.                            a_max<=a_max;
  239.                            a_mid<=a3;
  240.                            a_min<=a_min;
  241.                        end
  242.                        else
  243.                        begin
  244.                            a_max<=a_max;
  245.                            a_mid<=a_min;
  246.                            a_min<=a3;
  247.                        end  
  248.                    end
  249.                    if (b3>b_max)
  250.                    begin         
  251.                        b_max<=b3;
  252.                        b_mid<=b_max;
  253.                        b_min<=b_min;
  254.                    end
  255.                    else
  256.                    begin
  257.                        if(b3>b_min)      
  258.                        begin
  259.                            b_max<=b_max;
  260.                            b_mid<=b3;
  261.                            b_min<=b_min;
  262.                        end
  263.                        else
  264.                        begin
  265.                            b_max<=b_max;
  266.                            b_mid<=b_min;
  267.                            b_min<=b3;
  268.                        end  
  269.                     end
  270.                    if(c3>c_max)
  271.                    begin         
  272.                        c_max<=c3;
  273.                        c_mid<=c_max;
  274.                        c_min<=c_min;
  275.                    end
  276.                    else
  277.                    begin
  278.                        if(c3>c_min)      
  279.                        begin
  280.                            c_max<=c_max;
  281.                            c_mid<=c3;
  282.                            c_min<=c_min;
  283.                        end
  284.                        else
  285.                        begin
  286.                            c_max<=c_max;
  287.                            c_mid<=c_min;
  288.                            c_min<=c3;
  289.                        end  
  290.                     end   
  291.                    cur_state<=s9;
  292.                end                    
  293.             s9:begin
  294.                    if (a_max>b_max)
  295.                        max<=b_max;
  296.                    else
  297.                        max<=a_max;
  298.                    if (a_mid>b_mid)
  299.                    begin
  300.                        mid_max<=a_mid;
  301.                        mid_min<=b_mid;
  302.                    end     
  303.                    else
  304.                    begin
  305.                        mid_max<=b_mid;
  306.                        mid_min<=a_mid;
  307.                    end
  308.                    if (a_min>b_min)   
  309.                        min<=a_min;
  310.                    else
  311.                        min<=b_min;
  312.                    cur_state<=s10;        
  313.                 end
  314.             s10:begin
  315.                     if (c_mid > mid_max)
  316.                         mid<=mid_max;
  317.                     else
  318.                     begin
  319.                     if (c_mid<mid_min)      
  320.                         mid<=mid_min;
  321.                     else
  322.                         mid<=c_mid;
  323.                     end
  324.                     if (c_max>max)   
  325.                         max<=max;
  326.                     else
  327.                         max<=c_max;
  328.                     if (c_min>min)   
  329.                         min<=c_min;
  330.                     else
  331.                         min<=min;  
  332.                     cur_state<=s11;   
  333.                 end            
  334.             s11:begin
  335.                     if (max>mid)
  336.                     begin
  337.                         q_max<=max;
  338.                         q_min<=mid;
  339.                     end
  340.                     else
  341.                     begin
  342.                         q_max<=mid;
  343.                         q_min<=max;
  344.                     end
  345.                     cur_state<=s12;   
  346.                 end     
  347.             s12:begin
  348.                     if (min>q_max)
  349.                        q_mid<=q_max;
  350.                     else
  351.                     begin
  352.                         if (min<q_min)  
  353.                             q_mid<=q_min;
  354.                         else
  355.                            q_mid<=min;   //q_mid is the mid which to replace the initial number
  356.                     end
  357.                     cur_state <= s13;
  358.                 end
  359.             s13:begin
  360.                     temp0 <= q_mid * mult;
  361.                     cur_state <= s14;
  362.                 end
  363.             s14:begin
  364.                     over <= 1;
  365.                     if (temp0 > 8'd255)
  366.                         temp <= 8'd255;
  367.                     else
  368.                         temp <= temp0[7:0];
  369.                     cur_state <= s15;
  370.                 end
  371.             s15:begin
  372.                     over <= 0;
  373.                     if (pix == 11'd1728)
  374.                     begin
  375.                         run_edge <= 0;
  376.                         state <= s0;
  377.                         en <=1;
  378.                         pix <= 0;  
  379.                         if (piy == 0)
  380.                             piy = 2'd1;
  381.                         else if (piy == 1)   
  382.                             piy = 2'd2;
  383.                         else
  384.                             piy = 2'd0;   
  385.                         
  386.                         if (img_y == 0)
  387.                             img_y = 1;
  388.                         else if (img_y == 1)   
  389.                             img_y = 2;
  390.                         else
  391.                             img_y =0;   
  392.                     end
  393.                     else
  394.                     begin
  395.                         pix <= pix + 2'd1;
  396.                         if (piy == 2'd0)
  397.                             cur_state <= s0;
  398.                         else if (piy == 2'd1)
  399.                             cur_state <= 2'd1;
  400.                         else
  401.                             cur_state <= 2'd2;
  402.                         addr <= pix;
  403.                     end
  404.                 end
  405.             endcase  
  406.         end     
  407.     end
  408. end
  409. ram  r1(clk,we0,addr,wrdata,rddata0);
  410. ram  r2(clk,we1,addr,wrdata,rddata1);
  411. ram  r3(clk,we2,addr,wrdata,rddata2);
  412. endmodule

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

  414. output  [7:0] rddata;
  415. input [10:0] addr;
  416. input [7:0] wrdata;
  417. input we, clk;
  418. reg [10:0] addr_reg;

  419. reg [7:0] mem [1727:0];
  420.         always @ (posedge clk)
  421.         begin
  422.                 if (we) mem[addr] <= wrdata;
  423.                 addr_reg <= addr;
  424.         end
  425.         assign rddata = mem[addr_reg];
  426.        
  427. 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 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-6-23 12:50 , Processed in 0.070629 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表