首页 > 其他分享 >【HDLBits刷题笔记】12 More Circuits

【HDLBits刷题笔记】12 More Circuits

时间:2022-11-01 16:33:06浏览次数:94  
标签:load d15 12 HDLBits Circuits clk module input d1

Rule90

第一次见这东西有点莫名其妙,但是其实看懂了之后就是左移和右移相异或,注意这里使用的是逻辑右移,会自动补零,不能使用算数左移<<<。

module top_module(
    input clk,
    input load,
    input [511:0] data,
    output reg[511:0] q ); 
    always@(posedge clk)
    begin
        if(load)
            q <= data;
        else begin
            q <= (q<<1)^(q>>1);
        end
    end
endmodule

Rule110

Rule90可以直接根据Left和Right异或得到,而Rule110一定要三个值进行逻辑运算得到,可以画一个卡诺图并写出逻辑表达式并计算,当然不化简肯定也是可以的。

 

module top_module(
    input clk,
    input load,
    input [511:0] data,
    output reg[511:0] q
); 
    always@(posedge clk)
    begin
        if(load)
            q <= data;
        else begin
            q <= (q&~(q<<1))|(~(q>>1)&(q<<1))|(~q&(q<<1));
        end
    end
endmodule

 注意左移之后参与计算的是R,右移之后参与计算的是L,一开始搞反了想了很久。

Conwaylife

需要计算邻域1的个数,注意这里的边界比较复杂,每个点都有8个邻点,成一个环形结构。

 方法比较笨,就是把所有情况全部考虑一遍,注意以下几点:

1、verilog运算自动按位数最多的运算数来计算,所以计算下标时使用i-8'd15而不是i-15。

2、因为我想让循环数溢出,所以取的8位i。

网上查了一下,看了别人的做法,大致有以下几类:

1、和hdlbits提示的一样使用sv语法,使用二维数组,可以大大简化逻辑。

2、将矩阵拓展为18*18,从而减少情况的考虑。

module top_module(
    input clk,
    input load,
    input [255:0] data,
    output reg[255:0] q ); 
    
    reg [3:0]neig_cnt;
    reg [255:0] q_next;
    
    always@(posedge clk)
    begin
        if(load)
            q <= data;
        else begin
            q <= q_next;
        end
    end
    reg [15:0]loop;
    reg unsigned[7:0]i;
    always@(*)
    begin
        for(loop=0;loop<256;loop=loop+1)
        begin
            i=loop;
            if(i==255)//左上角
                neig_cnt = q[i-8'd15]+q[i+8'd1]+q[i+8'd16]+q[i+8'd15]+q[i-8'd1]+q[i-8'd17]+q[i-8'd16]+q[i-8'd31];
            else if(i==240)//右上角
                neig_cnt = q[i+8'd1]+q[i+8'd17]+q[i+8'd16]+q[i+8'd31]+q[i+8'd15]+q[i-8'd1]+q[i-8'd16]+q[i-8'd15];
            else if(i==15)//左下角
                neig_cnt = q[i-8'd15]+q[i+8'd1]+q[i+8'd16]+q[i+8'd15]+q[i-8'd1]+q[i-8'd17]+q[i-8'd16]+q[i-8'd31];
            else if(i==0)//右下角
                neig_cnt = q[i+8'd1]+q[i+8'd17]+q[i+8'd16]+q[i+8'd31]+q[i+8'd15]+q[i-8'd1]+q[i-8'd16]+q[i-8'd15];
            else if(i>240)//上方
                neig_cnt = q[i+8'd1]+q[i+8'd17]+q[i+8'd16]+q[i+8'd15]+q[i-8'd1]+q[i-8'd17]+q[i-8'd16]+q[i-8'd15];
            else if(i%16==15)//左方
                neig_cnt = q[i-8'd15]+q[i+8'd1]+q[i+8'd16]+q[i+8'd15]+q[i-8'd1]+q[i-8'd17]+q[i-8'd16]+q[i-8'd31];
            else if(i%16==0)//右方
                neig_cnt = q[i+8'd1]+q[i+8'd17]+q[i+8'd16]+q[i+8'd31]+q[i+8'd15]+q[i-8'd1]+q[i-8'd16]+q[i-8'd15];
            else if(i<15)//下方
                neig_cnt = q[i+8'd1]+q[i+8'd17]+q[i+8'd16]+q[i+8'd15]+q[i-8'd1]+q[i-8'd17]+q[i-8'd16]+q[i-8'd15];
            else//中间的点
                neig_cnt = q[i+8'd1]+q[i+8'd17]+q[i+8'd16]+q[i+8'd15]+q[i-8'd1]+q[i-8'd17]+q[i-8'd16]+q[i-8'd15];
            
            if(neig_cnt == 0||neig_cnt == 1)
                q_next[i] = 0;
            else if(neig_cnt == 2)
                q_next[i] = q[i];
            else if(neig_cnt == 3)
                q_next[i] = 1;
            else
                q_next[i] = 0;
        end 
    end
