发布网友 发布时间:2022-04-24 08:55
共1个回答
热心网友 时间:2022-06-18 06:11
mole contr(tiaoshi,en,clk,yzflag,t1,t2,q1,q2);
input clk,yzflag,en,tiaoshi; //输入信号,控制位
input[7:0] t1,t2; //输入信号,用于置数
output reg[7:0] q1,q2; //输出信号
always @(posedge clk^tiaoshi or posedge yzflag or
posedge en) //此进程在这些信号的上升沿被触发
begin
if(en) begin
q1=q1;q2=q2; end //若en=‘1’,则q1、q2保持原来的状态
else //以下为en=‘0’的情况
begin
if(yzflag) //若yzflag=‘1’,则q1=t1,q2=t2。t1,t2为输入,q1,q2为输出,
//相当于将输入的数直接输出
begin q1=t1;q2=t2; end
else //以下为yzflag=‘0’的情况
begin
if(q1==0) //若q1等于0,则将99赋给q1。相当于一个99~0循环的减法器。
q1='h99; //若减法器减到0了,则跳到99
else begin q1=q1-1;end //减法器,q1没减到0的时候每次减一
if(q1[3:0]>='ha) //将十六进制转换为十进制,文末“说明1”详细讲解
q1[3:0]=9;
if(q2==0) //若q2等于0,则将99赋给q2。相当于一个99~0循环的减法器。
q2='h99; //若减法器减到0了,则跳到99
else begin q2=q2-1;end //减法器,q2没减到0的时候每次减一
if(q2[3:0]>='ha) //将十六进制转换为十进制
q2[3:0]=9;
end
end
end
endmole
说明1:
if(q1[3:0]>='ha)
q1[3:0]=9;
q1为十六进制数,从99开始依次减一,一直到90时都正常。再减一次时,应该变为0x8f(十六进制),但我们想要的确却是,所以判断 if(q1[3:0]>='ha),则q1[3:0]=9,则q1=了。
那为何q1[7:4]未判断?我们往上看可知道:
if(q1==0) q1='h99;
此语句出现在判断的最开始,若q1减到0了,则将99赋给q1,也就是说q[7:4]只能在9~0之间切换。
字字手打,望楼主采纳!