lcytms
发表于 2016-11-15 22:29:16
pre_shift预移位操作子模块,代码如下。
module pre_shift (d4in, d4out);
input d4in;
output d4out;
assign d4out = (d4in > 4) ? d4in + 4'd3 : d4in; //如果大于四,则加三,否则不变。
// always @ (*)
// begin
// if (d4in > 4)
// begin
// d4out = d4in + 3;
// end
// else
// begin
// d4out = d4in;
// end
// end
endmodule
lcytms
发表于 2016-11-15 22:32:27
新建顶层模块top.v,将b2bcd模块和bcd2b模块置入其中进行例化。
module top (din, dout);
input din;
output dout;
wire data;
b2bcd b2bcd (.din(din), .dout(data));
bcd2b bcd2b (.din(data), .dout(dout));
endmodule
lcytms
发表于 2016-11-15 22:35:00
本帖最后由 lcytms 于 2016-11-15 22:37 编辑
编写Testbench模块
Testbench模块top_tb.v文件如下:
`timescale 1ns/1ps
module top_tb;
reg din;
wire dout;
integer i;
top dut (.din(din), .dout(dout));
initial
begin
din = 0;
for (i=0; i<= 999999; i=i+1) #10 din = i;
#100 $stop;
end
endmodule
lcytms
发表于 2016-11-15 22:36:39
仿真运行结果
设置好仿真之后,可以看到仿真结果。
此时将二进制部分的数据格式设置为无符号数Unsigned,将BCD部分的数据格式设置为十六进制数Hexadecimal。
可以看到两种不同码制的数据保持了完全一致。
lcytms
发表于 2016-11-15 22:40:26
用第二种方法实现BCD转二进制之后,我们来用第三种方法实现。
根据实现原理,改写bcd2b.v代码如下。
其中包含十进位子模块power10.v。
module bcd2b (din, dout);
input din;
output dout;
wire data ;
assign data = {20'b0, din};
// operation power10 : ab = a*10 + b
power10 s1 (.datain(data), .dataout(data));
power10 s2 (.datain(data), .dataout(data));
power10 s3 (.datain(data), .dataout(data));
power10 s4 (.datain(data), .dataout(data));
power10 s5 (.datain(data), .dataout(data));
power10 s6 (.datain(data), .dataout(data));
assign dout = data;
// assign dout = din // BCD0
// + (din<<3) + (din<<1) // BCD1, 10=8+2
// + (din<<6) + (din<<5) + (din<<2) // BCD2, 100=64+32+4
// + (din<<10) - (din<<4) - (din<<3) // BCD3, 1000=1024-16-8
// // BCD4, 10000 = 16*625 = 8192+2048-256+16
// + (din<<13) + (din<<11) - (din<<8) + (din<<4)
// // BCD5, 100000 = 32*3125 = 32*(2048+1024+32+16+4+1) = 65536+32768+1024+512+128+32
// + (din<<16) + (din<<15) + (din<<10)
// + (din<<9) + (din<<7) + (din<<5);
endmodule
lcytms
发表于 2016-11-15 22:42:23
新建十进位子模块power10.v。
power10.v模块代码如下。
module power10 (datain, dataout);
input datain;
output dataout;
wire data;
assign dataout = (datain<<3) + (datain<<1) + datain; // BCD1*10 + BCD0
assign dataout = {datain, datain};
endmodule
lcytms
发表于 2016-11-15 22:43:06
仿真运行结果
重新运行仿真之后,可以看到仿真结果。
此时将二进制部分的数据格式设置为无符号数Unsigned,将BCD部分的数据格式设置为十六进制数Hexadecimal。
可以看到两种不同码制的数据保持了完全一致。
lcytms
发表于 2016-11-15 22:45:22
查看RTL视图——bcd2b.v
顶层模块b2bcd.v的视图如下所示。可以看到6个子步power10十进位模块逐次递进的一个结果。
lcytms
发表于 2016-11-15 22:46:54
查看RTL视图——power10十进位子模块shift.v
power10十进位子模块power10.v的RTL视图如下。
lcytms
发表于 2016-11-15 22:47:23
好了,今天的课程就讲到这里。
通过今天的课程,我们学习了BCD转二进制的基本原理,并对BCD转二进制逻辑电路进行了建模、仿真,结合上一讲的二进制转BCD一起编写一个演示逻辑,进行了仿真检查。
希望大家掌握BCD转二进制的基本原理,并熟练运用Verilog语言编写相关逻辑。
更复杂的知识和技巧我们将逐步通过后面的课程展现给大家。
课程到此结束,谢谢大家的关注!