题目要求:实现8位的并行数据转换为串行的数据。
题目分析:并行转串行,只要把每个输入按从高到低的顺序输出即可。即每个时钟脉冲输出一个数据。但是下面的代码有一个的问题,不能解决在8为数据串行输出的过程当中如果又有一个并行的输入数据输入,没有做到缓冲处理。也许这个缓冲处理可以在调用此模块时在外部实现吧。
功能代码:
module para_to_serial_8bit(para_in,clock,reset,ser_out);
input [7:0] para_in;
input reset,clock;
output ser_out;
reg ser_out;
reg [7:0] data;
always@(posedge clock or negedge reset) begin
if(~reset) begin
ser_out <= 1'b0;
data <= para_in;
end
else begin
data <= {data[6:0],data[7]};
ser_out <= data[7];
end
end
endmodule
测试代码:
module test_para_to_ser;
reg [7:0] para_in;
reg clock,reset;
wire out;
para_to_serial_8bit f1(.para_in(para_in),.clock(clock),.reset(reset),.ser_out(out));
initial
$monitor($time,\"in_8bit
= %b,reset= %b,ser_out= %b,data=%b\
initial begin
clock = 1'b0;
reset = 1'b0;
#3 reset = 1'b1;
#300 $stop;
end
initial
para_in = 8'b1010_0100;
always
#5clock = ~clock;
endmodule
测试结果:
测试波形如下:
作业二
题目要求:实现8位的串行数据转换为并行的数据。
题目分析:8位串行数据转换为并行数据,需要一个模为8的计数器,当计到8个时钟脉冲时,把之前的8个数据全部输出,然后从新接收。
功能模块代码:
模8计数器:
module counter_mod_8(clock,reset,Q);
input clock; //posedge effective
input reset; // negedge effective
output [2:0] Q;
reg [2:0] Q;
always@(posedge clock or negedge reset) begin
if(~reset)
Q <= 3'd0;
else
Q <= Q + 1;
end
endmodule
串转并模块:
module ser_to_par_8bit(ser_in,clk,rst,out);
input ser_in,clk,rst;
output [7:0] out;
wire [7:0] out;
reg [7:0] par_out;
wire [2:0] count;
counter_mod_8 f1(.clock(clk),.reset(rst),.Q(count));
always@(posedge clk or negedge rst) begin
if(~rst)
par_out <= 8'b0000_0000;
else begin
par_out <= {par_out[6:0],ser_in};
end
end
assign out = (count == 7)? par_out : 8'b0000_0000;
endmodule
测试模块代码:
module test_ser_par;
reg [7:0] data;
wire data_in;
reg clock, reset;
wire [7:0] out;
initial begin
clock = 1'b0;
reset = 1'b0;
#3 reset = 1'b1;
data = 8'b1001_1101;
#300 $stop;
end
always
#5clock = ~clock;
always@(posedge clock)
data ={data[6:0],data[7]};
assign data_in = data[7];
ser_to_par_8bit a(.ser_in(data_in),.clk(clock),.rst(reset),.out(out));
initial
$monitor($time,\"reset= %b,data= %b,data_in= %b,out= %b\n,out);
endmodule
测试结果:
测试波形:
作业三 题目:可变模计数器,当控制信号为1时,模值为16,当控制信号为0是模值为32。
功能模块代码:
// contr = 1 mod =16; contr =0 mod =32
module count_mod_chg(clk,reset,contr,Q);
input clk,reset,contr;
output [4:0] Q;
reg [4:0] Q;
wire [4:0] last;
assign last =(contr ? 5'b01111:5'b11111);
always@(posedge clk or negedge reset) begin
if(~reset || Q == last)
Q <= 5'b00000;
else
Q = Q + 1;
end
endmodule
测试模块代码:
module test_count_mod_chg;
reg clock,reset;
reg control;
wire [4:0] out;
count_mod_chg counter1(.clk(clock),.reset(reset),.contr(control),.Q(out));
initial
$monitor($time,\"reset= %b,control= %b,out= %b\
initial begin
clock = 1'b0;
forever #5 clock = ~clock;
end
initial begin
reset = 1'b0;
#5reset = 1'b1;
end
initial begin
control = 1;
#200 control = 0;
end
endmodule
测试结果:
仿真波形如下
因篇幅问题不能全部显示,请点此查看更多更全内容