本帖最后由 zhangyuhua 于 2016-11-28 22:23 编辑
RTL(Register Transfer Level)指不关注寄存器与组合逻辑的细节,通过描述寄存器到寄存器之间的电路逻辑功能。
1、寄存器电路建模
寄存器的特点为仅当时钟沿(上升沿或下降沿)到达时,才有可能发生输出的改变。
寄存器信号声明:寄存器被定义为reg型。但注意:某些信号虽然被定义为reg型,但最终综合的结果并不是寄存器;只有当信号被定义为reg型,且处理该信号的always敏感表为posedge或negedge沿敏感时,该信号才会被实现为寄存器。
2、存储器建模
Verilog语法中存储单元定义的格式如下:reg [data_width] memoryname [addresswidth];(如:reg[7:0] RAM8×64[0:63]).
在使用存储单元时,不能直接引用存储器某地址的某比特位值,如想对地址为"32"的第2bit和高2bit的值进行操作,不能直接进行操作。正确的操作方法是,先将存储单元赋值给某个寄存器,然后在对该寄存器的某位进行相关操作,如下例所示。- reg [7:0]RAM×64[0:63];
- reg [7:0]mem_data;
- always @(posedge clk)
- begin
- if(wr && cs) //write
- RAM×64[addr]<=data_in;
- else if(!wr && cs) //read
- mem_data<= RAM×64[addr];
- end
3、时钟的分频电路 一般对时钟进行处理,分为分频和移相。
派生时钟是指将源时钟进行分频而得到的时钟。
偶数分频十分简单,只需用高速时钟做一个同步计数器。奇数分频电路相对复杂一些。下面用两个例子来解释下偶数分频和奇数分频。
- //--------偶分频----------
- reg clk_out;
- reg [3:0]cnt;
- always @(posedge clk or negedge rst_n)
- begin
- if(!rst_n)
- cnt<='d0;
- else if(cnt=='d9)
- cnt<='d0;
- else cnt<=cnt+1'b1;
- end
- always @(posedge clk or negedge rst_n)
- begin
- if(!rst_n)
- clk_out<=1'b0;
- else if(cnt=='d9)
- clk_out<=~clk_out;
- else clk_out<=clk_out;
- end
- //-------奇分频-------
- reg clk1;
- reg [1:0]state;
- always @(posedge clk or negedge rst_n)
- begin
- if(!rst_n)
- state<=2'b00;
- else case(state)
- 2'b00:state<=2'b01;
- 2'b01:state<=2'b11;
- 2'b11:state<=2'b00;
- default:state<=2'b00;
- endcase
- end
- always @(negedge clk or negedge rst_n)
- begin
- if(!rst_n)
- clk1<=1'b0;
- else clk1<=state[0];
- end
- assign clk_out=clk1 & state[0];
|