用Verilog编写时,可以可以利用if语句调用模块

用verilog写一个程序,然后在顶层有一个模式选择的过程,通过选择调用其它子模块,但是老是报错
always@ (posedge CP)
begin
if(Mode==4'b0001)
M1 U1(Stateout,SecondH,SecondL,EN,nCR,S,Fin,Shin);
else if(Mode==4'b0010)
M2 U2(Stateout,SecondH,SecondL,EN,nCR,S,Fin,Shin);
else if(Mode==4'b0011)
M3 U3(Stateout,SecondH,SecondL,EN,nCR,S,Fin,Shin);

else if(Mode==4'b0100)
M4 U4(Stateout,SecondH,SecondL,EN,nCR,S,Fin,Shin);
else if(Mode==4'b0101)
M5 U5(Stateout,SecondH,SecondL,EN,nCR,S,Fin,Shin);
else
begin
Stateout<=0;
Modeout<=0;
SecondH<=0;
SecondL<=0;
end

end

错误:
Error (10170): Verilog HDL syntax error at main.v(55) near text "U1"; expecting "<=", or "="
Error (10170): Verilog HDL syntax error at main.v(56) near text "else"; expecting "end"

不知道如何是好

第1个回答  推荐于2018-05-10
这个思路是错误的
调用其它子模块,不能有IF CASE等

思路是,把MODE变成模块M1 的输入本回答被网友采纳
第2个回答  2016-06-12
你的M1是什么鬼,函数,还是任务?最好把源码文件传上来。追问

M1是另一个模块的名字,现在在上课

追答

兄弟,模块是不能例在 if语句里面的啊!!!!!

用Verilog编写时,可以可以利用if语句调用模块
调用其它子模块,不能有IF CASE等 思路是,把MODE变成模块M1 的输入

verilog的for循环里可以用if吗?
首先是可以的,不过在verilog里面不能跟软件那样,for循环的话就是直接把for循环里面的逻辑复制n份n你说的就是最大值,然后每份都会检测这个if的条件。所以你发现i是需要计数到最大值的。另外就是你现在这个写法不一定可综合,应该需要在for前面加generate 然后最后加endgenerate。

verilog中的if-else-if
verilog中的if-else-if条件语句是用来确定是否执行该块中语句的工具。若if或else部分包含多条语句,需用begin和end括起来。硬件实现方面,if没有else时,表示不满足if内部表达式的任何条件时,值保持不变。每当d或en的值变化时,输出q都会更新。if带有else时,输出q在时钟的上升沿,若rstn为高,则获得...

verilog的if语句问题
if 不能这么用,一般的情况下必须写在一个过程赋值模块中。比如:reg b;always@(a)begin if(a==0)b = 1;else b =0;end 或者用一个连续赋值 比如:wire b;assign b = (a)?0:1;这两种方法都可以满足你要的逻辑

verilog代码中,关于if…else语句是门级原始结构语句嘛?
在 Verilog 中,if...else 语句通常被用于模块、函数或任务中,用于根据条件执行不同的代码块。例如:```module example(input a, output reg b);always @ (a)begin if (a == 1'b1) \/\/ 如果 a 等于 1 b <= 1'b0; \/\/ 则 b 赋值为 0 else b <= 1'b1;...

Verilog语言 if 语句
int2;3)if(表达式1)语句1;else if(表达式2) 语句2;else if(表达式3) 语句3;………...else if(表达式m) 语句m;else 语句n;条件语句必须在过程块语句中是用(initial和always语句),除了这两个语句引导的bedin end块中可以编写条件语句外,模块中的其他地方都不能编写。

Verilog语言中,令输出时钟clk等于输入时钟clk2,,为什么加上if模块可...
always@(posedge clk2) 内部是不能有assign语句的,你加上if那段话事实上是把assign那一句放到额always@(posedge clk2)的外面去了,因为你的always后面没有用begin end括起来,所以默认紧跟always的那一句(也就是if,如果if删掉了就是assign那一句)是隶属always块的。如果你改成:always@(posedge clk...

verilog的if语句问题
1.如果是阻塞赋值,如果不写ELSE,那么综合成的就是latch,数值会保持。但是编译不会出错 2.如果是非阻塞赋值,那么不写ELSE,默认数值保持,综合成REG。但是需要根据你的电路功能是否确定数值需要保持

verilog中if的判断语句可以写(posedge 某信号)吗?
不能那么写。send_start比较长打一拍就行了 reg send_start_d;always@(posedge CLK_SP)send_start_d <= send_start;这样上升沿可以写成 if(send_start_d == 1'd0 && send_start == 1'd1)就是上一拍还是0这一拍是1我们就认为他是上升沿了 ...

关于Verilog语言的问题
首先,不能在多个进程中对同一个信号赋值,这会引起竞争。编译也会出错。其次,尽量使用IF嵌套,保证任意时刻只有一个IF语句对目标赋值。或者使用CASE语句。如果使用了多个IF语句并列,只会再最后一个IF语句对目标赋值。望采纳

相似回答