EPM570上实现的并行总线数据收发,遇到的奇怪问题,求助!

2019-07-15 23:27发布

开发环境:Quartus II 12 64bit,语言verilog hdl
主要功能:EPM570T144作为STM32的FSMC总线上的设备,为MCU提供接口扩展和一些简单的逻辑功能。
问题:
1. sensor模块中读取几个IO口数据的时候,若在判断中添加对地址的判断,则无**常读取数据。(传感器就是普通的光电对管,经过施密特)
    由于我是第一次写CPLD代码,有可能是某些基础知识不了解,低级问题导致,请大家帮忙查出来予以指教!
2. 奇怪的问题:如果我将led_beeper模块中的代码添加了一些逻辑功能,甚至仅仅删除一小部分代码,就会导致sensor模块中的数据读出为全0。
    具体添加的逻辑功能,在led_beeper -new.v中。
    具体删除的小部分代码,在下文led_beeper.v中有标识描述,删除这一段,重新下载以后STM32读取sensor模块的数据就是全0了。

硬件没问题,其他功能完全正常,设备总线读写正常(USB、LCD),通过CPLD控制的电机等设备也运行正常。传感器的信号用示波器看过没有任何问题。
我现在是给公司开发一个项目,用到CPLD临时学的,由于时间紧迫也就没能从头到尾系统地学习,希望大家能不吝赐教!!

