reaction100 发表于 2013-2-16 10:17:12

Quartus II中使用Verilog,不同位宽赋值,怎样不出现warning?

本帖最后由 reaction100 于 2013-2-16 11:14 编辑

在Quartus II 中使用Verilog 模块:

module decodeHEX2BCD
(
    input a,
    output reg q1,//十位
    output reg q0   //个位
);

always @(*)
begin
    q1 = a / 4'd10;
    q0 = a % 4'd10;
end

endmodule


由于q1、q0是4位的,赋值语句右侧的结果是8位的,因此编译之后就会有两个warning:


虽然不影响使用,但是总不好看。
请问有什么方法可以去除warning么?

wye11083 发表于 2013-2-16 10:46:07

这模块理论上是不工作的,只能用于仿真。综合器是不会综合乘除法的。

reaction100 发表于 2013-2-16 11:04:04

本帖最后由 reaction100 于 2013-2-16 11:13 编辑

wye11083 发表于 2013-2-16 10:46 static/image/common/back.gif
这模块理论上是不工作的,只能用于仿真。综合器是不会综合乘除法的。

不是吧,这个可以综合的。我在开发板上试过。
用数码管显示一个2位数,其中有一个模块就是上面那个。
也许是Quartus的综合能力较强?

========

关键问题不是这个,除法换成其他语句(比如加法)也行。
我是想问,不同位宽的赋值,怎样不出现warning?

wangwenjia 发表于 2013-2-16 11:18:37

reg temp1;
reg temp0;

always @(*)
begin
    temp1<= a / 4'd10;
    temp0<= a % 4'd10;
end

always @(*)
begin
    q1<= temp1;
    q0<= temp0;
end


这样试下呢

reaction100 发表于 2013-2-16 11:20:43

wangwenjia 发表于 2013-2-16 11:18 static/image/common/back.gif
reg temp1;
reg temp0;



这个方法可以,已经没有warning了。
非常感谢。

hughqfb 发表于 2013-2-16 12:18:29

我的代码也经常出现这个问题,但是没想到去解决它,楼主细心! 问题是虽然解决了问题,但却多占用了两个寄存器资源。

reaction100 发表于 2013-2-16 15:22:23

本帖最后由 reaction100 于 2013-2-16 15:51 编辑

hughqfb 发表于 2013-2-16 12:18 static/image/common/back.gif
我的代码也经常出现这个问题,但是没想到去解决它,楼主细心! 问题是虽然解决了问题,但却多占用了两个寄 ...
temp0和temp1不需要多用寄存器,编译之后的报告显示使用的资源和原先一样。

4楼的写法中:
always @(*)
begin
    q1<= temp1;
    q0<= temp0;
end
always @(*)的写法是组合逻辑,不是时序逻辑。
两个“<=”改为“=”更合适。

hughqfb 发表于 2013-2-16 20:36:12

reaction100 发表于 2013-2-16 15:22 static/image/common/back.gif
temp0和temp1不需要多用寄存器,编译之后的报告显示使用的资源和原先一样。

4楼的写法中:


不能说是寄存器,应该是暂存器,呵呵。为什么“<="改为“=”合适呢?非阻塞赋值是在always(*)结束时才把值赋给左边的寄存器的。

我最近在用FPGA做毕业设计,希望多多交流!我的QQ:914166312

reaction100 发表于 2013-2-17 20:34:39

本帖最后由 reaction100 于 2013-2-17 20:38 编辑

hughqfb 发表于 2013-2-16 20:36 static/image/common/back.gif
不能说是寄存器,应该是暂存器,呵呵。为什么“

那啥,课本上说的……组合逻辑用“=”,时序逻辑用“<=”。
具体为啥我也说不上来,我也是新手
页: [1]
查看完整版本: Quartus II中使用Verilog,不同位宽赋值,怎样不出现warning?