CHA 发表于 2010-6-28 00:31:49

二进制转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

HDL 发表于 2010-6-28 02:23:19

帮你了,我也不懂哈

ups 发表于 2010-6-28 04:05:21

晕,网络问题哦,怎么回了2次<br>
<br>
[ 本帖最后由 fanghj 于 2006-4-17 12:58 编辑 ]

CHAN 发表于 2010-6-28 05:17:31

eoc作为输出端口(output)一般不在always模块中做使能信号使用吧,可以试一试inout定义,但一般不这么处理,再想一想电路逻辑哈,还有代码最好分行写,注意风格,看起来容易些:)

interi 发表于 2010-6-28 06:50:08

原帖由 m1t2f3 于 2006-4-17 17:27 发表<br>
eoc作为输出端口(output)一般不在always模块中做使能信号使用吧,可以试一试inout定义,但一般不这么处理,再想一想电路逻辑哈,还有代码最好分行写,注意风格,看起来容易些:) 的确是这样的!output作为使能端是不好的!个人觉得应该有一个和eoc差不多的input信号来控制,而eoc应作为一个应答信号

interi 发表于 2010-6-28 08:05:42

兄弟,你的代码实在是~~,建议你不要用阻塞赋值方式,容易产生竞争&冒险。<br>
你是作软件出身的吧?<br>
<br>
[ 本帖最后由 alpha406 于 2006-4-18 10:08 编辑 ]

ngtim 发表于 2010-6-28 09:56:15

输出作为使能反馈回来是一条伪路径吧。<br>
问题是没有初始激励。器件的初始状态是什么呢?器件永远符合在if(cin_buf&gt;=jianshu)这个条件,因为都等于0。<br>
if(i==3'b000)那一行里,为什么cout_buf=cin_buf?是不是可以不要。<br>
<br>
[ 本帖最后由 xiaoyanxue 于 2006-6-8 17:56 编辑 ]

usd 发表于 2010-6-28 10:09:13

这是什么代码

CTT 发表于 2010-6-28 10:48:03

本帖最后由 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&lt;=0;
else dout&lt;=doutr;

always@(posedge clk)
for(i=0;i&lt;=31,i=i+1)
begin if(i&gt;31)
    begin
      i&lt;=0;
      if(j&gt;9)j&lt;=0;
      else begin
       j&lt;=j+1;
       if(mid&gt;width)
       doutr[(j&lt;&lt;2)+3:j&lt;&lt;2]&lt;=mid-eidth;
       else doutr[(j&lt;&lt;2)+3:j&lt;&lt;2]&lt;=mid;
       end
   end
else if(mid&lt;width)begin
      mid&lt;=mid;
      mid&lt;=din;
      end
else begin
      mid&lt;=mid-width;
      mid&lt;=din;
   end
end
自己慢慢看

interig 发表于 2010-6-28 11:21:25

学习了<br>
还不错
页: [1] 2
查看完整版本: 二进制转bcd码仿真问题?出来的bcd码总是0!