下面贴代码(只贴了几个模块,其他的在附件中,包括CPLD其他全部代码、STM32对应的FSMC设置代码等):
CPLD 顶层模块:

  1. module amrp1250c
  2.     (
  3.         CLK48M,CPLD_INT,MCU_IO,
  4.         BUS_WR,BUS_RD,BUS_NE,BUS_A_L,BUS_A_H,BUS_D,
  5.         BUS_CS_CH375,BUS_CS_FLASH,BUS_CS_LCD,BUS_CS_RAM,
  6.         BEEP,LED,
  7.         SM1_MONI,SM1_EMO, SM2_MONI,SM2_EMO, SM3_MONI,SM3_EMO, SM4_MONI,SM4_EMO,
  8.         SM_ST, SM4_OE,SM4_FR,SM4_ATT, SM3_OE,SM3_FR,SM3_ATT, SM2_OE,SM2_FR,SM2_ATT, SM1_OE,SM1_FR,SM1_ATT,
  9.         DM2_EN,DM1_EN,DM1_IN,DM2_IN,
  10.         SEN_DOOR,SEN_PRESS,SEN_CARVE,SEN_TAPE_B,SEN_TAPE_F,SEN_CUT_R,SEN_CUT_L,SEN_RESERVE,
  11.         PH_PWR, PH_LATCH,PH_CLK, PH_DAT,PH_STR
  12.     );
  13.    
  14.     /*********************************************************************************************************/
  15.     //接口定义
  16.    
  17.     //晶振时钟
  18.     input CLK48M;
  19.    
  20.     //发送至MCU的中断信号
  21.     output CPLD_INT;
  22.     //与MCU连接的预留IO口
  23.     output[3:0] MCU_IO;
  24.    
  25.     //数据总线   
  26.         input BUS_WR,BUS_RD;
  27.         input[4:1] BUS_NE;
  28.         input[19:0] BUS_A_L;
  29.         input[25:22] BUS_A_H;
  30.         inout[15:0] BUS_D;
  31.     output BUS_CS_CH375,BUS_CS_FLASH,BUS_CS_LCD;
  32.     output[2:1] BUS_CS_RAM;
  33.    
  34.     //蜂鸣器
  35.     output BEEP;
  36.     //LED0--绿,LED1--红
  37.         output[1:0] LED;
  38.    
  39.     //步进电机   
  40.     input SM1_MONI,SM1_EMO, SM2_MONI,SM2_EMO, SM3_MONI,SM3_EMO, SM4_MONI,SM4_EMO;
  41.     output SM_ST, SM4_OE,SM4_FR,SM4_ATT, SM3_OE,SM3_FR,SM3_ATT, SM2_OE,SM2_FR,SM2_ATT, SM1_OE,SM1_FR,SM1_ATT;
  42.     //直流电机
  43.     output DM2_EN,DM1_EN;
  44.     output[2:1] DM1_IN,DM2_IN;

  45.     //传感器接口
  46.     input SEN_DOOR,SEN_PRESS,SEN_CARVE,SEN_TAPE_B,SEN_TAPE_F,SEN_CUT_R,SEN_CUT_L,SEN_RESERVE;
  47.    
  48.     //打印头接口
  49.     output PH_PWR, PH_LATCH,PH_CLK;
  50.     output[4:1] PH_DAT,PH_STR;
  51.    
  52.     /*********************************************************************************************************/
  53.     //双向总线数据口
  54.     reg[15:0] BUS_D_OUT_REG;
  55.     wire[15:0] BUS_D_OUT;
  56.         wire[15:0] BUS_D;
  57.         wire[15:0] BUS_D_IN;
  58.     assign BUS_D[15:0] = ((BUS_RD == 1'b0) && (BUS_CS_CPLD == 0))? BUS_D_OUT_REG : 16'bzzzz_zzzz_zzzz_zzzz;
  59.     assign BUS_D_IN = BUS_D;
  60.     always
  61.     begin
  62.         BUS_D_OUT_REG = BUS_D_OUT;
  63.     end
  64.     /*********************************************************************************************************/
  65.     //模拟上电复位
  66.     wire RST_n;
  67.     sim_rst mod_sim_rst(CLK48M,1'b1,RST_n);
  68.     /*********************************************************************************************************/
  69.     //时钟分频
  70.     wire clk_1k;
  71.     defparam Gen_ClkLed.divdWIDTH=15,Gen_ClkLed.divdFACTOR=24000;
  72.         gen_divd Gen_ClkLed(.reset(RST_n),.clkin(CLK48M),.clkout(clk_1k));
  73.     assign CPLD_INT = clk_1k;
  74.     /*********************************************************************************************************/
  75.    
  76.     wire BUS_CS_CPLD;

  77.     logic_cs mod_logic_cs(BUS_NE,BUS_A_H, BUS_CS_CH375,BUS_CS_LCD,BUS_CS_FLASH,BUS_CS_RAM,BUS_CS_CPLD);
  78.    
  79.     led_beeper mod_led_beeper(clk_1k,RST_n,BUS_CS_CPLD,BUS_WR,BUS_D_IN,BUS_A_L,LED,BEEP);
  80.    
  81.     /*********************************************************************************************************/
  82.     //传感器读取
  83.     sensor mod_sensor(clk_1k,BUS_CS_CPLD,BUS_RD,BUS_D_OUT[7:0],BUS_A_L, MCU_IO[0],
  84.                      SEN_DOOR,SEN_PRESS,SEN_CARVE,SEN_TAPE_B,SEN_TAPE_F,SEN_CUT_R,SEN_CUT_L,SEN_RESERVE);
  85.     //assign MCU_IO[0] = SEN_CUT_L;
  86.    
  87.     /*********************************************************************************************************/
  88.     dc_motor mod_dc_motor(clk_1k,RST_n,BUS_CS_CPLD,BUS_WR,BUS_D_IN,BUS_A_L,DM1_EN,DM1_IN,DM2_EN,DM2_IN);
  89.     /*********************************************************************************************************/
  90.     step_motor mod_step_motor
  91.     (
  92.         clk_1k,RST_n,
  93.         BUS_CS_CPLD,BUS_WR,BUS_D,BUS_A_L,
  94.         SM_ST, SM4_OE,SM4_FR,SM4_ATT, SM3_OE,SM3_FR,SM3_ATT, SM2_OE,SM2_FR,SM2_ATT, SM1_OE,SM1_FR,SM1_ATT
  95.     );
  96.    
  97.     /*********************************************************************************************************/
  98.     print_head mod_print_head
  99.     (
  100.         CLK48M,clk_1k,RST_n,
  101.         BUS_CS_CPLD,BUS_WR,BUS_D,BUS_A_L,
  102.         PH_PWR, PH_LATCH,PH_CLK, PH_DAT,PH_STR,
  103.         MCU_IO[1]
  104.     );
  105.    
  106. endmodule                               
复制代码CPLD sensor模块:

  1. module sensor
  2.     (
  3.         inClk1K,
  4.         BUS_CS_CPLD,BUS_RD,BUS_D_OUT,BUS_A_L, MCU_IO,
  5.         SEN_DOOR,SEN_PRESS,SEN_CARVE,SEN_TAPE_B,SEN_TAPE_F,SEN_CUT_R,SEN_CUT_L,SEN_RESERVE
  6.     );
  7.    

  8.         input inClk1K;
  9.         input BUS_CS_CPLD,BUS_RD;
  10.     input[19:0] BUS_A_L;
  11.     input SEN_DOOR,SEN_PRESS,SEN_CARVE,SEN_TAPE_B,SEN_TAPE_F,SEN_CUT_R,SEN_CUT_L,SEN_RESERVE;
  12.     output[7:0] BUS_D_OUT;
  13.     output MCU_IO;
  14.    
  15.     reg[7:0] BUS_D_OUT;
  16.     reg MCU_IO;
  17.    
  18.     parameter ADDR_SENSOR = 16'h2000;
  19.         
  20.     //传感器有光(未挡住)
  21.     //parameter STATE_BRIGHT = 1'b1;
  22.     //传感无光(挡住)
  23.     //parameter STATE_DARK   = 1'b0;
  24.    
  25.     always@(negedge BUS_RD)
  26.     begin
  27.         if ((BUS_CS_CPLD == 0))// && (BUS_A_L[15:0] == ADDR_SENSOR))
  28.         begin
  29.             //                    7          6         5        4          3          2        1        0
  30.             BUS_D_OUT[7:0] = {SEN_DOOR,SEN_PRESS,SEN_CARVE,SEN_TAPE_B,SEN_TAPE_F,SEN_CUT_R,SEN_CUT_L,SEN_RESERVE};
  31.             //出现读取数据为全0的情况时,将上句替换为  BUS_D_OUT[7:0] = 8'h23; 则可以正常读出数据,怀疑是总线上挂的设备太多了,驱动能力不足?
  32.         end
  33.     end

  34. endmodule
  35.    
复制代码CPLD led_beeper模块:

  1. module led_beeper
  2.     (
  3.         clk_1k,rst_n,
  4.         BUS_CS_CPLD,BUS_WR,BUS_D,BUS_A_L,
  5.         outLed,outBeeper
  6.     );
  7.    
  8.     /* 输入信号数据格式
  9.         [7:0]  -- 蜂鸣器
  10.         [11:8] -- LED0
  11.         [15:12]-- LED1
  12.     */
  13.     input clk_1k,rst_n;
  14.         input BUS_CS_CPLD, BUS_WR;
  15.     input[15:0] BUS_D;
  16.     input[19:0] BUS_A_L;
  17.     output[1:0] outLed;
  18.     output outBeeper;
  19.    
  20.     //寄存器定义
  21.     reg[1:0] outLed;
  22.     reg outBeeper;

  23.     reg [3:0]rStateLed0,rStateLed1,rStateBeeper;
  24.     reg [9:1]rCntLed0,rCntLed1,rCntBeeper;
  25.    
  26.     //定义使能信号数据
  27.     //注意:该地址为16位数据地址,即对应到MCU中的地址为0x1000<<1 (MCU中的地址为8位数据地址)
  28.     parameter ADDR_LED_BEEPER = 16'h1000;
  29.    
  30.     parameter STATE_ON   = 4'h1;
  31.     parameter STATE_OFF  = 4'h2;
  32.     parameter STATE_1HZ  = 4'hA;
  33.     parameter STATE_3HZ  = 4'hB;
  34.     parameter STATE_10HZ = 4'hC;
  35.    
  36.     parameter OUT_ON  = 1'b0;
  37.     parameter OUT_OFF = 1'b1;
  38.    
  39.     //总线数据接收
  40.     always @(negedge BUS_WR or negedge rst_n)
  41.     begin
  42.         if (rst_n == 1'b0)
  43.         begin
  44.             rStateLed1 = STATE_ON;
  45.             rStateLed0 = STATE_ON;
  46.             rStateBeeper = STATE_OFF;
  47.         end
  48.         else if ((BUS_CS_CPLD == 0) && (BUS_A_L == ADDR_LED_BEEPER))
  49.         begin
  50.             if (BUS_D[7:4] != 4'h0)
  51.             begin
  52.                 rStateLed1 = BUS_D[7:4];
  53.             end
  54.             if (BUS_D[3:0] != 4'h0)
  55.             begin
  56.                 rStateLed0 = BUS_D[3:0];
  57.             end
  58.             if (BUS_D[11:8] != 4'h0)
  59.             begin
  60.                 rStateBeeper = BUS_D[11:8];
  61.             end
  62.         end
  63.     end
  64.    
  65.     //LED0
  66.     always @(posedge clk_1k)
  67.     begin
  68.         case(rStateLed0)
  69.             STATE_ON:   
  70.                 begin
  71.                     outLed[0] = OUT_ON;
  72.                     rCntLed0 = 1'b0;
  73.                 end
  74.             STATE_OFF:   
  75.                 begin
  76.                     outLed[0] = OUT_OFF;
  77.                     rCntLed0 = 1'b0;
  78.                 end
  79.             STATE_1HZ:
  80.             begin
  81.                 if (rCntLed0 >= 500)
  82.                 begin
  83.                     outLed[0] = ~outLed[0];
  84.                     rCntLed0 = 1'b0;
  85.                 end
  86.                 rCntLed0 = rCntLed0 + 1'b1;
  87.             end
  88.             STATE_3HZ:
  89.             begin
  90.                 if (rCntLed0 >= 166)
  91.                 begin
  92.                     outLed[0] = ~outLed[0];
  93.                     rCntLed0 = 1'b0;
  94.                 end
  95.                 rCntLed0 = rCntLed0 + 1'b1;
  96.             end
  97.             STATE_10HZ:
  98.             begin
  99.                 if (rCntLed0 >= 50)
  100.                 begin
  101.                     outLed[0] = ~outLed[0];
  102.                     rCntLed0 = 1'b0;
  103.                 end
  104.                 rCntLed0 = rCntLed0 + 1'b1;
  105.             end
  106.             default: outLed[0] = OUT_ON;
  107.         endcase
  108.     end

  109.     //LED1
  110.     always @(posedge clk_1k)
  111.     begin
  112.         case(rStateLed1)
  113.             STATE_ON:   
  114.                 begin
  115.                     outLed[1] = OUT_ON;
  116.                     rCntLed1 = 1'b0;
  117.                 end
  118.             STATE_OFF:   
  119.                 begin
  120.                     outLed[1] = OUT_OFF;
  121.                     rCntLed1 = 1'b0;
  122.                 end
  123.             STATE_1HZ:
  124.             begin
  125.                 if (rCntLed1 >= 500)
  126.                 begin
  127.                     outLed[1] = ~outLed[1];
  128.                     rCntLed1 = 1'b0;
  129.                 end
  130.                 rCntLed1 = rCntLed1 + 1'b1;
  131.             end
  132.             STATE_3HZ:
  133.             begin
  134.                 if (rCntLed1 >= 166)
  135.                 begin
  136.                     outLed[1] = ~outLed[1];
  137.                     rCntLed1 = 1'b0;
  138.                 end
  139.                 rCntLed1 = rCntLed1 + 1'b1;
  140.             end
  141.             default: outLed[1] = OUT_ON;
  142.         endcase
  143.     end

  144.     //BEEPER
  145.     always @(posedge clk_1k)
  146.     begin
  147.         case(rStateBeeper)
  148.             STATE_ON:  
  149.                 begin
  150.                     outBeeper = OUT_ON;
  151.                     rCntBeeper = 1'b0;
  152.                 end
  153.             STATE_OFF:
  154.                 begin
  155.                     outBeeper = OUT_OFF;
  156.                     rCntBeeper = 1'b0;
  157.                 end
  158.             STATE_1HZ:
  159.             begin
  160.                 if (rCntBeeper >= 500)
  161.                 begin
  162.                     outBeeper = ~outBeeper;
  163.                     rCntBeeper = 1'b0;
  164.                 end
  165.                 rCntBeeper = rCntBeeper + 1'b1;
  166.             end
  167.             STATE_3HZ:
  168.             begin
  169.                 if (rCntBeeper >= 166)
  170.                 begin
  171.                     outBeeper = ~outBeeper;
  172.                     rCntBeeper = 1'b0;
  173.                 end
  174.                 rCntBeeper = rCntBeeper + 1'b1;
  175.             end
  176.             /*STATE_10HZ:
  177.             begin
  178.                 if (rCntBeeper >= 50)
  179.                 begin
  180.                     outBeeper = ~outBeeper;
  181.                     rCntBeeper = 1'b0;
  182.                 end
  183.                 rCntBeeper = rCntBeeper + 1'b1;
  184.             end*/
  185.             //上面这段代码删除以后,会导致sensor模块的数据通过总线读出来是全0,再添加这段代码回来,就恢复了。。奇怪的问题
  186.             default: outBeeper = OUT_OFF;
  187.         endcase
  188.     end

  189.    
  190.    
  191. endmodule
复制代码


MCU.zip 下载积分: 积分 -1 分
122.03 KB, 阅读权限: 10, 下载次数: 3, 下载积分: 积分 -1 分
CPLD.rar 下载积分: 积分 -1 分
845.36 KB, 阅读权限: 10, 下载次数: 9, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。