使用<<在给定的Verilog代码中?

时间:2015-06-13 18:33:57

标签: verilog

在下面用于实现路由器输入缓冲区的Verilog代码片段中,在第二行中,1<<`BUF_WIDTH的作用是什么?我知道<<是左移位运算符,但是左移1到`BUF_WIDTH会发生什么?或者是否有<<运算符的其他函数?

`define BUF_WIDTH 3    // BUF_SIZE = 16 -> BUF_WIDTH = 4, no. of bits to be used in pointer
`define BUF_SIZE ( 1<<`BUF_WIDTH )

module fifo13( clk, rst, buf_in, buf_out, wr_en, rd_en, buf_empty, buf_full, fifo_counter );

input                 rst, clk, wr_en, rd_en;   
input [7:0]           buf_in; // data input to be pushed to buffer

output[7:0]           buf_out;// port to output the data using pop.

output                buf_empty, buf_full; // buffer empty and full indication 

output[`BUF_WIDTH :0] fifo_counter; // number of data pushed in to buffer   

reg[7:0]              buf_out;
reg                   buf_empty, buf_full;
reg[`BUF_WIDTH :0]    fifo_counter;
reg[`BUF_WIDTH -1:0]  rd_ptr, wr_ptr;           // pointer to read and write addresses  
reg[7:0]              buf_mem[`BUF_SIZE -1 : 0]; 

.

.

.

整个代码可在http://electrosofts.com/verilog/fifo.html

上找到

2 个答案:

答案 0 :(得分:1)

您正确地假设<<是左移运算符,它没有其他特殊含义。

将数字的二进制表示向左移动相当于将数字乘以2.因此,通过将1向左移动N次,结果得到2的幂。

在代码示例中使用它的方式可确保缓冲区具有与大小为BUF_SIZE的指针唯一寻址的条目(BUF_WIDTH)完全相同的数量。

答案 1 :(得分:0)

这是位移操作符。想想它的作用:它将位移左。你有BUF_WIDTH为3的定义。然后你取1,将它移动到那么多的位置,BUF_SIZE得到8。使用三位,您可以拥有8个不同的值。

因此,这是一种定义这两个常量的方法,因此您只需更改一个值。如果它们是两个常数,有人可能会意外地只改变一个而不是另一个,这会导致问题。