[求助] Verilog

1520415739   2016-11-8 10:35 楼主
谁有Verilog设计的ALU例子,给我一个(不要从网上复制的)

回复评论 (2)

  1. /*                                                          设计思路                                                        */
  2. //分成两个模块来设计:control_decoder(即控制信号产生模块),根据相应的条件产生控制信号ALU_control
  3. //                                                                                ALU_out(即运算模块),根据产生的控制信号来进行相应的运算,需要在模块里面调用control_decoder模块(即例化),
  4. //                                         将control_decoder模块产生的控制信号送到ALU_out模块,将两个模块连起来。这样在写Testbench的时候只需要调用例化ALU_out模块即可
  5. //                                         也可以不再ALU_out模块里面调用control_decoder模块,在写Testbench的时候将两个模块都例化,在用到ALU整体的时候把两个模块都调用(即例化)
  6. `timescale 1ns/100ps
  7. module control_decoder(ALU_op,Func,ALU_control);
  8.         input wire [1:0] ALU_op;
  9.         input wire [5:0] Func;
  10.   reg [2:0] ALU_control_reg;  //中间变量
  11.         output wire [2:0] ALU_control;  //输出控制信号
  12.        
  13.         parameter Add = 3'b010,Subtract = 3'b110,And = 3'b000,Or = 3'b001,SLT = 3'b111;
  14.         parameter S0 = 6'b100_000,S1 = 6'b100_010,S2 = 6'b100_100,S3 = 6'b100_101,S4 = 6'b101_010;
  15.         parameter s0 = 2'b00,s1 = 2'b01,s2 = 2'b10;
  16.        
  17.         always @(ALU_op or Func)
  18.                 begin
  19.                   case(ALU_op)
  20.                           s0:
  21.                                   ALU_control_reg <= Add;       
  22.                           s1:
  23.                                   ALU_control_reg <= Subtract;
  24.                           s2:
  25.                                   begin
  26.                                           case(Func)
  27.                                           S0:
  28.                                                   ALU_control_reg <= Add;
  29.                                           S1:
  30.                                                   ALU_control_reg <= Subtract;
  31.                                           S2:
  32.                                                   ALU_control_reg <= And;
  33.                                           S3:
  34.                                                   ALU_control_reg <= Or;
  35.                                           S4:
  36.                                                   ALU_control_reg <= SLT;
  37.                                     endcase
  38.                                   end
  39.                   endcase
  40.                 end
  41.        
  42.         assign ALU_control = ALU_control_reg;
  43.        
  44. endmodule


  45. `timescale 1ns/100ps
  46. module ALU_out(A,B,ALU_op_out,Func_in,Y,Zero);
  47.         input wire [31:0] A;
  48.         input wire [31:0] B;
  49.        
  50.         input [1:0] ALU_op_out; //这两个信号必须在端口声明里面进行定义,作为这个模块的输入
  51.         input [5:0] Func_in;   
  52.        
  53.   reg[31:0] Y_reg;//中间变量
  54.   
  55.   output wire [31:0] Y;  //ALU输出信号
  56.   output wire Zero; //零值信号
  57.        
  58.         wire [1:0] ALU_op_out;     
  59.         wire [5:0] Func_in;
  60.         wire [2:0] ALU_control_out;
  61.        
  62.         parameter s0 = 3'b000,s1 = 3'b010,s2= 3'b110,s3 = 3'b001,s4 = 3'b111;
  63.         //             与            加         减          或          SLT
  64.         control_decoder control_decoder_out(.ALU_op(ALU_op_out),.Func(Func_in),.ALU_control(ALU_control_out));
  65.        
  66.         always @(A or B or ALU_control_out)  //这里的敏感条件必须把ALU_control_out加上,否则最后输出会有问题!!!!!!!!!!!
  67.                 begin
  68.                         case(ALU_control_out)
  69.                                 s0:
  70.                                         Y_reg <= A&B;
  71.                                 s1:
  72.                                         Y_reg <= A+B;
  73.                                 s2:
  74.                                         Y_reg <= A-B;
  75.                                 s3:
  76.                                         Y_reg <= A|B;
  77.                                 s4:
  78.                                         Y_reg <= A<B ? 32'b1 : 32'b0;   //SLT
  79.                   endcase
  80.                 end
  81.                
  82.         assign Y = Y_reg;
  83.         assign Zero = (A==B);
  84. endmodule


  85. `timescale 1ns/100ps
  86. module ALU_out_tb();
  87.         reg [31:0] A_tb,B_tb;
  88.         reg [1:0] ALU_op_tb;
  89.         reg [5:0] Func_tb;
  90.        
  91.         wire [31:0] Y_tb;
  92.         wire Zero_tb;
  93.        
  94.         ALU_out ALU_tb(.A(A_tb),.B(B_tb),.ALU_op_out(ALU_op_tb),.Func_in(Func_tb),.Y(Y_tb),.Zero(Zero_tb));
  95.        
  96.         initial
  97.                 begin
  98.                         A_tb <= 9;  
  99.                         B_tb <= 1;
  100.                         ALU_op_tb <= 2'b00;    //加  10  1010
  101.                         Func_tb <= 6'b100000;
  102.                         #2;
  103.                        
  104.                         A_tb <= 9;
  105.                         B_tb <= 1;
  106.                         ALU_op_tb <= 2'b01;   //减   8  1000
  107.                         Func_tb <= 6'b100000;
  108.                         #2;
  109.                        
  110.                         A_tb <= 9;
  111.                         B_tb <= 1;
  112.                         ALU_op_tb <= 2'b10;  //加    10  1010
  113.                         Func_tb <= 6'b100000;
  114.                         #2;
  115.                        
  116.                         A_tb <= 9;
  117.                         B_tb <= 1;
  118.                         ALU_op_tb <= 2'b10;  //减    8  1000
  119.                         Func_tb <= 6'b100010;
  120.                         #2;
  121.                        
  122.                         A_tb <= 9;
  123.                         B_tb <= 1;
  124.                         ALU_op_tb <= 2'b10;  //与     1   0001
  125.                         Func_tb <= 6'b100100;
  126.                         #2;
  127.                        
  128.                         A_tb <= 9;
  129.                         B_tb <= 1;
  130.                         ALU_op_tb <= 2'b10;   //或   9   1001
  131.                         Func_tb <= 6'b100101;
  132.                         #2;
  133.                        
  134.                         A_tb <= 9;
  135.                         B_tb <= 1;
  136.                         ALU_op_tb <= 2'b10;    //SLT   0  0000
  137.                         Func_tb <= 6'b101010;
  138.                         #2;
  139.                        
  140.                         #100 $stop;  //使仿真停止,若没有死循环的话这句话可加可不加
  141.                 end
  142.                
  143. endmodule
点赞  2016-11-15 17:54
好像有点乱了,很久之前写的,看到就拿过来了,希望对你有帮助
点赞  2016-11-15 17:55
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复