HDLbits答案8-Counters&Shift Registers&More Circuits

目录

12 Counters

12.1 Four-bit binary counter

12.2 Decade counter

12.3 Decade counter again

12.4 Slow decade counter

12.5 Counter 1-12

12.6 Counter 1000

12.7 4-digit decimal counter

12.8 12-hour clock

13 Shift Registers

13.1 4-bit shift register

13.2 Left/right rotator

13.3 Left/right arithmetic shift by 1 or 8

13.4 5-bit LFSR

13.5 3-bit LFSR

13.6 32-bit LFSP

13.7 Shift register

13.8 Shift register

13.9 3-input LUT

14 More Circuits

14.1 Rule 90

14.2 Rule 110

14.3 Conway's Game of Life 16*16

12 Counters

12.1 Four-bit binary counter

module top_module
	(
		input clk,
		input reset,
		output [3:0]q
	);
	
	always@(posedge clk)
		if(reset)
			q <= 4'b0000;
		else if(q == 4'b1111)
			q <= 4'b0000;
		else
			q <= q+1'b1;
		
	
endmodule
	

12.2 Decade counter

module top_module
	(
		input clk,
		input reset,
		output [3:0]q
	);
	
	always@(posedge clk)
		if(reset)
			q <= 4'b0000;
		else if(q == 4'b1001)
			q <= 4'b0000;
		else
			q <= q+1'b1;
		
	
endmodule
	

12.3 Decade counter again

module top_module
	(
		input clk,
		input reset,
		output [3:0]q
	);
	
	always@(posedge clk)
		if(reset)
			q <= 4'b0001;
		else if(q == 4'b1010)
			q <= 4'b0001;
		else
			q <= q+1'b1;
		
	
endmodule
	

12.4 Slow decade counter

module top_module
	(
		input clk,
		input reset,slowena,
		output [3:0]q
	);
	
	
	always@(posedge clk)begin
		if(reset)
			q <= 4'b0000;
		else if(slowena)
			if(q < 4'b1001)
				q  <= q + 1'b1;
			else
				q <= 4'b0;
		else
			q <= q;
				
		end
	
endmodule
	

12.5 Counter 1-12

module top_module
	(
		input clk,reset,enable,
		output [3:0]Q,c_d,
		output c_enable,c_load
	);
	
	assign c_enable = enable;
	
	assign c_d = 4'b1;
	
	assign c_load = ((Q == 4'd12) & enable) | reset ;
	
	
	count4 u_count4(
		.clk(clk),
		.enable(c_enable),
		.load(c_load),
		.d(c_d),
		.Q(Q)
	);
	
	
endmodule
	

12.6 Counter 1000

module top_module (
    input clk,
    input reset,
    output OneHertz,
    output wire [2:0] c_enable
); 
	
	wire [11:0]Q;
	
	assign c_enable[0] = 1'b1;
	assign c_enable[1] = (Q[3:0]==4'h9);
	assign c_enable[2] = (Q[7:0]==8'h99);
	assign OneHertz = (Q[11:0]==12'h999);

    bcdcount counter0(
		.clk(clk),
		.reset(reset),
		.enable(c_enable[0]),
		.Q(Q[3:0])
	 );
    bcdcount counter1(
		.clk(clk),
		.reset(reset),
		.enable(c_enable[1]),
		.Q(Q[7:4])
		);
	 bcdcount counter2(
		.clk(clk),
		.reset(reset),
		.enable(c_enable[2]),
		.Q(Q[11:8])
		);
		
endmodule

12.7 4-digit decimal counter

module top_module (
    input clk,
    input reset,
    output [3:1]ena,
    output [15:0]q
); 
	
	bcdcount u1(
		.clk(clk),
		.reset(reset),
		.ena(1'b1),
		.q(q[3:0])
		);
	bcdcount u2(
		.clk(clk),
		.reset(reset),
		.ena(ena[1]),
		.q(q[7:4])
		);
	bcdcount u3(
		.clk(clk),
		.reset(reset),
		.ena(ena[2]),
		.q(q[11:8])
		);
	bcdcount u4(
		.clk(clk),
		.reset(reset),
		.ena(ena[3]),
		.q(q[15:12])
		);
	
	assign ena = {(q[11:0]==12'h999),(q[7:0]==8'h99),(q[3:0]==4'h9)};
endmodule


module bcdcount(
	input clk,
	input reset,
	input ena,
	output [3:0]q
	);
	
	always @(posedge clk)
		if(reset)
			q <= 4'b0;
		else if(ena)begin
			if(q == 4'd9)
				q <= 4'b0;
			else
				q <= q + 1'b1;
		end
		else
			q <= q;
endmodule

12.8 12-hour clock

module top_module (
    input clk,
    input reset,
    input ena,
    output pm,
	 output [7:0]ss,hh,mm
); 
	
	wire [4:0]enable;
	wire [7:0]hh1;
	
	assign enable[0] = (ena && ss[3:0]==4'd9);
	assign enable[1] = (enable[0] && ss[7:4]==4'd5);
	assign enable[2] = (enable[1] && mm[3:0]==4'd9);
	assign enable[3] = (enable[2] && mm[7:4]==4'd5);
	assign enable[4] = (enable[3] && hh1[3:0]==4'hb);
	
	
	assign pm = (hh1[7:4]==4'b1);
	assign hh = (hh1[3:0] == 4'b0) ? 8'h12 : ((hh1[3:0]>4'h9) ? ({4'h1,hh1[3:0]-4'ha}) : ({4'h0,hh1[3:0]}));
	
	bcdcount 
		#(.START(4'b0),
		  .END(4'd9))
		u1(
		.clk(clk),
		.reset(reset),
		.ena(ena),
		.q(ss[3:0])
		);
		
	bcdcount 
		#(.START(4'b0),
		  .END(4'd5))
		u2(
		.clk(clk),
		.reset(reset),
		.ena(enable[0]),
		.q(ss[7:4])
		);
	
	bcdcount 
		#(.START(4'b0),
		  .END(4'd9))
		u3(
		.clk(clk),
		.reset(reset),
		.ena(enable[1]),
		.q(mm[3:0])
		);
	bcdcount 
		#(.START(4'b0),
		  .END(4'd5))
		u4(
		.clk(clk),
		.reset(reset),
		.ena(enable[2]),
		.q(mm[7:4])
		);
	
	bcdcount 
		#(.START(4'b0),
		  .END(4'hb))
		u5(
		.clk(clk),
		.reset(reset),
		.ena(enable[3]),
		.q(hh1[3:0])
		);
	
	bcdcount 
		#(.START(4'b0),
		  .END(4'd1))
		u6(
		.clk(clk),
		.reset(reset),
		.ena(enable[4]),
		.q(hh1[7:4])
		);
		
	
endmodule


module bcdcount(
	input clk,
	input reset,
	input ena,
	output [3:0]q
	);
	
	parameter START = 4'b0,
				 END = 4'd9;
	always @(posedge clk)
		if(reset)
			q <= START;
		else if(ena)begin
			if(q == END)
				q <= START;
			else
				q <= q + 1'b1;
		end
		else
			q <= q;
endmodule

13 Shift Registers

13.1 4-bit shift register

module top_module (
    input clk,
    input areset,
    input load,
    input ena,
	 input [3:0]data,
	 output reg [3:0]q
	); 
	
	always@(posedge clk or posedge areset)begin
		if(areset)
			q <= 4'b0000;
		else begin
			if(load)
				q <= data;
			else if(ena)
				q <= {4'b0,q[3:1]};
			
		end
	end
	
	
	
	
endmodule



13.2 Left/right rotator

module top_module (
    input clk,
    input load,
    input [1:0]ena,
	 input [99:0]data,
	 output reg [99:0]q
	); 
	
	always@(posedge clk)
		if(load)
			q <= data;
		else if(ena == 2'b01)
			q <= {q[0],q[99:1]};
		else if(ena == 2'b10)
			q <= {q[98:0],q[99]};
		else
			q <= q;
			
	
	
	
endmodule



13.3 Left/right arithmetic shift by 1 or 8

module top_module (
    input clk,
    input load,
    input ena,
	 input [1:0]amount,
	 input [63:0]data,
	 output reg [63:0]q
	); 
	
	always@(posedge clk)
		if(load)
			q <= data;
		else if(ena)begin
			if(amount == 2'b00)
				q <= {q[62:0],1'b0};
			else if(amount == 2'b01)
				q <= {q[55:0],8'b0};
			else if(amount == 2'b10)
				q <= {q[63],q[63:1]};
			else if(amount == 2'b11)
				q <= {{8{q[63]}},q[63:8]};
		end
	
	
	
endmodule



逻辑移位:移位产生的空位由0来补充;

算术移位:算术左移和逻辑左移一样;

         逻辑右移:1.左边产生的空位由0补充;2.左边产生的空位由符号位来补充;

13.4 5-bit LFSR

module top_module (
    input clk,
    input reset,
	 output reg [4:0]q
	); 
	
	always@(posedge clk)
		if(reset)
			q <= 5'h1;
		else 
			q <= {{q[0] ^ 1'b0},q[4],{q[3]^q[0]},q[2],q[1]};
	
	
endmodule



13.5 3-bit LFSR

module top_module (
    input [2:0]SW,
    input [1:0]KEY,
	 output [2:0]LEDR
	); 
	
	
	mux_dff u1(
		.clk(KEY[0]),
		.L(KEY[1]),
		.r_in(SW[0]),
		.q_in(LEDR[2]),
		.Q(LEDR[0])
		);
	mux_dff u2(
		.clk(KEY[0]),
		.L(KEY[1]),
		.r_in(SW[1]),
		.q_in(LEDR[0]),
		.Q(LEDR[1])
		);
	mux_dff u3(
		.clk(KEY[0]),
		.L(KEY[1]),
		.r_in(SW[2]),
		.q_in(LEDR[1]^LEDR[2]),
		.Q(LEDR[2])
		);
	
endmodule


module mux_dff(
	input clk,
	input L,
	input r_in,
	input q_in,
	output reg Q
	);

	
	always@(posedge clk)
		Q <= L ? r_in : q_in;
	
	
endmodule
	

13.6 32-bit LFSP

module top_module (
    input clk,
    input reset,
	 output [31:0]q
	); 
	
	always@(posedge clk)
		if(reset)
			q <= 32'h1;
		else
			q <= {{q[0]^1'b0},q[31],q[30],q[29],q[28],q[27],q[26],q[25],q[24],q[23],{q[0]^q[22]},q[21],q[20],q[19],q[18],q[17],q[16],q[15],q[14],q[13],q[12],q[11],q[10],q[9],q[8],q[7],q[6],q[5],q[4],q[3],{q[0]^q[2]},{q[0]^q[1]}};
	
	
	
endmodule



	

13.7 Shift register

module top_module (
    input clk,
    input resetn,
	 input in,
	 output out
	); 
	
	wire q1,q2,q3;
	
	shift u1(
		.clk(clk),
		.resetn(resetn),
		.in(in),
		.q(q1)
		);
			
	shift u2(
		.clk(clk),
		.resetn(resetn),
		.in(q1),
		.q(q2)
		);

	shift u3(
		.clk(clk),
		.resetn(resetn),
		.in(q2),
		.q(q3)
		);		
	
	shift u4(
		.clk(clk),
		.resetn(resetn),
		.in(q3),
		.q(out)
		);

endmodule


module shift(
	input clk,
	input in,
	input resetn,
	output q
	);

always @(posedge clk)
	if(!resetn)
		q <= 1'b0;
	else
		q <= in;
endmodule
	
	

13.8 Shift register

module top_module (
    input [3:0]SW,
    input [3:0]KEY,
	 output [3:0]LEDR
	); 
	
	mux_dff u0(
		.clk(KEY[0]),
		.w(KEY[3]),
		.L(KEY[2]),
		.E(KEY[1]),
		.R(SW[3]),
		.Q(LEDR[3])
		);
	mux_dff u1(
		.clk(KEY[0]),
		.w(LEDR[3]),
		.L(KEY[2]),
		.E(KEY[1]),
		.R(SW[2]),
		.Q(LEDR[2])
		);
	mux_dff u2(
		.clk(KEY[0]),
		.w(LEDR[2]),
		.L(KEY[2]),
		.E(KEY[1]),
		.R(SW[1]),
		.Q(LEDR[1])
		);
	mux_dff u3(
		.clk(KEY[0]),
		.w(LEDR[1]),
		.L(KEY[2]),
		.E(KEY[1]),
		.R(SW[0]),
		.Q(LEDR[0])
		);
endmodule


module mux_dff
	(
		input clk,w,R,E,L,
		output reg Q 
	);
	
	always@(posedge clk)begin
		
		Q <= (L ? R : (E ? w : Q));
	
	
	end
endmodule



	

13.9 3-input LUT

module top_module (
    input clk,
    input enable,
	 input S,
	 input A,B,C,
	 output Z
	); 
	reg [7:0]Q;
	
	always @(posedge clk)
		if(enable)
			Q <= {Q[6:0],S};
		else
			Q <= Q;
	
	assign Z = Q[{A,B,C}];
endmodule

14 More Circuits

14.1 Rule 90

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

14.2 Rule 110

module top_module (
    input clk,
    input load,
	 input [511:0]data,
	 output [511:0]q
	);
	
	always @(posedge clk)
		if(load)
			q <= data;
		else
			q <= ~{1'b0,q[511:1]}&{q[510:0],1'b0} | q&~{q[510:0],1'b0} | {1'b0,q[511:1]}&~q&{q[510:0],1'b0};
			
endmodule

有没有大佬帮忙解释这种写法为啥报错

只是卡诺图的另外一种写法。。。。

module top_module (
    input clk,
    input load,
	 input [511:0]data,
	 output [511:0]q
	);
	
	always @(posedge clk)
		if(load)
			q <= data;
		else
			q <= q&~{1'b0,q[511:1]} | ~{q[510:0],1'b0}&{1'b0,q[511:1]} | {q[510:0],1b0}&~q&{1'b0,q[511:1]};
			
endmodule

14.3 Conway's Game of Life 16*16

module top_module (
    input clk,
    input load,
	 input [255:0]data,
	 output [255:0]q
	);
	integer i,j;
	reg [3:0]cnt;
	
	always @(posedge clk)begin
		if(load)
			q <= data;
		else begin
			for(i=0;i<256;i=i+1)begin
				if(i==0)
					cnt = q[1]+q[16]+q[15]+q[31]+q[240]+q[255]+q[17]+q[241];
				else if(i == 15)
					cnt = q[14]+q[30]+q[0]+q[255]+q[16]+q[31]+q[240]+q[254];
				else if(i == 240)
					cnt = q[224]+q[225]+q[239]+q[241]+q[15]+q[255]+q[0]+q[1];
				else if(i == 255)
					cnt = q[254]+q[15]+q[14]+q[240]+q[239]+q[238]+q[0]+q[224];
				else if(i >0 && i<15)
					cnt = q[i-1]+q[i+1]+q[16+i]+q[15+i]+q[17+i]+q[240+i]+q[239+i]+q[241+i];
				else if(i>240 && i<255)
					cnt = q[i-16]+q[i-15]+q[i-17]+q[i-1]+q[i+1]+q[i-240]+q[i-241]+q[i-239];
				else if(i%16 == 0 && (i!=0)&&(i!=240))
					cnt = q[i+1]+q[i+16]+q[i-16]+q[i-15]+q[i+17]+q[i+15]+q[i-1]+q[i+31];
				else if(i%16 == 15 && (i!=15)&&(i!=255))
					cnt = q[i-1]+q[i+1]+q[i-16]+q[i-15]+q[i-17]+q[i+15]+q[i-31]+q[i+16];
				else
					cnt = q[i-1]+q[i+1]+q[i+16]+q[i-16]+q[i-15]+q[i-17]+q[i+15]+q[i+17];
			case(cnt)
				4'd0,5'd1:q[i]<=1'b0;
				4'd2:q[i]<=q[i];
				4'd3:q[i]<=1'b1;
				default:q[i]<=1'b0;
			endcase
			end
		end
	end
endmodule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值