Verilog如何使用除法?

最近再用ISE做一个a/d转换器。做到显示的部分我的思路是这样的:用四个数码管显示一个X千X百X十X的一个数字,千位码是用这个数字除以1000,剩下的位原理类似,用除或者... 最近再用ISE做一个a/d转换器。做到显示的部分我的思路是这样的:
用四个数码管显示一个X千X百X十X的一个数字,
千位码是用这个数字除以1000,剩下的位原理类似,用除或者取余的语法来达成。
问题出现:编译时发生错误,除数只能用2的整次幂。
请问各位高手怎么办?
只有30分了,谢谢各位。
展开
 我来答
杨柳风83
2015-07-19 · 知道合伙人教育行家
杨柳风83
知道合伙人教育行家
采纳数:4976 获赞数:114076
2009年大学毕业,10年参加工作,在古浪县新堡初级中学教书

向TA提问 私信TA
展开全部
  应当调出使用ISE中的除法器的ip核,直接写除号不能综合,
  在HDL中直接写乘除号都不能综合出电路的,那是留给访真用的语法。
  Verilog HDL是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。 Verilog HDL和VHDL是世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。前者由Gateway Design Automation公司(该公司于1989年被Cadence公司收购)开发。两种HDL均为IEEE标准。
g4gryphon
2010-05-05 · TA获得超过648个赞
知道小有建树答主
回答量:187
采纳率:0%
帮助的人:164万
展开全部
1. 除数只能用2的整次幂,这个很奇怪,除法运算符"/"verilog是支持的
不知道你的除法是怎么做的

2. 还不行,换减法来做。
比如你的四位(千百十个)分别是A, B, C, D,都initial到 0
if input >= 1000
tmp = input -1000;
A = A+1;
if tmp >= 1000
tmp = tmp -1000;
A = A+1;
如果小于1000,就去减100。
这样写,代码量大,但是一定可以编译。
反正你的输入不会大过9999,代码多也不会太多。
用for循环会减少代码量,但可能编译有问题,如果你的ISE版本太老的话
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友8b4f99c91
推荐于2018-02-27 · TA获得超过378个赞
知道小有建树答主
回答量:201
采纳率:0%
帮助的人:156万
展开全部
小白,应该调用ISE中的除法器的ip核,直接写除号不能综合.
在HDL中直接写乘除号都不能综合出电路的,那是留给访真用的语法
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2015-07-27
展开全部
七段数码管直接译码就行
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友4327fcbb9b
推荐于2016-07-20 · 知道合伙人教育行家
百度网友4327fcbb9b
知道合伙人教育行家
采纳数:26425 获赞数:292062
从师范学校毕业后一直在现在单位工作

向TA提问 私信TA
展开全部
1、实现算法
基于减法的除法器的算法:
对于32的无符号除法,被除数a除以除数b,他们的商和余数一定不会超过32位。首先将a转换成高32位为0,低32位为a的temp_a。把b转换成高32位为b,低32位为0的temp_b。在每个周期开始时,先将temp_a左移一位,末尾补0,然后与b比较,是否大于b,是则temp_a减去temp_b将且加上1,否则继续往下执行。上面的移位、比较和减法(视具体情况而定)要执行32次,执行结束后temp_a的高32位即为余数,低32位即为商。

2、 verilog HDL代码

[html] view plaincopyprint?
/*
* module:div_rill
* file name:div_rill.v
* syn:yes
* author:network
* modify:rill
* date:2012-09-07
*/

module div_rill
(
input[31:0] a,
input[31:0] b,

output reg [31:0] yshang,
output reg [31:0] yyushu
);

reg[31:0] tempa;
reg[31:0] tempb;
reg[63:0] temp_a;
reg[63:0] temp_b;

integer i;

always @(a or b)
begin
tempa <= a;
tempb <= b;
end

always @(tempa or tempb)
begin
temp_a = {32'h00000000,tempa};
temp_b = {tempb,32'h00000000};
for(i = 0;i < 32;i = i + 1)
begin
temp_a = {temp_a[62:0],1'b0};
if(temp_a[63:32] >= tempb)
temp_a = temp_a - temp_b + 1'b1;
else
temp_a = temp_a;
end

yshang <= temp_a[31:0];
yyushu <= temp_a[63:32];
end

endmodule

/*************** EOF ******************/

3、 testbench代码

[html] view plaincopyprint?
/*
* module:div_rill_tb
* file name:div_rill_tb.v
* syn:no
* author:rill
* date:2012-09-07
*/

`timescale 1ns/1ns

module div_rill_tb;

reg [31:0] a;
reg [31:0] b;
wire [31:0] yshang;
wire [31:0] yyushu;

initial
begin
#10 a = $random()%10000;
b = $random()%1000;

#100 a = $random()%1000;
b = $random()%100;

#100 a = $random()%100;
b = $random()%10;

#1000 $stop;
end

div_rill DIV_RILL
(
.a (a),
.b (b),

.yshang (yshang),
.yyushu (yyushu)
);

endmodule
/******** EOF ******************/
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式