GCD Verilog

网上找的,不过编译有重定义问题,还有时序是无限的,用一些仿真工具会出现无法load dump问题,改了改,用作以后参考

// Code your testbench here
// or browse Examples
module find_gcd
  (
    input      [7 : 0] data_a,
    input      [7 : 0] data_b,
    input              clk,
    input              rst_n,
    output reg         gcd_valid,
    output reg [7 : 0] gcd,
//------------<temporary output>-----------------
    output     reg [2 : 0]        current_state,
    output     reg [7 : 0]        buffer_a,
    output     reg [7 : 0]        buffer_b
  );
  localparam IDLE  = 3'b000,
             COMP  = 3'b001,
             CALC1 = 3'b010,
             CALC2 = 3'b011,
             RESU  = 3'b100;

  reg [7 : 0] r, t;
              //buffer_a, buffer_b;
  reg [2 : 0] next_state;//current_state, 

  always@(posedge clk or negedge rst_n)
  begin
    if(!rst_n)
      current_state <= IDLE;
    else
      current_state <= next_state;
  end

  always@(*)
  begin
    case(current_state)
      IDLE: begin
            gcd_valid = 0;
            gcd = 0;
            buffer_a = data_a;
            buffer_b = data_b;
            next_state = COMP;
            end
      COMP: begin
            if (buffer_a < buffer_b) begin
              r = buffer_a;
              buffer_a = buffer_b;
              buffer_b = r;
            end
              next_state = CALC1;
            end
      CALC1: begin
             t = buffer_a % buffer_b;
             buffer_a = buffer_b;
             buffer_b = t;
             if(buffer_b)
               next_state = CALC2;
             else
               next_state = RESU;
             end
      CALC2: begin
             t = buffer_a % buffer_b;
             buffer_a = buffer_b;
             buffer_b = t;
             if(buffer_b)
               next_state = CALC1;
             else
               next_state = RESU;
             end
      RESU: begin
            gcd = buffer_a;
            gcd_valid = 1;
            next_state = IDLE;
            end
      default: gcd = 0;
    endcase
  end

endmodule

`timescale 1ns / 1ps

module tb_gcd;
  reg clk, rst_n;
  reg [7 : 0] data_a, data_b;
  wire [7 : 0] gcd;
  wire valid;
  wire [2 : 0] current_state;
  wire [7 : 0] buffer_a, buffer_b;
  find_gcd f1
  (
    .clk(clk),
    .rst_n(rst_n),
    .data_a(data_a),
    .data_b(data_b),
    .gcd(gcd),
    .gcd_valid(valid),
    .current_state(current_state),
    .buffer_a(buffer_a),
    .buffer_b(buffer_b)
  );
  int count =0;
  initial begin
    $dumpfile("dump.vcd"); 
    clk = 0;
    rst_n = 0;
    @(negedge clk) rst_n = 1;
      data_a = 8'd15;
      data_b = 8'd24;
    @(negedge valid)
      data_a = 8'd9;
      data_b = 8'd7;
    @(negedge valid)
      data_a = 8'd27;
      data_b = 8'd81;
  end

  always begin
    #1 clk = ~clk;
    $dumpvars;
    count++;
    if (count>100)
      $finish;
  end

endmodule
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值