当前位置:高校自动化网 >> fpga >> 浏览文章

Verilog中宏定义位宽带

文章来源:ednchina 作者:ilove314


该文章讲述了Verilog中宏定义位宽带.

 

 

Verilog中宏定义位宽带来的问题

         宏定义在C语言程序中的使用司空见惯,他的好处就在于可以大大提高代码的可读性和可移植性。而在verilog中,也支持这个语法,在很多开源代码中也都能看到`define的身影。但是它的使用和C语言可不完全一样,很多时候需要非常小心和谨慎。其中最可能让设计者犯错的就是它的位宽问题。特权同学就吃过这个亏,因此有必要在此专门撰文讨论一下,不仅给自己提个醒,它希望读者您少走弯路。

先简单的复习一下define在verilog基本语法书中的一些定义和简单的使用说明。

宏定义 `define:用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为:

 `define 标识符(宏名)字符串(宏内容)

如:`define signal string,它的作用是指定用标识符signal来代替string这个字符串,在编译预处理时,把代码中在该命令以后所有的signal都替换成string。这种方法使用户能以一个简单的名字代替一个长的字符串,也可以用一个有含义的名字来代替没有含义的数字和符号,因此把这个标识符(名字)称为“宏名”,在编译预处理时将宏名替换成字符串的过程称为“宏展开”。`define是宏定义命令。

例:

`define    SIZE         8

module reg[`SIZE:1] db;   //相当于定义寄存器reg[8:1] db;

         那么下面特权同学拿一个简单的实例来说明define使用时容易遇到的位宽问题,其实也是特权同学自己遇到的,感觉很有典型性。

input clk;      //外部输入时钟,25MHz

input rst_n;    //外部输入复位信号,低电平有效

input[9:0] mcu_wr_addr; //原始地址数据

output[9:0] mcu_wr_ab;  //译码后地址数据

 

`define LCDX_DIS    800

`define LCDSD_PAGE  `LCDX_DIS/4

`define LCDSD_2PAGE `LCDSD_PAGE*2  

`define LCDSD_3PAGE `LCDSD_PAGE*3

 

reg[11:0] mcu_wr_abr;  

 

always @(posedge clk or negedge rst_n)

    if(!rst_n) mcu_wr_abr <= 12'd0;

    else if((mcu_wr_addr[9:0] >= 10'd0) && (mcu_wr_addr[9:0] < `LCDSD_PAGE)) mcu_wr_abr <= {2'b00,mcu_wr_addr[9:0]};

    else if((mcu_wr_addr[9:0] >= `LCDSD_PAGE) && (mcu_wr_addr[9:0] < `LCDSD_2PAGE)) mcu_wr_abr <= {2'b01,mcu_wr_addr[9:0]-`LCDSD_PAGE};

    else if((mcu_wr_addr[9:0] >= `LCDSD_2PAGE) && (mcu_wr_addr[9:0] < `LCDSD_3PAGE)) mcu_wr_abr <= {2'b10,mcu_wr_addr[9:0]-`LCDSD_2PAGE};

    else mcu_wr_abr <= {2'b11,mcu_wr_addr[9:0]-`LCDSD_3PAGE};

 

assign mcu_wr_a

相关文章:
  • quartus + modelsim 后仿傻瓜教程
  • 基于FPGA的随机数发生器的实现以及利用ChipScope的验证--ZT
  • 基于MATLABDSP Builder DSP可控正弦信号发生器设计
  • 上一篇:破解ModelSim-Altera的方法
    下一篇:FPGA时序约束—TimeQuest基础
    最近更新