本帖最后由 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];
|