- UID
- 1023229
- 来自
- 中国
|
现总结一下自己编写verilog程序的一点经验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; 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 来源:http://blog.sina.com.cn/s/blog_96db57e00100y9lh.html |
|