打印
[Quartus]

Verilog程序经验谈

[复制链接]
3778|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaochy1126|  楼主 | 2012-9-15 11:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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;

相关帖子

沙发
gaochy1126|  楼主 | 2012-9-15 11:40 | 只看该作者
4. 程序中的定时工作信号
   首先用always建立一个和时钟有关的循环计数器,计到最要求的计数时归零.
   再用另一个always里判断这个计数值,只在某一个数值是进行操作(如值为0值),用在一个模块内同步定时
   也可以采用assign 输出一个管脚法,这种方法用在两个模块之间同步
   如下:

    parameter MAX_CLK = 26'd50_000_000 ;
    parameter CNT_1S  = MAX_CLK;       //1s 计数
    parameter CNT_1MS = MAX_CLK/1000;  //1ms 计数

    //循环计数周期
    reg [25:0] Count_Sec;
    always @ ( posedge CLK or negedge RSTn )
        if( !RSTn )
            Count_Sec <= 26'd0;
        else if( Count_Sec == CNT_1MS )
            Count_Sec <= 26'd0;
        else if( Count_Sig )
            Count_Sec <= Count_Sec + 1'b1;
        else
            Count_Sec <= 26'd0;

    //定时方法1,always法        
    always @ ( posedge CLK or negedge RSTn )
        if( !RSTn )
            begin
                //初始化数据
            end
        else
            if( Count_Sec == 0 )   //判断值为0值开始工作,也可以是其它值        
            begin
                //开始定时的工作
            end

    //定时方法2,assign 法            
    output Timer_Clk;  //定义一个输出变量,输出定时脉冲,
    assign Timer_Clk = ( Count_Sec == 26'd0 ) ? 1'b1 : 1'b0;     

5. 读写数据接口
   采用如下模式,由两个端口,一个RD_Data,一个WR_Data端口,分别是在RD_Enable, WR_Enable保持有效状态下工作。

    //模块内部和其他模块或器件间的接口
    output [7:0] RX_data_fm_usb,      //其他模块从本模块读取来自USB接口的数据
    input  [7:0] TX_data_to_usb,      //其他模块向本模块写入发到USB接口的数据
    input  RD_Enable,                 //其他模块从本模块读使能,高有效,使用时由0到1保持80ns后读RX_data_fm_usb数
    input  WR_Enable,                 //其他模块向本模块写使能,高有效,使用时写入TX_data_to_usb后,由0到1保持80ns后停止
    output USB_busy                   //USB接口忙/空闲状态,高为忙碌,低为空闲,处于读状态时,由忙碌状态变为空闲状表示上一个数据开始有效

7. ft245 串口模式下,
   测量速度800kB时,发送10k数据,测2次,每次有丢数据。
   测量速度500kB时,发送10k数据,测3次,每次有丢数据。

8. D2XX模式下,500kB 发送数据,正常

9.发送数据频率为500k, 屏幕显示500个点, 1S内有500k个点需要显示,那认为1k个点为一个数,显示周期为1s

使用特权

评论回复
板凳
GG_GG| | 2012-9-15 11:44 | 只看该作者
第四条说的不错,书写规范

使用特权

评论回复
地板
credit| | 2012-9-21 14:18 | 只看该作者
嗯,受教了

使用特权

评论回复
5
mahua001| | 2012-9-21 14:22 | 只看该作者
这些经验很好,谢谢楼主喽

使用特权

评论回复
6
realzzc| | 2012-9-21 14:30 | 只看该作者
学习下,多谢楼主分享

使用特权

评论回复
7
EandE| | 2012-9-21 14:58 | 只看该作者
不错 值得学习

使用特权

评论回复
8
liugp25| | 2012-9-21 15:00 | 只看该作者
不错 希望继续更新

使用特权

评论回复
9
ellen325| | 2012-9-21 16:01 | 只看该作者
谢分享 受教

使用特权

评论回复
10
gaochy1126|  楼主 | 2012-9-21 23:07 | 只看该作者
大家共同进步!

使用特权

评论回复
11
51xlf| | 2012-9-26 08:03 | 只看该作者
对于菜鸟来说,写的真是好,受用呀!

使用特权

评论回复
12
lzmm| | 2012-9-26 08:22 | 只看该作者
写的不错,对初学者有很大的指导作用的

使用特权

评论回复
13
sgh2| | 2012-9-27 16:27 | 只看该作者
看看,谢谢

使用特权

评论回复
14
mucanhin| | 2012-9-27 16:43 | 只看该作者
楼主写的不错

使用特权

评论回复
15
gool| | 2012-9-27 17:09 | 只看该作者
确实是经验之谈

使用特权

评论回复
16
GoldSunMonkey| | 2012-9-27 18:28 | 只看该作者
:)

使用特权

评论回复
17
sunny丶| | 2012-9-28 17:17 | 只看该作者
学习下,多谢楼主了。

使用特权

评论回复
18
gaochy1126|  楼主 | 2012-9-28 18:04 | 只看该作者
感谢各位兄弟们的支持,!

使用特权

评论回复
19
ayading| | 2012-9-28 18:19 | 只看该作者
多谢

使用特权

评论回复
20
GoldSunMonkey| | 2012-9-28 22:17 | 只看该作者
感谢各位兄弟们的支持,!
gaochy1126 发表于 2012-9-28 18:04
支持你。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1051

主题

11300

帖子

26

粉丝