logo资料库

verilog__串并转换.doc

第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
资料共9页,剩余部分请下载后查看
Verilog 作业 姓名:zzz 班級: zzzz 學號:zzzz 報告日期:2010年10月30日
作业 题目要求:实现 8 位的并行数据转换为串行的数据。 题目分析:并行转串行,只要把每个输入按从高到低的顺序输出即可。即每个时 钟脉冲输出一个数据。但是下面的代码有一个的问题,不能解决在 8 为数据串行 输出的过程当中如果又有一个并行的输入数据输入,没有做到缓冲处理。也许这 个缓冲处理可以在调用此模块时在外部实现吧。 功能代码: module para_to_serial_8bit(para_in,clock,reset,ser_out); para_in; input [7:0] 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; begin end else 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",para_in,reset,out,f1.data); 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); //posedge effective input clock; 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] reg [7:0] wire [2:0] out; par_out; 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",reset,data,data_in,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 wire [4:0] Q; [4:0] last; last =(contr ? 5'b01111:5'b11111); assign 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; clock,reset; reg control; reg 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",reset,control,out); 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 测试结果:
分享到:
收藏