目录
13.3 Left/right arithmetic shift by 1 or 8
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