Verilog如何使用除法?
最近再用ISE做一个a/d转换器。做到显示的部分我的思路是这样的:用四个数码管显示一个X千X百X十X的一个数字,千位码是用这个数字除以1000,剩下的位原理类似,用除或者...
最近再用ISE做一个a/d转换器。做到显示的部分我的思路是这样的:
用四个数码管显示一个X千X百X十X的一个数字,
千位码是用这个数字除以1000,剩下的位原理类似,用除或者取余的语法来达成。
问题出现:编译时发生错误,除数只能用2的整次幂。
请问各位高手怎么办?
只有30分了,谢谢各位。 展开
用四个数码管显示一个X千X百X十X的一个数字,
千位码是用这个数字除以1000,剩下的位原理类似,用除或者取余的语法来达成。
问题出现:编译时发生错误,除数只能用2的整次幂。
请问各位高手怎么办?
只有30分了,谢谢各位。 展开
5个回答
2015-07-19 · 知道合伙人教育行家
关注
展开全部
应当调出使用ISE中的除法器的ip核,直接写除号不能综合,
在HDL中直接写乘除号都不能综合出电路的,那是留给访真用的语法。
Verilog HDL是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。 Verilog HDL和VHDL是世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。前者由Gateway Design Automation公司(该公司于1989年被Cadence公司收购)开发。两种HDL均为IEEE标准。
在HDL中直接写乘除号都不能综合出电路的,那是留给访真用的语法。
Verilog HDL是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。 Verilog HDL和VHDL是世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。前者由Gateway Design Automation公司(该公司于1989年被Cadence公司收购)开发。两种HDL均为IEEE标准。
展开全部
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版本太老的话
不知道你的除法是怎么做的
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版本太老的话
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
小白,应该调用ISE中的除法器的ip核,直接写除号不能综合.
在HDL中直接写乘除号都不能综合出电路的,那是留给访真用的语法
在HDL中直接写乘除号都不能综合出电路的,那是留给访真用的语法
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2015-07-27
展开全部
七段数码管直接译码就行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐于2016-07-20 · 知道合伙人教育行家
关注
展开全部
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 ******************/
基于减法的除法器的算法:
对于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 ******************/
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询