首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Verilog代码标准(4)

Verilog代码标准(4)

D. Finite StateMachine
     不允许有模糊不清的状态机模式,所有的状态机必须清晰明了。
     我们要求将状态机的时序部分和组合逻辑部分分开。
     例如:
         module state4 (
clock
reset
out
);
         input         reset
         input         clock;
         output  [1:0]  out;
         parameter [1:0]  stateA=2’b00;
         parameter [1:0]  stateB=2’b01;
         parameter [1:0]  stateC=2’b10;
          parameter [1:0]  stateD=2’b11;
         reg     [1:0]   state;
         reg     [1:0]   nextstate;
reg     [1:0]   out;
always @ (posedge clock)
begin
   if (reset ==1,0’b0)
      state <= stateA;
   else
      state <= nextstate;
end

always @ (state)
begin
   case (state)
      stateA: begin
        nextstate = stateB;
      end
      stateB: begin
        nextstate = stateC;
      end
      stateC: begin
        nextstate = stateD;
      end
      stateD: begin
        nextstate = stateA;
      end
            endcase
          end
          always@(postdge clock or negedge reset)
          begin
             if (reset==1’b0)
                out <= 2’b0;
             else begin
                if (state==…)
                   out <= …;
                else
                   out <= …;
           end
         end
         endmodule        
7. 统一格式的always程序块的书写
    A.always 中的变量的赋值方式――阻塞与非阻塞赋值
    当进行时序逻辑建模时,always块中使用非阻塞赋值――NON_BLOCKING;
    参加如下代码:
always @(posedge clk or negedge rst_n)
begin
if (rst_n == 1’b0;
     myreg <=1’b0;
   else
     myreg <=‘DLY1’b1;
end
always块中使用的NON_BLOCKING赋值时在”<=”前要加上#‘DLY,如上例;
当使用always语句进行组合逻辑建模时,always块中使用阻塞赋值――BLOCKING;
   参见如下代码:
       always @(addr)
       begin
          case (addr)

                 2’b00 : cs0_n=1’b0;
        2’b01 : cs0_n=1’b1;
        2’b10 : cs0_n=1’b0;
        2’b11 : cs0_n=1’b1;
        default: cs0_n=1’b1;
     endcase
end
·  如果要使用always语句同时进行时序与组合逻辑建模时,一定使用非阻塞赋值;例如:
    //组合逻辑与时序逻辑在同一个always块中
     always@(posedge clk or negedge reset_n)
    begin
       if(reset_n==1’b0)
          out<=1’b0;
       else
          begin
             case(count)
                 2’b00 : out<= `DLY in_a;
                 2’b01 : out<= `DLY in_b;
                 2’b10 : out<= `DLY in_c;
                 2’b11 : out<= `DLY in_c;
                 default: out<= `DLY in_a;
          end
end
继承事业,薪火相传
返回列表