verilog学习记(加法器)


【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】  


    编程语言,光看书其实作用不大的,关键还需要自己进行实践。看书的时候,你觉得自己明白了、弄懂了,等到用modelsim实践的时候还是会出现这样那样的问题。因此,还是希望自己能够不断地训练和练习,这样可以达到熟能生巧的程度。就今天的加法器来说,其实内容还是比较简单的。主要就是数值和进位之间的关系。这些内容在计算机组成原理上面都会提到,关键是自己是否真正掌握。闲话不多说,可以编写一个verilog代码试试。

module add(a, b, in, c, out);

	input a;
	input b;
	input in;
	output c;
	output out;
	
	assign {out, c} = a + b + in;
endmodule
    这里直接用数据流的形式解决。当然,大家可以根据自己的情况选择门电路编写也是可以的,毕竟条条大路通罗马嘛。不多说,继续编写testbench文件,

`timescale 1ns/1ns

module count_t;
  
  reg clk;
  reg a;
  reg b;
  reg in;
  wire c;
  wire out;
  
  add process(a, b, in, c, out);
  
  initial
      clk = 0;
  always  
      forever  #5 clk = ~clk;
  
  initial
  begin
        a = 0; b = 0; in = 0;
        #10  a = 0; b = 0; in = 1;
        #10  a = 0; b = 1; in = 0;
        #10  a = 0; b = 1; in = 1;
        #10  a = 1; b = 0; in = 0;
        #10  a = 1; b = 0; in = 1;
        #10  a = 1; b = 1; in = 0;
        #10  a = 1; b = 1; in = 1;
 
 end   
      
  initial
  begin
      #200 $finish;
  end   
      
  initial
    $monitor(" out = %d, c = %d\n", out, c);
  
endmodule
    我们知道,两个数字相加,此时如果还有进位信息的话,那么就会出现8种情况。如果大家不觉得烦的话,可以把这8种情况都测试一遍。当然如果不想看波形,直接用minitor打印出来也是可以的。




你可能感兴趣的:(verilog学习记(加法器))