世俱杯 2025

登录 免费注册 世俱杯 2025 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

求助:inout Databus有问题,怎么解决,先谢谢了

作者:larmstrong 栏目:EDA技术
求助:inout Databus有问题,怎么解决,先谢谢了
/*   ISPLSI1016    ispExpert V7.01*/
/*
这是一个单片机系统,这个芯片主要实现三个功能:
1 地址分配
2 检测纸张传感器
3 单片机向端口(8000H)写数据,芯片负责把数据串行发送出去(要产生时钟和数据)
*/
`timescale 1ns/1ns
MODULE  DECODER(CP, DECODE, STB, A, WR, RD, PAPER_OUT, TI, Databus,
               TO, CS_1230, CS_8255K, CS_8255P, CS_LCD, CS_12887, RST, RST_LCD, PRT_D, PRT_CLK, PRT1, PRT2, PRT3, PRT4);
        parameter    N=7, delay=1;
        input      DECODE;
    input    CP, RD, WR, PAPER_OUT;
    input    TI,STB;
    
    input    [15:11]A;
    inout   [N:0]Databus;
    OUTPUT     CS_1230, CS_8255K, CS_8255P, CS_LCD, CS_12887,RST, RST_LCD;
    OUTPUT  TO,  PRT1,PRT2,PRT3,PRT4;    
    OUTPUT    PRT_D, PRT_CLK;

    wire    [N:0]Databus;
        
    reg     [N:0]PrintData;
    integer Count;
    reg    CS_1230, CS_8255K, CS_8255P, CS_LCD, CS_12887;
    reg     PRT_D, PRT_CLK;
    reg     PRT1,PRT2,PRT3,PRT4;
    reg     RST,RST_LCD;    

/*初始化*/    
    initial
    begin
        RST = 1'b1;
        RST_LCD = 1'b1;
        PRT_D = 1'b0;
        PRT_CLK = 1'b0;
        PRT1 = 1'b0;
        PRT2 = 1'b0;
        PRT3 = 1'b0;
        PRT4 = 1'b0;
    end            

/*向8000H写数据*/
     always @(negedge WR)
    begin
        if(A == 5'b10000)
        begin
            PrintData = 8'b11001100;//AD;
            Count = 1;
        end
    end

/*数据传送 接收到上面的数据就把8比特数据向串行线上传送*/
    always    @(posedge CP)                       //CP是51MCU的ALE
    begin
        if(Count != 0)
        begin
            {PRT_D,PrintData}={PrintData,1'b0};
            Count = Count + 1;
            PRT_CLK = # 50 1'b1;        //产生时钟信号
            if(Count==9) Count=0;
            PRT_CLK = # 50 1'b0;
        end
    end

/*纸张检测    0E000H*/
    always @(negedge RD)
    if(A==5'b11100)
    begin
        Databus[0] = PAPER_OUT;            //PAPER_OUT是纸的检测传感器
    end

/*内部打印机STB*/
        assign TO = STB;                         //用外部单稳态触发器控制时间,这里触发
        
    always @(negedge TI)                     //计时完成,关打印机加热器
        begin
            PRT1 = 1'b0;
            PRT2 = 1'b0;
            PRT3 = 1'b0;
            PRT4 = 1'b0;
        end

/*译码*/
    always @(A)         //A只有5个管脚和这个芯片相连
    begin
        casex   (A)
            5'b0xxxx:         //RAM             
            begin //*************下面一段是产生片选信号**********
                CS_1230 = 1'b0;
                CS_8255P = 1'b1;
                CS_8255K = 1'b1;
                CS_LCD = 1'b1;
                CS_12887 = 1'b1;
            end    
        
            5'b10111:         //B800    8255P
            begin
                CS_1230 = 1'b1;
                CS_8255P = 1'b0;
                CS_8255K = 1'b1;
                CS_LCD = 1'b1;
                CS_12887 = 1'b1;
            end

       &nb
2楼: >>参与讨论
liuorins
随便说一句
    兄弟你的问题好像是双向io口的问题,可你却搞了这么长的程序来,别人没有那么多时间来看的,问问题要集中。一句小的忠告,  :)
    大概看了一下,我有几点疑问?你用的开发系统是什么?基于什么芯片?verilog HDL语言是一种类似c的语言,很多它的语句是不能综合的,如初始化等,你要将语言与实际的数字电路,如三态门,d触发器,多路选择开关等对应起来。
  双向io口的控制可以用两个简单的三态门来实现,注意不能用reg,是wire。

3楼: >>参与讨论
larmstrong
这是一个实现方式 三态
inout   [N:0]Databus;
reg     LINK;

assign Databus = (LINK)?{password[6:0],PAPER_OUT}:8'bz;    //三态门

always @(A or  RD)
      if((A==5'b11100) && (RD == 1'b0))
      begin
         LINK = 1'b1;            //PAPER_OUT是纸的检测传感器
      end
    else
      begin
    LINK = 1'b0;
      end

参与讨论
昵称:
讨论内容:
 
 
相关帖子
MAX7128 基本电路是不是只接4对电源?~
ACTEL的开发板只有原厂的吗?
在一块电路板上 模拟地与数字地 怎么接
ns级别的脉冲怎么测量他的脉冲宽度,有什么好方法
请问哪里有IES 5.X 或6.X下载?多谢了


Copyright © 1998-2006 tgdrjb.cn 浙ICP证030469号