用Verilog實現串並轉換

2021-10-05 23:49:57 字數 4100 閱讀 9509

一、串轉並轉換模組

串轉並就是將低3位訊號和輸入訊號一起賦值。因為經過轉換後,碼元速率會將為原來四分之一,所以設定4分頻時鐘,將其輸出。而並轉串就是不斷右移,取高位輸出。

module serial_par(

input clk,

input d,

output reg [3:0]q

);//四分頻模組

reg [13:0]cnt;

parameter n = 4;

reg clk_out;

always @(posedge clk)

begin

if(cnt == n/2 - 1)begin

cnt <= 14'b0;

clk_out <= ~clk_out;

end

else

cnt <= cnt + 1'b1;

endreg [3:0]data;

always @(posedge clk)

begin

data <= ;

endalways @(posedge clk_out)

begin

q <= data;

endendmodule

序列轉並行資料輸出:採用位拼接技術(移位暫存器),將序列的資料總數先表示出來,然後傳送一位資料加一,後面的接收的這樣標誌:

data_o <= ;

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 <= ; //高位先賦值

else

data_o <= data_o;

endendmodule

利用計數器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;

endelse begin

data_o[7 - cnt] <= data_i; 高位先賦值

cnt <= cnt + 1'b1;

endend/*

//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;

endelse begin

data_o[cnt] <= data_i; //低位先賦值

cnt <= cnt + 1'b1;

endend*/

endmodule

二、並轉串轉換模組

en為輸入有效脈衝,每四個脈衝輸出高電平

module par_serial(

input clk,

input [3:0]d,

input en,

output q

);reg[2:0]cnt;

always @(posedge clk)

begin

if(cnt == 3)begin

en <= 1;

cnt <= 0;

endelse begin

en <= 0;

cnt <= cnt + 1'b1;

endendreg[3:0]data;

always @(posedge clk)

begin

if(en)

data <= d;

else

data <= data << 1;

endassign q = data[3];

endmodule

並串轉換的原理是:

先將八位資料暫存於乙個四位暫存器器中,然後左移輸出到一位輸出埠,這裡通過乙個「移位」指令。

1)用暫存器移位實現,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;

endelse if (en == 1'b1)

data_buf <= data_i;

else

data_buf <= data_buf <<1; //將暫存器內的值左移,依次讀出

//data_buf <= ;

endassign data_o = data_buf[7];

endmodule

使能訊號en表示開始執行並轉串操作,由於並轉串是移位操作,當一次並轉串完成後,需要重新載入待轉換的並行資料時,使能訊號要再起來一次 

2)用計數器實現

module b_c(clk,rst_n,en,d,q);

input clk,rst_n;

input [3:0]d;

output reg en;

output reg q;

reg [3:0]count;

reg [3:0]data;

always @(posedge clk or negedge rst_n)

begin

if(rst_n==0)

begin

count<=0;

en<=0;;

data<=d;

q<=0;

endelse

begin

if(count<4)

begin

count<=count+1;

en<=1;

data<=;

q<=data[3];

endelse

begin

count<=0;

en<=0;

q<=0;

endend

endendmodule

verilog入門經驗(五) 並轉串

並轉串電路主要由時鐘 clk 復位訊號 rst 並行輸入訊號 pdin 序列輸出訊號 sdout 和使能訊號 en 組成。其它訊號都是名字意義,現在主要講下使能訊號。使能訊號表示開始執行並轉串操作,由於並轉串是移位操作,當一次並轉串完成後,需要重新載入待轉換的並行資料時,使能訊號要再起來一次。下面是...

阻抗串並轉換

如何快速地將併聯阻抗轉換為串聯阻抗?或者將串聯阻抗轉為併聯阻抗?看看下面的講解吧。如圖 1,顯示了將併聯電路轉換為串聯電路的轉換方程式 推導過程見最下面的附錄 圖 1 這些電路為乙個頻率的等效電路 有趣的是,那麼該如何使用它呢?在您需要估算電感 dc 電阻 dcr 和電容等效串聯電阻 esr 對電源...

用WindowsAPI截圖並轉換為RGB格式

在windows下捕獲螢幕影象可以有多重方法,比較簡單可以呼叫第三方庫,如qt的螢幕截圖api就很容易呼叫。在這裡介紹如何用windows api實現截圖並轉換成rgb格式儲存。include 最終f的記憶體布局為bgra格式,需要保證buf長度足夠 w h 4 void screencap voi...