[verilog] 常用的RTL级建模

[复制链接]
1350|0
 楼主| zhangyuhua 发表于 2016-11-28 22:07 | 显示全部楼层 |阅读模式
本帖最后由 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的值进行操作,不能直接进行操作。正确的操作方法是,先将存储单元赋值给某个寄存器,然后在对该寄存器的某位进行相关操作,如下例所示。
  1. reg [7:0]RAM×64[0:63];
  2. reg [7:0]mem_data;
  3. always @(posedge clk)
  4.      begin
  5.           if(wr && cs)           //write
  6.                RAM×64[addr]<=data_in;
  7.           else  if(!wr && cs)   //read
  8.                       mem_data<=  RAM×64[addr];
  9.      end
3、时钟的分频电路     一般对时钟进行处理,分为分频和移相。
    派生时钟是指将源时钟进行分频而得到的时钟。
    偶数分频十分简单,只需用高速时钟做一个同步计数器。奇数分频电路相对复杂一些。下面用两个例子来解释下偶数分频和奇数分频。

  1. //--------偶分频----------
  2. reg clk_out;
  3. reg [3:0]cnt;
  4. always @(posedge clk or negedge rst_n)
  5.      begin
  6.           if(!rst_n)
  7.               cnt<='d0;
  8.           else  if(cnt=='d9)
  9.                      cnt<='d0;
  10.                  else cnt<=cnt+1'b1;
  11.      end
  12. always @(posedge clk or negedge rst_n)
  13.      begin
  14.           if(!rst_n)
  15.               clk_out<=1'b0;
  16.           else  if(cnt=='d9)
  17.                      clk_out<=~clk_out;
  18.                  else clk_out<=clk_out;
  19.      end
  1. //-------奇分频-------
  2. reg clk1;
  3. reg [1:0]state;
  4. always @(posedge clk or negedge rst_n)
  5.      begin
  6.           if(!rst_n)
  7.               state<=2'b00;
  8.           else case(state)
  9.                       2'b00:state<=2'b01;
  10.                       2'b01:state<=2'b11;
  11.                       2'b11:state<=2'b00;
  12.                       default:state<=2'b00;
  13.                 endcase
  14.      end
  15. always @(negedge clk or negedge rst_n)
  16.      begin
  17.          if(!rst_n)
  18.              clk1<=1'b0;
  19.          else  clk1<=state[0];
  20.      end
  21. assign  clk_out=clk1 & state[0];

      





您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

26

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部