微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 信号使能问题

信号使能问题

时间:10-02 整理:3721RD 点击:
请教高人:
   首先两个输入信号a,b一个输出信号c;
      现在要求是 只有当a 从0变为1时, 将 c <= b;
            之后,a将不起作用!即a为一个开始信号,并不是结束信号!
     请高手帮小弟解决!不胜感激!

状态机啊。

/***************************************************************
说明:假设a,b,c信号均在clk domain,即同步信号
code中状态机除非reset,没有返回IDLE的路径,通
常应该设置一个返回的控制信号.不知道满足不满足
小编的需求,没有经过仿真,仅供参考
***************************************************************/
module test(
         c,
         a,
         b,         
         clk,
         rst_n
);
//===========================
//parameter declaration
//===========================
parameter     UDLY = 1;
parameter     IDLE = 1'b0;
parameter     START = 1'b1;
//===========================
//ports declaration
//===========================
output c;
input  a;
input  b;
input  clk;
input  rst_n;
//===========================
//signals declaration
//===========================
reg  cur_st;
reg  nxt_st;
reg  a_delay;
wire a_pose_edge;
wire c;
//===========================
//main code
//===========================
//a from 0 to 1
always@(posedge clk or negedge rst_n)
  begin
   if(!rst_n)
    a_delay <= 1'b0;
   else
    a_delay <= #UDLY a;
  end  
assign a_pose_edge = !a_delay & a;  
//state machine
always@(cur_st or a_pose_edge)
   begin
     case(cur_st)
        IDLE:
           if(a_pose_edge)
              nxt_st = START;
           else
              nxt_st = IDLE;
        START:  
              nxt_st = START;
        default:
           nxt_st = IDLE;
      endcase                    
   end
always@(posedge clk or negedge rst_n)
   begin
      if(!rst_n)
         cur_st <= IDLE;
      else
         cur_st <= #UDLY nxt_st;   
   end   
assign c = (cur_st == START)? b : 1'b0;
//=========================end code========================
endmodule

简单一点的
always @(posedge clk or negedge rst_n) begin
  if (rst_n == 1'b0)
    a_dly <= 1'b0;
    start  <= 1'b0;
    c        <= 1'b0;
  end
  else begin
    a_dly <= a;
    if (a == 1'b1 && a_dly == 1'b0)
        start <= 1'b1;
    if (start == 1'b1)
      c <= b;
  end

楼上的好,呵呵.

我觉的把c赋给b,和开始信号变为一应该同时发生,不应该差一个时钟周期

一般都是用第二种方法了。
这个在华为的一个硬件设计规范里头,分别给出了使能信号的开始和结尾信号的抽取的方式,都是按这种方式写的了。

谢谢热心的兄弟们!本人用的vhdl ,不过从verilog中也看出了点门道,能不能不用clk周期直接判断?
该语句想放到进程这外!以达到最快的速度传递。现本人将该问题,放入状态机中解决!但感觉不是太舒服!
我们再来讨论下,看能不能将这个问题很好的处理!毕竟在项目中这类的问题不少

没有搞太明白,小编的意思是a信号上升沿触发对D信号采样么?

这用状态机是最容易的。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top