在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: sxtz531

[求助] hdl代码学习不明白的地方

[复制链接]
发表于 2012-7-20 17:34:10 | 显示全部楼层
// Sequential always block.
always @(posedge clk or posedge rst)
  begin
    if (rst)
      state <= STATE_IDLE;
    else
      state <= next;
  end

// Combinational always block.
always @(state or input1 or input2 ... or inputN)
  begin
    next = STATE_IDLE;
    outputs = OUTPUT_IDLE:
    case (state)
      STATE_IDLE:
        begin
          ... // the logic to determine the next state.
          next = STATE_?????;
        end
      STATE_?????:
        begin
          ... // the logic to determine the next state.
          next = STATE_?????;        
          outputs = ?????; // The output of this state.
        end
    endcase
  end
发表于 2012-7-20 17:35:00 | 显示全部楼层
针对simplified one-hot encoding的FSM范例:
// Sequential always block.
always @(posedge clk or posedge rst)
  begin
    if (rst)
      state <= n'b0;
      state[STATE_DEFAULT] <= 1'b0;
    else
      state <= next;
  end

// Combinational always block.
always @(state or input1 or input2 ... or inputN)
  begin
    next = n'b0;
    outputs = OUTPUT_DEFAULT:
    case (1'b1)  // synopsys full_case parallel_case
      state[STATE_DEFAULT]:
        begin
          ... // the logic to determine the next state.
          next[STATE_?????] = 1'b1;
        end
      state[STATE_?????]:
        begin
          ... // the logic to determine the next state.
          next[STATE_?????] = 1'b1;
          outputs = ?????; // The output of this state.
        end
      // synopsys translate_off
      default:
        $display("Bad state!!");
      // synopsys translate_on
    endcase
  end
发表于 2012-7-20 17:35:51 | 显示全部楼层
针对simplified one-hot with zero-idle encoding的FSM:
// Sequential always block.
always @(posedge clk or posedge rst)
  begin
    if (rst)
      state <= n'b0;
    else
      state <= next;
  end

// Combinational always block.
always @(state or input1 or input2 ... or inputN)
  begin
    next = n'b0;
    outputs = OUTPUT_DEFAULT:
    case (1'b1)  // synopsys full_case parallel_case
      ~|state:  // IDLE
        begin
          ... // the logic to determine the next state.
          next[STATE_?????] = 1'b1;
        end
      state[STATE_?????]:
        begin
          ... // the logic to determine the next state.
          next[STATE_?????] = 1'b1;
          outputs = ?????; // The output of this state.
        end
      // synopsys translate_off
      default:
        $display("Bad state!!");
      // synopsys translate_on
    endcase
  end
发表于 2012-7-20 17:36:38 | 显示全部楼层
Mealy FSM: 输出与输入有直接关系。
Mealy FSM的作法与上面的范例相类似。唯一的不同在于outputs的指定,需加上与input相关的逻辑判断。例如:

case(state)  // synopsys parallel_case full_case
  ...
  STATE_?????:
    begin
    ...
    if (input1 & input2)
      outputs = ?????;
    else
      outputs = ?????;
    end
  // synopsys translate_off
  default:
    $display("Bad FSM.");
  // synopsys translate_on
  default   
endcase
Datapath
参考:Coding Guidelines for Datapath Synthesis.
发表于 2012-7-20 17:37:30 | 显示全部楼层
有号数的计算:若有需要关于有号数的计算,应当利用Verilog 2001所提供的signed及$signed()机制。

input   signed [7:0]  a, b;
output   signed [15:0]  o;
assign  o = a * b;
or

input     [7:0]  a, b;
output     [15:0]  o;
wire  signed [15:0]  o_sgn;
assugb  o_sgn = $signed(a) * $signed(b);
assign  o = $unsigned(o_sgn);
正负号的扩展:应多加利用Verilog的implicity signed extension,避免手动进行转换。

input  signed [7:0]  a, b;
input  signed [8:0]  o;
assign  o = a + b;  // Verilog会自动进行符号的扩展。
发表于 2012-7-21 16:44:49 | 显示全部楼层
可以拿出一个你所说的例子 分析下
发表于 2012-7-21 18:43:27 | 显示全部楼层
学习了
发表于 2012-7-28 22:37:10 | 显示全部楼层
多看看综合后的电路
发表于 2012-7-29 10:13:58 | 显示全部楼层
可能与每一个公司的代码风格,和接口规范有关,也不排除,为了调整时序
发表于 2012-7-29 21:29:07 | 显示全部楼层

其实语句不重要,关键是你对电路的理解,硬件跟软件不一样,代码长也许电路就很简单,别片面理解
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

X

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-6-7 12:16 , Processed in 0.021239 second(s), 7 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表