热度 11
2017-10-22 20:10
5517 次阅读|
0 个评论
8bit 串进并出,并进串出 1、源代码 `timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 2017/10/22 18:09:21 // Design Name: // Module Name: shift // Project Name: // Target Devices: // Tool Versions: // Description: 8bit并进,1bit串出;1bit串进,8bit并出 // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module shift( input clk, input sft_clk, //移位时钟 input rst, input is_load, //加载数据信号 input data_in, //输入8bit并行数据 input sft_in, //1bit 串行输入 input sft_en, // 移位使能 output sft_out, // 1bit 串行输出 output data_out // 8bit 并行输出 ); reg data_temp; assign data_out = data_temp; assign sft_out = data_temp ; /* 数据从MSB开始移出,到串行输出; 在使能后,每个移位时钟上升沿,串行输入,不断从LSB往MSB */ always @(posedge clk)begin if(!rst) data_temp = 0; else if(is_load) data_temp = data_in; //加载数据 else if(sft_clk)begin //移位时钟上升沿移位 if(sft_en) data_temp = {data_temp ,sft_in}; end end endmodule RTL 视图 仿真代码 `timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 2017/10/22 19:01:06 // Design Name: // Module Name: simu // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module simu( ); reg clk; reg sft_clk; reg rst; reg is_load; reg data_in; reg sft_in; reg sft_en; wire sft_out; wire data_out; shift inst( .clk(clk), .sft_clk(sft_clk), .rst(rst), .is_load(is_load), .data_in(data_in), .sft_in(sft_in), .sft_en(sft_en), .sft_out(sft_out), .data_out(data_out) ); initial begin clk = 0; sft_clk = 0; rst = 0; is_load = 0; data_in = 0; sft_in = 0; sft_en = 0; #10 clk = ~clk; #10 clk = ~clk; #10 clk = ~clk; rst = 1; //复位完成 forever #10 clk = ~clk; end reg C1; always @(posedge clk)begin sft_clk = ~sft_clk; end always @(posedge clk)begin if(!rst)begin is_load = 1'b1; data_in = 8'haa; sft_in = 1'b0; C1 = 4'd0; end else if(sft_clk)begin // 当 C18 的时候,使能移位时钟 if( C1 4'd8)begin is_load = 1'b0; sft_en = 1'b1; sft_in = !sft_in; C1 = C1 + 1'b1; end else begin //当 C18的时候,加载数据0 sft_en = 1'b0; C1 = 4'd0; data_in = 8'h00; is_load = 1'b1; end end end initial begin $monitor($time,,,sft_out=%b data_out=%b ,sft_out,data_out); end endmodule 仿真波形 打印输出