我想在FPGA内部比较数据并输出最大值,仿真时有问题,忘大家能解答一下!

2019-03-25 08:12发布

先讲一下我的想法:我是想持续给FPGA送8位的数据,然后在某个IO口高电平时将之前最大的一个数据(所以我需要一直比较)送出。代码如下:
  1. module peak(
  2.                                                 clk,
  3.                                                 rst_n,
  4.                                                 dete_start,
  5.                                                 clk_2,
  6.                                                 data_in,
  7.                                                 data_out,
  8.                                                 tx_start
  9.                                                 );//数据读取和处理模块
  10. input clk;     //AD的时钟源,始终与系统的时钟相同
  11. input rst_n;   //复位信号
  12. input dete_start;   //频率改变的触发信号
  13. input [7:0]data_in; //ad输入数据
  14. output clk_2;    //系统时钟供ad使用
  15. output reg [7:0]data_out;  //发送给tx_mod的数据寄存器
  16. output reg tx_start;

  17. assign clk_2 = clk;    //系统时钟供ad使用


  18. //----------------------频率改变的触发信号-------------------//
  19. reg dete_start_r1,dete_start_r2;        //dete_start寄存器
  20. always @(posedge clk or negedge rst_n)
  21.         if(!rst_n)
  22.         begin
  23.                 dete_start_r1 <= 1'b0;
  24.                 dete_start_r2 <= 1'b0;
  25.         end
  26.         else
  27.         begin
  28.                 dete_start_r1 <= dete_start;
  29.                 dete_start_r2 <= dete_start_r1;
  30.         end

  31. wire data_rst = dete_start_r1 & ~dete_start_r2;//上升沿置高一个时钟周期

  32. //**********************串口发送所需时间计数模块***************//
  33. reg[12:0] cnt;                        
  34. always @ (posedge clk or negedge rst_n)
  35.         if(!rst_n) cnt <= 13'd0;
  36.         else
  37.                 if(data_rst)
  38.                 begin
  39.                         cnt <= 13'd0;
  40.                         tx_start <= 1'b1;
  41.                 end
  42.                 else
  43.                         if(cnt == 100)
  44.                                 tx_start <= 1'b0;
  45.                         else
  46.                                 cnt <= cnt+1'b1;                        

  47. //**********************读取AD采集的电压值***************//
  48. reg [7:0]data_cache;
  49. always @ (posedge clk or negedge rst_n)
  50.         if(!rst_n)
  51.         begin
  52.                 data_cache <= 8'd0;
  53.                 data_out <= 8'd0;
  54.         end
  55.         else
  56.                 if(data_rst)
  57.                 begin
  58.                         data_cache <= 8'd0;
  59.                         data_out <= data_cache;
  60.                 end
  61.                 else
  62.                         if(data_in >= data_cache)
  63.                                 data_cache <= data_in;               

  64. endmodule
复制代码我在用modelsim进行仿真时好像不对啊,输出端口总是X。vt文件如下:
  1. `timescale 1 ns/ 1 ps
  2. module peak_vlg_tst();
  3. // constants                                          
  4. reg clk;
  5. reg [7:0] data_in;
  6. reg dete_start;
  7. reg rst_n;
  8. // wires                                               
  9. wire clk_2;
  10. wire [7:0]  data_out;
  11. wire tx_start;

  12. // assign statements (if any)                          
  13. peak i1 (
  14. // port map - connection between master ports and signals/registers   
  15.         .clk(clk),
  16.         .clk_2(clk_2),
  17.         .data_in(data_in),
  18.         .data_out(data_out),
  19.         .dete_start(dete_start),
  20.         .rst_n(rst_n),
  21.         .tx_start(tx_start)
  22. );
  23. initial                                                
  24. begin   
  25.         clk = 0;
  26.         rst_n = 1;
  27.         dete_start = 0;
  28.         data_in = 0;
  29.         
  30.         #50;
  31.         data_in = 49;
  32.         #50;
  33.         data_in = 149;
  34.         #50;
  35.         data_in = 49;
  36.         #50;
  37.         data_in = 29;
  38.         #50;
  39.         data_in = 59;
  40.         #50;
  41.         data_in = 19;
  42.         #10;
  43.         dete_start = 1;
  44.         #30;
  45.         dete_start = 0;
  46. end  

  47. always
  48. begin
  49. #20 clk = ~clk;
  50. end
  51. endmodule
复制代码波形中输出端口始终是高阻态X,这是为什么呢?希望能给我解答一下!先谢了! 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。