二进制转bcd码仿真问题?出来的bcd码总是0!
本帖最后由 fpgaw 于 2010-6-29 05:13 编辑二进制转bcd码仿真问题?出来的bcd码总是0!
//二进制转bcd码
//clk是系统时钟,load输入为高时表示有输入待转的二进制数,
//eoc为1时输出,为0时不输出且表示处于运算中
//cout为输出
//cin为输入
module encode_bcd(clk,load,cin,cout,eoc);
input clk,load;
input cin;
output cout;
output eoc;
reg cout,cout_buffer,jianshu,cin_buffer;//jianshu:减数
reg eoc;
reg i;
reg wei_buffer;
always @(posedge clk)
begin
if(eoc==1) //eoc=1时输出,eoc=1且load=1是表示计算完成且有输入,进行初始化
begin
cout=cout_buffer;
if(load==1)
begin jianshu=10000000;cin_buffer=cin;i=3'b111;wei_buffer=4'b0000;cout_buffer=0;eoc=1'b0;end
//初始化
end
else
begin
if(cin_buffer>=jianshu)begin cin_buffer=cin_buffer-jianshu;wei_buffer=wei_buffer+1;end
else
begin
{cout_buffer,cout_buffer,cout_buffer,cout_buffer}=wei_buffer;
wei_buffer=4'b0000;
i=i-1;
case(i)
3'b111:jianshu=10000000;
3'b110:jianshu=1000000;
3'b101:jianshu=100000;
3'b100:jianshu=10000;
3'b011:jianshu=1000;
3'b010:jianshu=100;
3'b001:jianshu=10;
3'b000:jianshu=10000000;
endcase
if(i==3'b000)begin cout_buffer=cin_buffer;eoc=1'b1;end
end
end
end
endmodule 帮你了,我也不懂哈 晕,网络问题哦,怎么回了2次<br>
<br>
[ 本帖最后由 fanghj 于 2006-4-17 12:58 编辑 ] eoc作为输出端口(output)一般不在always模块中做使能信号使用吧,可以试一试inout定义,但一般不这么处理,再想一想电路逻辑哈,还有代码最好分行写,注意风格,看起来容易些:) 原帖由 m1t2f3 于 2006-4-17 17:27 发表<br>
eoc作为输出端口(output)一般不在always模块中做使能信号使用吧,可以试一试inout定义,但一般不这么处理,再想一想电路逻辑哈,还有代码最好分行写,注意风格,看起来容易些:) 的确是这样的!output作为使能端是不好的!个人觉得应该有一个和eoc差不多的input信号来控制,而eoc应作为一个应答信号 兄弟,你的代码实在是~~,建议你不要用阻塞赋值方式,容易产生竞争&冒险。<br>
你是作软件出身的吧?<br>
<br>
[ 本帖最后由 alpha406 于 2006-4-18 10:08 编辑 ] 输出作为使能反馈回来是一条伪路径吧。<br>
问题是没有初始激励。器件的初始状态是什么呢?器件永远符合在if(cin_buf>=jianshu)这个条件,因为都等于0。<br>
if(i==3'b000)那一行里,为什么cout_buf=cin_buf?是不是可以不要。<br>
<br>
[ 本帖最后由 xiaoyanxue 于 2006-6-8 17:56 编辑 ] 这是什么代码 本帖最后由 fpgaw 于 2010-6-29 05:14 编辑
我试了一下兄台的程序。发现兄台你真的有点乱。
以下是我给你更正的程序.我仿真过了,pass.
module dinary_bcd(
clk,
rst,
din,
dout);
parameter width=10;
input clk,rst;
inputdin;
output regdout;
regmid;
regdinr;
regdoutr;
integer i=0,j=0;
always@(posedge clk or negedge rst)
if(~rst)dout<=0;
else dout<=doutr;
always@(posedge clk)
for(i=0;i<=31,i=i+1)
begin if(i>31)
begin
i<=0;
if(j>9)j<=0;
else begin
j<=j+1;
if(mid>width)
doutr[(j<<2)+3:j<<2]<=mid-eidth;
else doutr[(j<<2)+3:j<<2]<=mid;
end
end
else if(mid<width)begin
mid<=mid;
mid<=din;
end
else begin
mid<=mid-width;
mid<=din;
end
end
自己慢慢看 学习了<br>
还不错
页:
[1]
2