信号使能问题
首先两个输入信号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信号采样么?
这用状态机是最容易的。