中易网

VERILOG中IF和CASE 语句的互换问题

答案:3  悬赏:70  
解决时间 2021-03-22 01:08
module state_machine(A,B,C,rst,clk,Z,W);

input [3:0] A,B,C;
input rst,clk;
output [5:0] Z;
wire [4:0] Y;
reg [5:0] Z;
wire [6:0] Y1,Y2;
output W;
reg W;
reg[1:0] CTRL;

adder adder1(.input1(A),.input2(B),.output1(Y));
adder adder2(.input1(Z),.input2(Y),.output1(Y1));
adder adder3(.input1(Z),.input2(C),.output1(Y2));

always@(posedge clk or negedge rst)
begin
if(rst==0)
begin
Z=6'b000000; //reset all outputs
CTRL <= 2'b00;
end
else
begin

if (CTRL==2'b00)
begin
Z <= 6'b000000;
W <= 1'b0;
CTRL <= CTRL+2'b01;
end

else if (CTRL==2'b01)
begin
Z = Y1;
W <= 1'b0;
CTRL <= CTRL+2'b01;
end

else if (CTRL==2'b10)
begin
Z = Y2;
W <= 1'b0;
if(Z>4*A)
CTRL <= 2'b11;
else
CTRL <= 2'b01;
end

else if(CTRL==2'b11)
begin
W <= 1'b1;
Z = Z;
CTRL <= 2'b11;
end
end
end
endmodule

想问一下如何把上面的IF ELSE语句改成CASE语句?我的程序如下,但是结果不对
module state_machine(A,B,C,rst,clk,Z,W);

input [3:0] A,B,C;
input rst,clk;
output [5:0] Z;
wire [4:0] Y;
reg [5:0] Z;
wire [5:0] Y1,Y2;
output W;
reg W;
reg[1:0] CTRL;

adder adder1(.input1(A),.input2(B),.output1(Y));
adder adder2(.input1(Z),.input2(Y),.output1(Y1));
adder adder3(.input1(Z),.input2(C),.output1(Y2));

always@(posedge clk or negedge rst)
begin
if(rst==0)
begin
Z=6'b000000; //reset all outputs
CTRL <= 2'b00;
end
end

always@(CTRL)
begin
case(CTRL)
2'b00:begin
Z <= 6'b000000;
W <= 1'b0;
CTRL <= CTRL+2'b01;
end

2'b01:begin
Z = Y1;
W <= 1'b0;
CTRL <= CTRL+2'b01;
end

2'b10:begin
Z = Y2;
W <= 1'b0;
if(Z>4*A)
CTRL <= 2'b11;
else
CTRL <= 2'b01;
end

2'b11:begin
W <= 1'b1;
Z = Z;
CTRL <= 2'b11;
end

default: begin
Z=6'b000000;
CTRL <= 2'b00;
end

endcase
end

endmodule
最佳答案
基本的语法都不通,非阻塞赋值是综合成寄存器的,需要在时钟的沿触发,不能写成组合逻辑。

另外每一个信号单独成块,不要合在一起写,难以定位
全部回答
always @(en or din) if(en) case(din) 8'b
always@(posedge clk or negedge rst) begin if(rst==0) begin Z=6'b000000; //reset all outputs CTRL <= 2'b00; end else case(CTRL) 2'b00:begin Z <= 6'b000000; W <= 1'b0; CTRL <= CTRL+2'b01; end 2'b01:begin Z = Y1; W <= 1'b0; CTRL <= CTRL+2'b01; end 2'b10:begin Z = Y2; W <= 1'b0; if(Z>4*A) CTRL <= 2'b11; else CTRL <= 2'b01; end 2'b11:begin W <= 1'b1; Z = Z; CTRL <= 2'b11; end default: begin Z=6'b000000; CTRL <= 2'b00; end end endcase 我也是初学者,不知道这样行不行。 另外楼上说:“另外每一个信号单独成块,不要合在一起写,难以定位”具体什么意思,能详细说说吗
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
如果自己租住的地方死过人,或者有脏东西我想
广藿香入煎剂后下的意思
哪里的杉木板材价格最低
在赵姓后面加两个字,加什么好听,顺口。是男
巧用修辞作文开头怎么可以写好?
在物理中玻璃杯被震碎说明声可以什么
苏州金阊新城首套房证明在哪里开,请大神们帮
黄钻充错了,充成QQ会员了,怎么办?
细菌都有哪些
胆小害怕传销怎么办
丐底是什么意思
请问韩国自助餐的口味怎么样?有吃过的么?
湄潭有哪些会计师事务所
人体有哪些部位是独一无二的?
上海利真汽车咨询公司怎么样
推荐资讯
包修期和三包有效期的区别
西华大学的西华学院怎么考?
女的内裤穿反原因
对南方大蟑螂最有效的蟑螂药
现在泪沟填充多少钱
预收账款和递延收益有什么区别?
唐山大地震评价
吃了过期十天的豆腐有关系吗
买异地二手摩托车怎么过户
张大兴和刘苏?
金庸古龙琼瑶还谁
济宁交运集团海天物流(杨厂村东南)怎么去啊,
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?