打印

初学verilog,感觉遇到逻辑电路力不从心!

[复制链接]
1647|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
编了求最大公约数的代码,刚开始想用组合逻辑电路构造,编了半个小时,搞不出来啊,各种问题,无奈还是引入时钟,嗨。。。。是我太笨了吗?求大神指点啊,为啥有的组合逻辑这么难编呢?有什么好的方法吗?下面是代码,欢迎各位批评指点哈
module gys (clk,rst,a, b, out);

input [4:0] a, b;
input rst,clk;

output [4:0] out;
reg [4:0] out;
reg [4:0] A, B, swap;
reg done;

always @(posedge clk)
begin
if(!rst)
begin
  done = 0;
  A = a;
  B = b;
  end
else if( A < B && !done )
   begin
    swap =  A;
    A = B;
    B = swap;
   end
   else if (B )
    A = A - B;
   else
   begin
    done = 1;
    out  = A;
  end
end

endmodule

相关帖子

沙发
GoldSunMonkey| | 2013-3-8 21:12 | 只看该作者
这个引不引时钟和功能无关。

这个用组合逻辑应该能够实现。

你这个是成功的代码么?

使用特权

评论回复
板凳
黑暗小y|  楼主 | 2013-3-8 21:27 | 只看该作者
GoldSunMonkey 发表于 2013-3-8 21:12
这个引不引时钟和功能无关。

这个用组合逻辑应该能够实现。

猴哥,是的,这个仿真过了,我就是刚开始不想用时钟,想用纯组合逻辑的,把脑子都像炸了,也没编好。。。。

使用特权

评论回复
地板
GoldSunMonkey| | 2013-3-8 21:33 | 只看该作者
那应该是敏感列表没有设好啊

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
黑暗小y + 1 赞一个!
5
XiaoWei369| | 2013-3-8 22:36 | 只看该作者
按照猴哥的搞定了么??

使用特权

评论回复
6
resxpl| | 2013-3-9 00:02 | 只看该作者
本帖最后由 GoldSunMonkey 于 2013-3-9 21:53 编辑

module math1(num, den, res);
parameter N = 8;

input [N-1 : 0] num, den;
output [N-1 : 0] res;

reg [N-1 : 0] res;

reg [N-1 : 0] den_buf[N : 0], rem_buf[N : 0];
reg [N-1 : 0] num_buf;
integer i1, i2, i3;

always @(num, den) begin
  i1 = 0;
  repeat(N + 1) begin
   if(i1 <= N) begin
    num_buf = 0;
    for(i3 = N-1; i3 >= 0; i3 = i3 - 1) begin
     if({num_buf, num[i3]} >= {'b0, den}) begin
      num_buf = {num_buf[N-2 : 0], num[i3]} - den;
     end
     else begin
      num_buf = {num_buf[N-2 : 0], num[i3]};
     end
    end
    rem_buf[0] = num_buf;
    den_buf[0] = den;
    den_buf[1] = rem_buf[0];
   
    for(i2 = 1; i2 <= N; i2 = i2 + 1) begin
     num_buf = 0;
     for(i3 = N-1; i3 >= 0; i3 = i3 - 1) begin
      if({num_buf, den_buf[i2 - 1][i3]} >= {'b0, den_buf[i2]}) begin
       num_buf = {num_buf[N-2 : 0], den_buf[i2 - 1][i3]} - den_buf[i2];
      end
      else begin
       num_buf = {num_buf[N-2 : 0], den_buf[i2 - 1][i3]};
      end
     end
     rem_buf[i2] = num_buf;
     if(i2 < N) begin
      den_buf[i2 + 1] = rem_buf[i2];
     end
    end
   
    if(rem_buf[i1] == 0) begin
     res = den_buf[i1];
     i1 = N + 1;
    end
    else begin
     i1 = i1 + 1;
    end
   end
  end
end

endmodule
   
测试:
15,  6:  最大公约数是3
12, 30:  最大公约数是6
255, 130: 最大公约数是5


:lol

使用特权

评论回复
评分
参与人数 1威望 +10 收起 理由
GoldSunMonkey + 10 很给力!
7
resxpl| | 2013-3-9 14:36 | 只看该作者
本帖最后由 resxpl 于 2013-3-9 14:45 编辑

只是这个组合逻辑太复杂了, 频率有点低.

使用特权

评论回复
8
utopiaworld| | 2013-3-9 14:37 | 只看该作者
拿verilog当c语言了,一开始就来个这么复杂的东东

使用特权

评论回复
9
GoldSunMonkey| | 2013-3-9 21:53 | 只看该作者
resxpl 发表于 2013-3-9 00:02
module math1(num, den, res);
parameter N = 8;

兄弟。感谢啊

使用特权

评论回复
10
黑暗小y|  楼主 | 2013-3-9 22:44 | 只看该作者
resxpl 发表于 2013-3-9 00:02
module math1(num, den, res);
parameter N = 8;

谢谢大神了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

15

帖子

0

粉丝