【HDLBits习题 2】Circuit - Sequential Logic(4)More Circuits

发布于:2025-07-12 ⋅ 阅读:(16) ⋅ 点赞:(0)

1. Rule90(Rule 90)

方法1:

module top_module (
    output 	reg	[511:0]	q,
    input 				clk,
    input 				load,
    input 		[511:0] data
); 
    integer i;
    
    always @(posedge clk) begin
        if (load == 1'b1) begin
            q <= data;
        end else begin
            for (i=0; i<$bits(q); i=i+1) begin
                if (i == 0) begin
                    q[0]	<= q[1];
                end else if (i == 511) begin
                    q[511] 	<= q[510];
                end else begin
                    q[i] 	<= q[i+1]^q[i-1];
                end
            end
        end
    end
endmodule

方法2:

        根据首位两端的部分计算式:

                q[0]        = q[1]    ^    1'b0

                q[1]        = q[2]    ^    q[0]

                        ...

                q[510]    = q[511]    ^    q[509]

                q[511]    =  1'b0      ^    q[510]

可以得出实际用于计算的范围。对于一个n-bit的值q,其计算范围如下所示:

                q = { 1'b0, q[n: 1] }  ^  { q[n-1: 0], 1'b0 };

对于本题,其计算范围则如下所示:

                q = { 1'b0, q[511: 1] }  ^  { q[510: 0], 1'b0 };

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

2. Rule110(Rule 110)

module top_module (
    output 	reg	[511:0]	q,
    input 				clk,
    input 				load,
    input 		[511:0] data
); 
    wire [511:0] q_left, q_right;
    
    always @(posedge clk) begin
        if (load == 1'b1) begin
            q <= data;
        end else begin
            q <= (q_left ^ q_right) | (q_left & q & ~q_right);
        end
    end
    
    assign q_left	= {1'b0, q[511:1]};
    assign q_right	= {q[510:0], 1'b0};
endmodule

3. Conwaylife(Conway's Game of Life 16x16)


网站公告

今日签到

点亮在社区的每一天
去签到