这段程序为什么不能循环啊!!急!!Verilog
发布网友
发布时间:2024-10-03 15:16
我来回答
共2个回答
热心网友
时间:2024-10-03 15:20
1、状态的赋值使用‘非阻塞赋值’ ‘<=’ !试试
2、写的有点乱!
module state_t(clk_1Hz,enable,up_down,load,s_n,counter_2,s1);
input clk_1Hz;
input enable,up_down,load;
input [1:0]s_n;
output reg[1:0] counter_2,s1;
always@(posedge clk_1Hz )
begin
if(enable==1)
begin
if(load==1)
begin
if(up_down==1)
begin
counter_2<=s_n;
case(counter_2)
2'b01: counter_2<=2'b10;
2'b10: counter_2<=2'b11;
2'b11: counter_2<=2'b01;
endcase
end
else //if(up_down==0)
begin
counter_2<=s_n;
case(counter_2)
2'b11: counter_2<=2'b10;
2'b10: counter_2<=2'b01;
2'b01: counter_2<=2'b11;
endcase
end
end
else
s1<=2'b01;
case(s1)
2'b01: s1<=2'b10;
2'b10: s1<=2'b11;
2'b11: s1<=2'b01;
endcase
end
else
counter_2<=2'b00;
end
endmodule
热心网友
时间:2024-10-03 15:22
程序有问题,
首先output reg[1:0] counter_2,s1;
应写成:
output [1:0] counter_2,s1;
reg[1:0] counter_2,s1;
其次 case 语句中需要加
default: counter_2=2'bx;
否则会产生不必要的锁存器.
另外在load=0时,时钟上升沿会执行下面的语句,
s1=2'b01;
case(s1)
2'b01: s1=2'b10;
2'b10: s1=2'b11;
2'b11: s1=2'b01;
endcase
每次执行后,s1的值都是2,这个产生不了循环的.
我把你写的程序修改后贴给你,做过了时序的仿真.下次在问问题的时候要把你想要实现的功能写出来.
module state_t(clk_1Hz,enable,up_down,load,s_n,counter_2,s1);
input clk_1Hz;
input enable,up_down,load;
input [1:0]s_n;
output [1:0] counter_2,s1;
reg[1:0] counter_2,s1;
always@(posedge clk_1Hz )
begin
if(enable==1)
begin
if(load==1)
begin
counter_2=s_n;
if(up_down==1)
case(counter_2)
2'b01: counter_2=2'b10;
2'b10: counter_2=2'b11;
2'b11: counter_2=2'b01;
default: counter_2=2'bx;
endcase
else //(up_down==0)
case(counter_2)
2'b11: counter_2=2'b10;
2'b10: counter_2=2'b01;
2'b01: counter_2=2'b11;
default: counter_2=2'bx;
endcase
end
else // (load==0)
s1=2'b01;
case(s1)
2'b01: s1=2'b10;
2'b10: s1=2'b11;
2'b11: s1=2'b01;
default:s1=2'bx;
endcase
end
else //(enable==0)
counter_2=2'b00;
end
endmodule