在下面用于实现路由器输入缓冲区的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];
.
.
.
上找到
答案 0 :(得分:1)
您正确地假设<<
是左移运算符,它没有其他特殊含义。
将数字的二进制表示向左移动相当于将数字乘以2.因此,通过将1向左移动N次,结果得到2的幂。
在代码示例中使用它的方式可确保缓冲区具有与大小为BUF_SIZE
的指针唯一寻址的条目(BUF_WIDTH
)完全相同的数量。
答案 1 :(得分:0)
这是位移操作符。想想它的作用:它将位移左。你有BUF_WIDTH
为3的定义。然后你取1,将它移动到那么多的位置,BUF_SIZE
得到8。使用三位,您可以拥有8个不同的值。
因此,这是一种定义这两个常量的方法,因此您只需更改一个值。如果它们是两个常数,有人可能会意外地只改变一个而不是另一个,这会导致问题。