名称:时分数据交换系统Verilog代码vivado仿真
软件:vivado
语言:Verilog
代码功能:
请设计一个串行输入、串行输出的时分数据交换系统。该时分数据输入如下图所示:
针对上述输入信号,现要求给出如下的输出(可以有不超过8个时钟延时):
请给出详细的设计思路、实现步骤、电路原理图,并在给出时序图的基础上说明“将第1路数据交换至第4路数据输出时”的工作原理。
其中:
时钟端 Clk: 电路的工作时钟
串行输入Din: 串行输入数据,图中序号表示对应的信道号
输入使能端En: 高有效,表示当前对应的信道需要进行交换
串行输出Dout: 指示交换之后的数据输出
输出有效Eo: 高有效,指示当前输出的Dout数据为有效交换数据
信道指示Ind[1:0]: 指示当前输出Dout数据对应的信道号
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件
2. 程序文件
3. 程序编译
4. Testbench
5. 仿真图
部分代码展示:
reg [3:0] cnt=0; reg [3:0] in_cnt=0; reg [3:0] out_cnt1=0; reg [3:0] data_in=0; reg [3:0] cnt1=0; reg [3:0] cnt2=0; parameter state1 = 4'b0001;//状态机 parameter state2 = 4'b0010; parameter state3 = 4'b0011; parameter state4 = 4'b0100; reg [3:0] state = 4'b0001;//输入状态 always @(posedge CLK ) begin case(state) state1: if(EN) begin state <= state2; data_in <= {data_in[2:0],DIN}; cnt2 <= cnt2 +1'd1; end state2: if(EN) begin state <= state3; data_in <= {data_in[2:0],DIN}; cnt2 <= cnt2 +1'd1; end state3: if(EN) begin state <= state4; data_in <= {data_in[2:0],DIN}; cnt2 <= cnt2 +1'd1; end state4: if(EN) begin state <= state1; data_in <= {data_in[2:0],DIN}; in_cnt <= in_cnt + 1'd1; cnt2 <= cnt2 +1'd1; end endcase end reg [3:0] data,data1; always@(posedge CLK) begin if(state == state1)//数据缓存 begin data <= data_in; end end reg [3:0] state_out = 4'b0001;//输出状态 always @(posedge CLK ) begin if(cnt2 >= 5) begin case(state_out) state1: if(out_cnt1 < in_cnt) begin cnt1 <= 4'd1; state_out <= state2; EO <= 1'd1; Ind <= Ind - 1; end else begin EO <= 1'd0; end state2: begin cnt1 <= 4'd2; state_out <= state3; Ind <= Ind - 1; end state3: begin cnt1 <= 4'd3; state_out <= state4; Ind <= Ind - 1; end state4: begin cnt1 <= 4'd0; out_cnt1 <= out_cnt1 + 1'd1; state_out <= state1; Ind <= Ind - 1; end endcase end else begin Ind <= 2'b00; end end always@(posedge CLK) begin case(cnt1) 4'd0:DOUT <= data[0]; 4'd1:DOUT <= data[1]; 4'd2:DOUT <= data[2]; 4'd3:DOUT <= data[3]; endcase end endmodule
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=479
524