verilog自加为什么会出现高阻态

之前在写自加逻辑时,仿真结果经常会出现高阻态,常常百思不得其解,这次简单分析一下。

always@(negedge clk_ad or negedge rst_n)begin
if(!rst_n)begin
    CNT_SIGNAL <= 10'b0;
    score_reg_signal <= 0;
end
else if(cs)begin
    if(CNT_SIGNAL<SIGNAL)begin
        score_reg_signal <= score_reg_signal+score_reg_point;
        CNT_SIGNAL <= CNT_SIGNAL + 1'b1;
    end
    else begin
        CNT_SIGNAL <= 0;
        score_reg_signal <= 0;
    end
end
else begin
end

这样一个简单的自加逻辑,输出的结果是这样的

可以看到,在第一轮自加过程中,输出结果一直是高阻态,分析原因是没有给寄存器赋初值导致的。虽然我们在rst中设置了寄存器结果为零,但实际上并没有给寄存器的输入赋初值,实际上综合出来的电路是这样的。

可以看到,rst只能控制CLRN端,寄存器的输入D由一个选择器控制是清0还是累加。

选择器的控制信号是由比较器产生的

if(CNT_SIGNAL<SIGNAL)

这就意味着第一轮自加时,自加的信号并不知道自己的初始值是多少,所以即使在自加也一直是高阻态。

直到清0,它才有确定的初始输入值0。所以后续也就可以正常输出了。

此外,如果用initial进行初始化

initial begin
    score_reg_signal = 0;
    score_reg_signal_buff = 0;
end

always@(negedge clk_ad or negedge rst_n)begin
//initialize target_reg and xnor_reg_14bit
if(!rst_n)begin
    full <= 1'b0;
    CNT_SIGNAL <= 10'b0;
	xnor_reg_point <= 0;
    score_reg_signal <= 0;
end
else if(cs)begin
    if(CNT_SIGNAL<SIGNAL)begin
        xnor_reg_point <= data_in ^ target_reg[CNT_SIGNAL];
        score_reg_point <= score_wire_point;
        score_reg_signal <= score_reg_signal+score_reg_point;
        CNT_SIGNAL <= CNT_SIGNAL + 1'b1;
        full <= 1'b0;
    end
    else begin
        full <= 1'b1;
        CNT_SIGNAL <= 0;
        score_reg_signal <= 0;
        score_reg_signal_buff <= score_reg_signal;
    end
end
else begin
    full <= 1'b0;
end
end

输出结果会变成这样

 说明只要进入自加的if,就会被判断为没有初值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值