数字IC设计——用Verilog实现串并转换(移位寄存器)

数字IC设计——用Verilog实现串并转换(移位寄存器)

一、串转并转换模块
  1. 利用移位寄存器
    串行转并行数据输出:采用位拼接技术(移位寄存器),将串行的数据总数先表示出来,然后发送一位数据加一,后面的接收的这样标志:
    data_o <= {data_o[6:0],data_i };
    1输入8输出串转并模块的Verilog代码
module serial_parallel(
    input           clk,
    input           rst_n,en,
    input           data_i,   //一位输入
    output   reg [7:0] data_o	//8位并行输出
    );

always @(posedge clk or negedge rst_n) begin
	if (rst_n == 1'b0)
		data_o <= 8'b0;
	else if (en == 1'b1)
		data_o <= {data_o[6:0], data_i};	//低位先赋值
		//data_o <= {data_i,data_o[7:1],};	//高位先赋值
	else
		data_o <= data_o;
end

endmodule
  1. 利用计数器
    利用计数器cnt 时钟计数,开始数据先给高位,每过一个时钟周期,数据便给低一位。这样便可以达到串转并的效果

    1输入8输出串转并模块的Verilog代码

module serial_parallel(
    input           clk,
    input           rst_n,
    input           data_i,
    output   reg [7:0] data_o
);

//msb first   most significant bit 表示二进制数据的最高位
reg     [2:0]   cnt; 	//计数器0-7  
always @(posedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        data_o <= 8'b0;
        cnt <= 3'd0;
    end
    else begin
        data_o[7 - cnt] <= data_i;	高位先赋值
        cnt <= cnt + 1'b1;
    end
end

/*
//lsb first	(least significant bit) 表示二进制数据的最低位

reg     [2:0]   cnt;
always @(posedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        data_o <= 8'b0;
        cnt <= 3'd0;
    end
    else begin
        data_o[cnt] <= data_i;   //低位先赋值
        cnt <= cnt + 1'b1;
    end
end
*/

endmodule
二、并转串转换模块

并串转换的原理是:
先将八位数据暂存于一个四位寄存器器中,然后左移输出到一位输出端口,这里通过一个“移位”指令。

8输入1输出并转串模块的Verilog代码

module parallel_serial(
clk, rst_n, en, data_i, data_o
    );
input clk, rst_n,en;
input [7:0] data_i;
output  data_o;

reg [7:0]  data_buf;
always @(posedge clk or negedge rst_i) begin
	if (rst_i == 1'b0) begin
		data_o <= 1'b0;
		data_buf <= 8'b0;
	end
	else if (en == 1'b1)
		data_buf <= data_i;
	else
		data_buf <= data_buf <<1; 	//将寄存器内的值左移,依次读出
		//data_buf <= {data_buf[6:0],1'b0};
end

assign data_o = data_buf[7];

endmodule

使能信号en表示开始执行并转串操作,由于并转串是移位操作,当一次并转串完成后,需要重新载入待转换的并行数据时,使能信号要再起来一次

下面是souce driver COB测试程序中用到的并转串实例:


module p2s (data_i, data_o, en, clk, rst_n, input);
input	[7:0]	data;		// !!!共8bit
output		sdout;
input		en, clk, rst_n;
input 		width_sw;	//用来区分8bit/6bit输入并行数据。本例子中是从并行输入数据的低位开始转换的。

reg [6:0] 	tmp_buf;		// !!!共7bit 用于缓存高7位
reg data_o;
 
always @ ( posedge clk or negedge rst_n ) begin
     if ( ! rst_n )
       {tmp_buf, data_o} <= 'b0;
     else 
     begin
		if ( en )	//使能信号
			{tmp_buf, data_o} <= data_i;
		else	
			begin
				if( width_sw )
					{tmp_buf, data_o} <= {'b0, tmp_buf};	8bit 右移一位
				else
					{tmp_buf[4:0], data_o} <= {'b0, tmp_buf[4:0]}; //6bit 右移一位
			end
		end
end         

 
endmodule

参考博文:https://blog.csdn.net/phenixyf/article/details/46831487

### 回答1: VerilogHDL代码如下:module shift_reg (data_in, data_out, clk, rst, shift_en); input data_in; output data_out; input clk; // clock input input rst; // reset input input shift_en; // enable signal reg [7:0] shift_reg; always @ (posedge clk) begin if (rst) begin shift_reg <= 8'b0; end else if (shift_en) begin shift_reg <= {data_in,shift_reg[7:1]}; end end assign data_out = shift_reg[7]; endmodule ### 回答2: 可以使用VerilogHDL语言设计一个串并转换移位寄存器,以下是一个示例代码: ```verilog module shift_register( input [7:0] parallel_in, input shift, input reset, output [7:0] parallel_out ); reg [7:0] register [7:0]; always @(posedge shift) begin if (reset) begin for (int i=0; i<8; i=i+1) begin register[i] <= 0; end end else begin for (int i=7; i>0; i=i-1) begin register[i] <= register[i-1]; end register[0] <= parallel_in; end end assign parallel_out = register[7]; endmodule ``` 上述代码使用了一个8位宽的数组`register`作为寄存器来存储输数据。当`shift`信号上升沿触发时,会进行移位操作。如果`reset`信号为高电平,那么将清零寄存器。否则,将寄存器中的每个元素右移一位,并将`parallel_in`的值存寄存器的第一位。最后,将`register[7]`的值赋给`parallel_out`,实现串并转换移位的功能。 需要注意的是,上述代码中使用了VerilogHDL语言的一些特性,如`@posedge`表示对上升沿事件敏感,`begin`和`end`用于代码块的括号。这个代码只是一个示例,具体实现可能会根据系统的需求进行修改。 ### 回答3: Verilog HDL语言中设计一个串并转换移位寄存器可以使用以下代码: module ShiftRegister( input clk, // 时钟信号 input reset, // 复位信号 input [7:0] in_data, // 输数据 output [7:0] out_data // 输数据 ); reg [7:0] shift_reg; // 移位寄存器 always @(posedge clk or posedge reset) begin if (reset) shift_reg <= 8'h00; // 复位时,将寄存器清零 else shift_reg <= {shift_reg[6:0], in_data[0]}; // 将输数据左移并将第0位作为新数据写 out_data <= shift_reg; // 输寄存器的值 end endmodule 在上述代码中,我们定义了一个名为ShiftRegister的模块,该模块具有一个时钟信号clk,一个复位信号reset,一个8位输信号in_data和一个8位输信号out_data。 移位寄存器是用一个8位的寄存器来存储数据,并通过clk信号的上升沿来触发移位操作。在每个时钟周期的上升沿时,如果复位信号reset为高电平,则将寄存器清零;否则,将输数据in_data左移一位并将其最低位(位0)作为新数据写寄存器。 最后,将寄存器的值赋给输信号out_data。 这个移位寄存器可以将输数据向左移动,并在每个时钟周期上升沿时从输端接收新的数据。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摆渡沧桑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值