1.四选一多路器
制作一个四选一的多路选择器,要求输出定义上为线网类型
状态转换:
d0 11
d1 10
d2 01
d3 00
`timescale 1ns/1ns
module mux4_1(
input [1:0] d1,d2,d3,d4,
input [1:0] sel,
output [1:0] mux_out
);
reg mux_out
always@(*)
case(sel)
2'b00:mux_out=d1;
2'b01:mux_out=d2;
2'b10:mux_out=d3;
2'b11:mux_out=d4;
endcase
end
endmodule
2.异步复位的串联T触发器
题目描述:
用verilog实现两个串联的异步复位的T触发器的逻辑,结构如图:
信号示意图:
波形示意图:
`timescale 1ns/1ns
module Tff_2 (
input wire data, clk, rst,
output reg q
);
//*************code***********//
reg data_1;
always @ (posedge clk or negedge rst) begin
if (!rst)
data_1 <= 1'b0;
else
data_1 <= data ^ data_1 ;
end
always @ (posedge clk or negedge rst) begin
if (!rst)
q <= 1'b0;
else
q <= data_1 ^ q;
end
//*************code***********//
endmodule
3.奇偶校验
题目描述:
在需要对输入的32位数据进行奇偶校验,根据sel输出校验结果(1输出奇校验,0输出偶校验)
信号示意图:
波形示意图:
`timescale 1ns/1ns
module odd_sel(
input [31:0] bus,
input sel,
output check
);
//*************code***********//
wire odd;
assign odd = ^bus;
assign check = sel?odd:~odd;
//*************code***********//
endmodule
4.移位运算与乘法
题目描述:
已知d为一个8位数,请在每个时钟周期分别输出该数乘1/3/7/8,并输出一个信号通知此时刻输入的d有效(d给出的信号的上升沿表示写入有效)
信号示意图:
波形示意图:
`timescale 1ns/1ns
module multi_sel(
input [7:0]d ,
input clk,
input rst,
output reg input_grant,
output reg [10:0]out
);
//*************code***********//
reg[1:0] state;
reg[7:0] d1;
always@ (posedge clk or negedge rst) begin
if(~rst) begin
input_grant <= 0; out <= 0; state <= 0; d1 <= 0;
end
else begin
if (input_grant == 1)
input_grant <= 0;
else input_grant <= input_grant;
case(state)
0://d乘1,用d1将d的值锁存进去
begin
out <= d;
d1 <= d;
input_grant <= 1;
state <= 1;
end
1://d乘3
begin
out <= d1 + {d1,1'b0};
state <= 2;
end
2://d乘7
begin
out <= d1 + {d1,1'b0} + {d1,2'b00};
state <= 3;
end
3://d乘8
begin
out <= {d1,3'b000};
state <= 0;
end
endcase
end
end
//*************code***********//
endmodule
5.位拆分与运算
题目描述:
现在输入了一个压缩的16位数据,其实际上包含了四个数据[3:0][7:4][11:8][15:12],现在请按照sel选择输出四个数据的相加结果,并输出valid_out信号(在不输出时候拉低)
0: 不输出且只有此时的输入有效
1:输出[3:0]+[7:4]
2:输出[3:0]+[11:8]
3:输出[3:0]+[15:12]
信号示意图:
波形示意图:
`timescale 1ns/1ns
module data_cal(
input clk,
input rst,
input [15:0]d,
input [1:0]sel,
output [4:0]out,
output validout
);
//*************code***********//
reg [15:0]data_temp;
always@(posedge clk or negedge rst)
if(!rst)begin
out<=5'd0;
validout<=1'b0;
data_temp<=15'd0;
end
else case(sel)
0:
begin
data_temp<=d;
out[4:0]<=5'd0;
validout<=1'b0;
end
1:
begin
validout<=1'b1;
out[4:0]<=data_temp[3:0]+data_temp[7:4];
end
2:
begin
validout<=1'b1;
out[4:0]<=data_temp[3:0]+data_temp[11:8];
end
3:
begin
validout<=1'b1;
out[4:0]<=data_temp[3:0]+data_temp[15:12];
end
default:
begin
validout<=1'b0;
out[4:0]<=5'd0;
end
endcase
//*************code***********//
endmodule