Verilog程序经验谈

2020-02-28 18:39发布

1.写一个模块时,不知道input output 端口,哪个该用 reg型 还是wire型?
  我的办法是所有的模块输入输出都是wire型,也就是默认的.
  reg型变量在模块内部使用时声明,作为output时再用assign语句赋回来。
  简化了端口特点,不用再记住是wire,还是reg了.只要是output模块内部
  都会有相应的reg型寄存器与其对应.如下例:

    module Calc_Sync
    (
        input         Sync_S_Flag,        
        output        S_Flag     
    );   
        reg    rS_Flag;
        assign  S_Flag    = rS_Flag;   
        reg [3:0]    flag_count;
        parameter   MAX_CLK   = 27'd40_000_000;
        `define     ONE_CLK   = 27'd22_00;
   后面在always 里对rS_Flag的写操作就和对S_Flag的输出保持一致。

2. 模块端口 input,output 定义采用第一个字母大写加下划线,方便加寄存器标志 r :
       如上:output 端口为 S_Flag, 对应的寄存器就是 rS_Flag
   内部定义的变量所有的都采用小写加下划线,方便与ouput寄存器区分:
       如上:reg flag_count;  定义一个flag计数的寄存器
   paramete参数和define定义的常量采用全部大写加下划线:
       如上:MAX_CLK

3. reg 寄存器变量只能在一个always 里赋值,其它always 或 assign 里只能读

4. 两个模块之间的数据交互:有三种线:
   Rx_En:       接收允许 ( 接收端写,发送端读 )
   Rx_Done:     接收完成 ( 发送端写,接收端读 )
   Rx_Data[7:0]:接收数据 ( 发送端写,接收端读 )
   具体工作方式 详见另一篇博文

3.模块应该按以下格式定义,函数里只说明是输入还是输出,全部为wire型,需要reg寄存器的output在后面加入

    module FT245_R_W(
        //系统信号
        input CLK,                  //CLK为FPGA工作时钟,默认100MHz.
        input RSTn,                 //异步复位信号,低有效.   

        //FPGA和FT245MB间的USB接口
        input   USB_RXF,
        input   USB_TXE,
        output USB_WR,
        output USB_WR,
        inout   [7:0] USB_DATA,   

    );
     reg     rUSB_RD;
     reg     rUSB_WR;
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。