endmodule

看到题目最后John Conway因为COVID-19并发症去世了,有些感慨,RIP。

标签:load,d15,12,HDLBits,Circuits,clk,module,input,d1
From: https://www.cnblogs.com/magnolia666/p/16847263.html

相关文章

  • web服务器12 中间件函数
    //1,导入expressconstexpress=require('express')constapp=express()//3定义一个中间件//constmw=(req,res,next)=>{//console.log('中间件');//......
  • 基于51单片机的电压检测系统设计(#0412)
    电压、电流、功率是表征电信号能量大小的三个基本参量。在电子电路中,只要测量出其中一个参量就可以根据电路的阻抗求出其它二个参量。考虑到测量的方便性、安全性、准确性等......
  • 122. 买卖股票的最佳时机II
    给你一个整数数组prices,其中 prices[i]表示某支股票第i天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有一股股票。你也可以先......
  • 抗干扰LED数码管显示驱动控制电路(IC)-VK1S68C资料,SSOP24小体积 13×4/12×5/11×6/10
    产品品牌:永嘉微电/VINKA产品型号:VK1S68C封装形式:SSOP24概述:VK1S68C是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有3线串行接口、数据锁存器、LED......
  • STC32G12K128-CAN
    第二部分,因为需要和其他部件通过CAN进行交互,此处记录一下STC32-CAN驱动部分,毕竟是国产芯片,数据手册看起来非常方便。希望咱们国产芯片越做越好哈此处参考了芯片手册的例子......
  • AcWing 1221 四平方和
    \(AcWing\)\(1221\).四平方和+自定义排序(重载<)+二分一、题目大意四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多\(4\)如果把\(0\)包括进去,就正好可以表......
  • drools_12_lhs
    LHS(lefthandside)部分Drools作为规则引擎,最重要的功能就是完成patternmatch,即按照LHS对工作内存的fact进行匹配,老版Drools使用的匹配算法是RETE(读音[reete......
  • git checkout命令详解 git checkout feature/test123
    gitcheckout命令详解gitcheckoutfeature/test123//切换到feature/test123分支保证当前分支没有修改提交,否则回提示error:Yourlocalchangestothefollowing......
  • [LeetCode] 1293. Shortest Path in a Grid with Obstacles Elimination
    Youaregivenan mxn integermatrix grid whereeachcelliseither 0 (empty)or 1 (obstacle).Youcanmoveup,down,left,orrightfromandtoanem......
  • ANT+ 自行车车灯 数据页18页-主光的频道ID(0x12)
    数据页18应在ANT+控制器的请求下发送,并且可以选择性地包括在连接状态下作为从ANT+自行车灯广播的主要数据页之一。这个数据页允许控制器发现并连接到已经存在的网络,如5.2.2.......