为了账号安全,请及时绑定邮箱和手机立即绑定

求助高手帮帮帮小白的verilog吧,下面内容总是报错,请问该怎么解决?

求助高手帮帮帮小白的verilog吧,下面内容总是报错,请问该怎么解决?

module traffic_light(ncr,cp,en,r1,r2,r3,l1,l2,l3);input ncr,cp;input [1:0]en;output r1,r2,r3,l1,l2,l3;reg r1,r2,r3,l1,l2,l3;reg [1:0] current_state1,next_state1,current_state2,next_state2;parameter normal=2'b00,stop=2'b01,left=2'b10,right=2'b11;always /*beginr1=0;r2=0;r3=0;l1=0;l2=0;l3=0;end*/case(en)normal:begin {r1,r2,r3,l1,l2,l3}={0,0,0,0,0,0}; endstop:beginalways@(cp)if(~ncr) {r1,r2,r3,l1,l2,l3}={0,0,0,0,0,0};else if (cp){r1,r2,r3,l1,l2,l3}={1,1,1,1,1,1};else {r1,r2,r3,l1,l2,l3}={0,0,0,0,0,0};endleft:beginalways @(posedge cp)beginif(~ncr) {r1,r2,r3,l1,l2,l3}={0,0,0,0,0,0};s1=00;elsecurrent_state1=next_state1;endalways@(current_state1)begincase(current_state1) 2’b00:{l1,l2,l3}={1,0,0};next_state1=2’b01;2’b01:{l1,l2,l3}={1,1,0};next_state1=2’b10;2’b10:{l1,l2,l3}={1,1,1};next_state1=2’b11;2’b11: {l1,l2,l3}={0,0,0};next_state1=2’b00;endcaseendright:beginalways @(posedge cp)beginif(~ncr) {r1,r2,r3,l1,l2,l3}={0,0,0,0,0,0};s1=00;elsecurrent_state2=next_state2;endalways@(current_state2)begincase(current_state2) 2’b00:{r1,r2,r3}={1,0,0};next_state2=2’b01;2’b01:{r1,r2,r3}={1,1,0};next_state2=2’b10;2’b10:{r1,r2,r3}={1,1,1};next_state2=2’b11;2’b11: {r1,r2,r3}={0,0,0};next_state2=2’b00;endcaseendendmodule
查看完整描述

2 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

你对于verilog的写法有很多不符合规范的
比如你的状态机在left:begin end之后接了一个时序逻辑然后又判断right;
比如你进入状态之后还在进行时序判断;
比如你的
case(current_state1)
2’b00:{l1,l2,l3}={1,0,0};next_state1=2’b01;
2’b01:{l1,l2,l3}={1,1,0};next_state1=2’b10;
2’b10:{l1,l2,l3}={1,1,1};next_state1=2’b11;
2’b11: {l1,l2,l3}={0,0,0};next_state1=2’b00;
endcase
这段程序里面,同一个状态下的两条语句需要加begin end括起来用;

建议:1、看一下状态机的写法,分为一段,两段,三段式的,建议二段或者三段式写法,容易规划,别人看也容易些
2、写verilog要记得,你写的东西就是电路,在脑袋里面要有电路的概念;
3、建议先看下成熟的verilog程序,看下别人怎么组织语言的

查看完整回答
反对 回复 2022-01-10
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

太乱了,怎么把always写到case里了?always块里怎么能嵌套always呢?状态机的状态跳一般这样写:
always @(posedge clk or negedge rst_n)
if(!rst_n)
cureent_state<=normal;
else
cureent_state<=next_state;
然后再写状态机主体;
always @(posedge clk or negedge rst_n)
if(!rst_n)
……
……
else
case(en)
normal: begin
.........
next_state<=stop;
end
stop: begin
.........
next_state<=left;
end
left:
...。。。。
。。。。



查看完整回答
反对 回复 2022-01-10
  • 2 回答
  • 0 关注
  • 278 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号