Verilog语言if-else 的使用,在quartus中仿真出了问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Verilog语言if-else 的使用,在quartus中仿真出了问题相关的知识,希望对你有一定的参考价值。

always@(out_FourDn or out_ThreeDn or out_ThreeUp or out_TwoDn or out_TwoUp or out_OneUp)
if(out_FourDn)DownRequest<=(DownRequest | 4'b1000);
else
begin
if(out_ThreeDn)DownRequest<=(DownRequest | 4'b0100);
else
begin
if(out_ThreeUp)UpRequest<=(UpRequest | 4'b0100);
else
begin
if(out_TwoDn)DownRequest<=(DownRequest | 4'b0010);
else
begin
if(out_TwoUp)UpRequest<=(UpRequest | 4'b0010);
else
if(out_OneUp)UpRequest<=(UpRequest | 4'b0001);

end
end
end
end
在quartus中仿真UpRequest始终等于0111,DownRequest始终等于1110, 有谁知道是怎么回事吗?告知下,谢谢
QQ:837682861
(金钱5是全部家当了)

参考技术A 你没有告诉UpRequest和DownRequest的初始值设为多少。
貌似几个触发信号都曾出现1的值,因此,每一个条件语句都运行了一遍,而UpRequest初始值的首位肯定是0,DownRequest的初始值末位肯定是0,所以才会出现这种情况
参考技术B always@(out_FourDn or out_ThreeDn or out_ThreeUp or out_TwoDn or out_TwoUp or out_OneUp)
begin
if(out_FourDn)DownRequest<=(DownRequest | 4'b1000);
else if(out_ThreeDn)DownRequest<=(DownRequest | 4'b0100);
else if(out_ThreeUp)UpRequest<=(UpRequest | 4'b0100);
else if(out_TwoDn)DownRequest<=(DownRequest | 4'b0010);
else if(out_TwoUp)UpRequest<=(UpRequest | 4'b0010);
else if(out_OneUp)UpRequest<=(UpRequest | 4'b0001);
end
这回再试试
参考技术C 组合逻辑中不要使用非阻塞赋值,你这样综合的是LATCH
另外一个EVENT里只对一个信号进行描述
不要写点野路子的东西,可读性差

嵌入式一招规范Verilog的if...else语句

在做FPGA、CPLD时可以选择VHDL语言和Verilog语言,刚接触FPGA开发,VHDL和Verilog都简单的接触学习了一下。排除两者在功能实现、具体细节上的差异,作为经常使用C语言的人来说,Verilog语言在语法上显得更有亲和力。
Verilog支持if…else if…else…的判断语法结构,与C语言类似,且也支持判断语句嵌套,支持某判断分支下执行多条语句。虽然与C语言类似,但因为它没有大括号的说法,使得在书写较为复杂的逻辑时显得乱糟糟,看上去一头雾水。如在if…else if…else中再嵌套多层判断语句,且每个判断分支下存在多条语句。以C语言举一个例子,伪码如下:

if(condition1)

    state1;

else if(condition2)

    state2;
    state3;
    state4;

else

    state5;

以上逻辑放在Verilog中该怎么规范书写以达到期望的逻辑呢?答案很简单——以begin替代C语言中的左括号 、以end替代右括号。只有这样规范书写,才会最大限度的避免“奇怪的”逻辑错误,防止低级错误的出现。以上代码换做Verilog作如下书写:

if(condition1)
begin
    state1;
end
else if(condition2)
begin
    state2;
    state3;
    state4;
end
else
begin
    state5;
end

或者

if(condition1) begin
    state1;
end
else if(condition2) begin
    state2;
    state3;
    state4;
end
else begin
    state5;
end

一个好的习惯就是在写完if、else if、else后马上在后边加上begin和end,然后再在begin、end之中进行后续语句的填充。道理同C语言的写完if、else if、else马上打大括号一样。

以上是关于Verilog语言if-else 的使用,在quartus中仿真出了问题的主要内容,如果未能解决你的问题,请参考以下文章

verilog里边的if语句形式,求大神解释下图片中的

Verilog-2001新增特性

在Verilog中简单减法

verilog要用到的if else太多怎么办

verilog语言中任务和函数的区别

如何用verilog语言在fpga中实现双向数据总线?