关于verilog实现的串并转换功能 用状态机如何实现并串转换verilog

verilog\u5e76\u4e32\u8f6c\u6362\u548c\u4e32\u5e76\u8f6c\u6362\u95ee\u9898

always@(posedge pclk,posedge reset)
begin
if(reset) begin
p<=0;
end
else begin
p<=din;
end
end
always@(posedge sclk,posedge reset)
begin
if(reset) ser_d<=0;
else
begin
if(x!=7) begin
{p,ser_d}<={1'b0,p};
end
else ser_d<=p[0];
end
end
\u8fd9\u91cc\u7f16\u8bd1\u5668\u6ca1\u62a5\u9519\u5417\uff1fp\u6709\u4e24\u79cd\u9a71\u52a8
\u8fd8\u6709\u9694\u79bb\u4e0d\u540c\u65f6\u949f\u57df\u6700\u597d\u8981\u7528fifo\u7684\uff0c\u6211\u5c31\u5728\u4f60\u7684\u57fa\u7840\u4e0a\u6539\u4e86

`timescale 1ns/1ns
module p2s2p(reset,pclk,sclk,din,dout);
input reset,pclk,sclk;
input [7:0]din;
output reg[7:0]dout;
reg ser_d;
reg [7:0]d,p,q;
reg [2:0]x;
reg s;
always@(posedge sclk,posedge reset)
begin
if(reset) begin
p<=0;
end
else if(x==1)begin
p<=din;
end
else begin
p<={1'b0,p[7:1]};
end
end
always@(posedge sclk,posedge reset)
begin
if(reset) ser_d<=0;
else
begin
ser_d<=p[0];
end
end
always@(posedge sclk,posedge reset)
begin
if(reset) x<=3'b0;
else begin
x<=x+1;
end
end
always@(posedge sclk,posedge reset)
begin
if(reset) s<=0;
else begin
if(x==2) s<=1;
else s<=0;
end
end
always@(posedge sclk,posedge reset)
begin
if(reset) d<=8'b0;
else begin
d<={ser_d,d[7:1]};
end
end
always@(posedge sclk,posedge reset)
begin
if(reset) q<=8'b0;
else begin
if(s) q<=d;
end
end
always@(posedge pclk,posedge reset)
begin
if(reset) dout<=8'b0;
else begin
dout<=q;
end
end
endmodule

\u6211\u7ed9\u4f60\u8be5\u4e86\u4e24\u5904\uff0c\u4e00\u662f\u4f60\u7684\u5206\u9891\u90e8\u5206\uff0c\u7531\u4e8e\u4f60\u91c7\u7528\u7684\u4e0d\u662f50%\u7684\u5360\u7a7a\u6bd4\uff0c\u800c\u53c8\u8981\u628a\u5f97\u5230\u7684\u9891\u7387\u7528\u505a\u65f6\u949f\uff0c\u5f88\u53ef\u80fd\u9020\u6210\u540e\u9762\u6570\u636e\u65e0\u6cd5\u6ee1\u8db3\u5efa\u7acb\u548c\u4fdd\u6301\u65f6\u95f4\u5bfc\u81f4\u9519\u8bef\uff0c\u8be5\u540e\u7684\u4ee3\u7801\u5982\u4e0b\uff1a
always@(posedge clk)
begin
if (counter_224=='d112) // 224\u5206\u9891\u7684\u8ba1\u6570\u5668,64k
begin
clk_224<=~clk_224;
counter_224<=8'b0;
end
else
counter_224<=counter_224+8'b1;

end

always@(posedge clk)
begin
if (counter_128=='d64) // 128\u5206\u9891\u7684\u8ba1\u6570\u5668,112k
begin
clk_128<=~clk_128;
counter_128<=0;
end
else
counter_128<=counter_128+7'b1;

end
\u8fd8\u6709\u5c31\u662f\u4f60\u7684\u5e76\u8f6c\u4e32\u7684\u90e8\u5206\uff0c\u6211\u6ca1\u6709\u7528\u79fb\u4f4d\u5bc4\u5b58\u5668\u7684\u65b9\u5f0f\u800c\u662f\u91c7\u7528\u72b6\u6001\u673a\u6765\u5b9e\u73b0\u7684\uff0c\u4f60\u7684\u4ee3\u7801\u7684\u4e00\u4e2a\u9519\u8bef\u5c31\u662fhanming_encode\u662f7\u4f4d\u7684\u4e0d\u662f6\u4f4d\uff0c\u8fd8\u6709\u4e2a\u4eba\u6bd4\u8f83\u559c\u6b22\u72b6\u6001\u673a\uff0c\u53ef\u80fd\u770b\u4e0a\u53bb\u5b83\u5f88\u7e41\u7410\uff0c\u5176\u5b9e\u8fd9\u4e2d\u601d\u60f3\u5e94\u7528\u5e7f\u6cdb\uff0c\u79fb\u4f4d\u5bc4\u5b58\u5668\u867d\u7136\u4e0d\u7e41\u4f46\u662f\u8001\u5bb9\u6613\u51fa\u9519\uff08\u6211\u6307\u5728\u4e00\u4e9b\u590d\u6742\u7684\u4ee3\u7801\u91cc\uff09\uff0c\u72b6\u6001\u673a\u4ece\u89c6\u89c9\u4e0a\u6765\u8bf4\u6bd4\u8f83\u7e41\u7410\uff0c\u53ef\u662f\u5f88\u5bb9\u6613\u7406\u89e3\u3002\u4ee3\u7801\u5982\u4e0b\uff1a
reg [7:0] state;
always@(posedge clk_128) //\u5e76\u884c\u8f93\u5165,\u4e32\u884c\u8f93\u51fa
begin
case(state)

state1:begin hanming_out<=output_temp[0]; state<=state2; end
state2:begin hanming_out<=output_temp[1]; state<=state3; end
state3:begin hanming_out<=output_temp[2]; state<=state4; end
state4:begin hanming_out<=output_temp[3]; state<=state5; end
state5:begin hanming_out<=output_temp[4]; state<=state6; end
state6:begin hanming_out<=output_temp[5]; state<=state7; end
state7:begin hanming_out<=output_temp[6]; state<=state1; end

default : state<=state1;
endcase
end
\u8fd8\u6709\u4e00\u5904\u5c31\u662f\u7528\u8fde\u7eed\u8d4b\u503c\u7ed9output_temp\u8d4b\u503c\u5982\u4e0b\uff1a
assign output_temp=hanming_encode;
\u5f53\u7136output_temp\u7684\u5b9a\u4e49\u8981\u8be5\u573aWIRE\u578b
PS\uff1a\u6bcf\u6b21\u82b1\u65f6\u95f4\u8ba4\u771f\u5199\u56de\u590d\uff0c\u53ef\u662f\u5c31\u6709\u4e9b\u4eba\u559c\u6b22\u5173\u95ed\u95ee\u9898\uff0c\u6211\u5f88\u90c1\u95f7\uff0c\u4e0d\u77e5\u9053\u8fd8\u80fd\u575a\u6301\u591a\u4e45\u3002

串并转换很简单,就是移位寄存器,后面最好跟一个锁存器,实现你所要求的功能需要四位移位寄存器和四位锁存器,锁存器的作用就是保持并行数据在移位时不发生变化:
module shift(nreset,clk,en,in,out);

input nreset,clk,en,in;
output [3:0] out;

reg [1:0] count;//移位计数,控制并行数据更新,这里是4bit并行数据
reg [3:0] data;
reg [3:0] out;

/* 移位计数,用于并行数据输出,也可以外加一个脉冲控制数据边界,这里移位4bit就并行输出一次*/
always@(posedge clk or negedge nreset)
begin
if(~nreset)
count <= 2'b00;
else if(en)
count <= count + 2'b01;
end
//移位
always@(posedge clk or negedge nreset)
begin
if(~nreset)
data <= 4'b0000;
eale if(en)
data <= {data[2:0],in};
end
//并行输出
always@(posedge clk or negedge nreset)
begin
if(~nreset)
out <= 4'b0000;
else if(en && (count==2'b11))
out <= data;
end
endmodule

我编译、仿真过了,没有问题,你原有的out<={out,in}应该写成像这样data <= {data[2:0],in};这就是一个移位寄存器!

  • 鍏充簬verilog瀹炵幇鐨勪覆骞杞崲鍔熻兘
    绛旓細涓插苟杞崲寰堢畝鍗曪紝灏辨槸绉讳綅瀵勫瓨鍣紝鍚庨潰鏈濂借窡涓涓攣瀛樺櫒锛瀹炵幇浣犳墍瑕佹眰鐨勫姛鑳介渶瑕佸洓浣嶇Щ浣嶅瘎瀛樺櫒鍜屽洓浣嶉攣瀛樺櫒锛岄攣瀛樺櫒鐨勪綔鐢ㄥ氨鏄繚鎸佸苟琛屾暟鎹湪绉讳綅鏃朵笉鍙戠敓鍙樺寲锛歮odule shift(nreset,clk,en,in,out);input nreset,clk,en,in;output [3:0] out;reg [1:0] count;//绉讳綅璁℃暟锛屾帶鍒跺苟琛屾暟鎹...
  • 鐢╒erilog HDL璁捐涓涓4浣嶄覆_骞惰浆鎹㈠櫒,闇瑕佺▼搴忓拰涓瀹氱殑娉ㄩ噴
    绛旓細input clk ; // clock signal for serial data input input rst_n ; // system reset signal,negative value input sdi ; // serial data input,posedge clock signal value,high significance bit input first output[3:0] pdo ; // parallel data output reg[3:0] pdo ;always@(...
  • Verilog濡備綍鐢ㄧЩ浣嶆搷浣滅"<<"鎴">>"鏉瀹炵幇涓插苟4bit鏁版嵁鐨勪覆鍏ュ苟鍑?
    绛旓細绗竴涓槸鐢ㄤ綅鎷兼帴绗︽潵鍋氱殑锛屽湪鐧惧害涓婅緭鍏モVerilog 涓插苟杞崲鈥濆緢瀹规槗灏辨煡鍒颁簡锛岃繖涓槸鍒汉鐨勫嚱鏁帮紝鎴戞妸鍚嶅瓧鎹㈡垚浣犵殑锛屽彲浠ョ洿鎺ョ敤鍒拌嚜宸辩殑搴旂敤涓俶odule Serial_to_Para(clk,reset,en,in,out);input clk,reset,en,in;output[3:0] out;reg[3:0] out;always @(posedge clk)begin if(reset)...
  • verilog 骞惰杈撳叆杞 涓茶杈撳嚭
    绛旓細鎬濇兂濡備笅锛氭椂閽熼鐜囪偗瀹氭槸澶栭儴杈撳叆鐨勶紝鍏蜂綋鐨勮緭鍑洪噰鏍锋暟鎹殑棰戠巼鎺у埗鍙互鍙﹀鍔犱竴涓椂閽熶娇鑳戒俊鍙锋潵鍔犱互鎺у埗锛岀劧鍚庡湪姣忎釜鏃堕挓涓婂崌娌胯繘琛屽垽鏂紝杈撳嚭鏁版嵁璧嬪煎苟涓旇緭鍏ュ苟琛屾暟鎹繘琛岀Щ浣嶆搷浣,閲岄潰鏈変袱涓鏁板櫒鏉ユ帶鍒舵椂搴忥紝涓涓鏁板櫒cnt2鐢卞彟澶栦竴涓猚nt1瑙﹀彂锛屼笅闈㈢殑鏄粠浣庡埌楂樼殑杈撳嚭锛屽鏋滀綘鎯充粠楂樺埌搴曠殑杈撳嚭锛屽彲浠...
  • 鑷繁缂栦簡涓涓骞惰浆涓茬殑verilog绋嬪簭,浣嗘槸modelsim浠跨湡鍑烘潵鎬绘槸涓嶅,姹...
    绛旓細bits0000<=data[6-i]; 杩欐槸姝g‘鐨勫啓娉曪紝鍦ㄦ椂搴忕數璺噷鐨刟lways鍧楅兘鐢ㄨ繖绉嶅啓娉曘傚幓鎺塱= i + 1杩欏彞闃诲璧嬪艰鍙ュ悗锛屽湪浠绘剰浣嶇疆鍐欎竴娈礱lways鍧楋細always@(posedge clk12)begin if (counter < 3'd6)counter <= counter + 1'b1;else counter <= 3'b0;end 杩欎竴娈瀹炵幇鑷姞鍔熻兘 ...
  • verilog缂栫▼鎶宸
    绛旓細涓插苟杞崲鏄 FPGA璁捐鐨勪竴涓噸瑕佹妧宸,瀹冩槸鏁版嵁娴佸鐞嗙殑甯哥敤鎵嬫,涔熸槸闈㈢Н涓庨熷害浜掓崲鎬濇兂鐨勭洿鎺ヤ綋鐜般備覆骞惰浆鎹㈢殑瀹炵幇鏂规硶澶氱澶氭牱,鏍规嵁鏁版嵁鐨勬帓搴忓拰鏁伴噺鐨勮姹,鍙互閫夌敤瀵勫瓨鍣ㄣ RAM 绛夊疄鐜般傚墠闈㈠湪涔掍箵鎿嶄綔鐨勫浘渚嬩腑,灏辨槸閫氳繃 DPRAM 瀹炵幇浜嗘暟鎹祦鐨勪覆骞杞崲,鑰屼笖鐢变簬浣跨敤浜 DPRAM,鏁版嵁鐨勭紦鍐插尯鍙互寮寰楀緢澶,瀵逛簬鏁伴噺姣...
  • verilog HDL绋嬪簭:搴忓垪妫娴嬪櫒鐨勮璁°愮敤涓茶鍜屽苟琛屾柟寮忕紪鍐欍慱鐧惧害鐭 ...
    绛旓細姣忔骞惰妫娴2浣嶏紝姣斿鍒ゆ柇x杈撳叆涓や綅鏄惁绛変簬10锛屽悗涓や綅绛変簬10锛屽啀涓や綅绛変簬11锛屾渶鍚庝袱浣嶇瓑浜01锛熷鏋滄槸杩欐牱锛屽彲浠ュ皢x涓茶杈撳叆锛岃繘琛屼釜涓插苟杞鎹紝渚嬪鐢ㄤ竴涓瘎瀛樺櫒reg1[1:0]淇濆瓨鍏跺笺俛lways @ (posedge clk or negedge rst)if(!rst)reg1 <= 2'h0;else reg1 <= {x, reg1[1]};鐒跺悗瀵规瘮reg...
  • 鐢╒erilog缂栧啓8bit骞惰杈撳叆1bit涓茶杈撳嚭鐨勬帴鍙h浆鎹㈡ā鍧椼
    绛旓細always @(posedge clk)begin Bits8_in_reg<= Bits8_in;Bits8_in_reg<= {Bits8_in_reg[6:0],1'b0}; //浠庨珮浣嶅埌浣庝綅鍙戠殑椤哄簭 end assign serial_line = Bits8_in_reg[7];
  • Verilog涓鍙art,RX_logic杩欎竴鍧椾笉澶噦,楹荤儲娉ㄩ噴涓嬨傚叾涓璴d_tx_data鍜...
    绛旓細閫氳繃浣胯兘鎵嶉佸埌绔彛锛屾帴鏀舵ā鍧椾粬鏄氳繃14鍊嶆暟鎹椂閽熸潵閲囬泦鏁版嵁鐨勶紝閫氳繃瀵规瘡浣嶇殑涓棿閲囨牱锛屼篃灏辨槸 rx_sample_cnt 杩欎釜鏉ョ‘瀹氫綅缃紝涓鑸繕鏄敤鐨16鍊嶄笉鐢14鍊嶇殑锛岃繕鏈夊氨鏄 浠栫殑婧㈠嚭浣嶅拰閿欒璀﹀憡鍒ゆ柇閮戒笉琛岋紝闇瑕佽嚜宸变慨鏀广傚鏋32浣嶇殑 鏁堟灉涓鏍风殑 灏盧X_CNT 涓32鐨勮寖鍥村氨鍙互浜 ...
  • verilog瀹炵幇灏8浣嶆暟鎹浆涓16浣嶈緭鍑,濡傚浘涓8浣嶆暟鎹甈1,P2,P3,P4,杞寲涓...
    绛旓細绗竴涓暟鎹潵鐨勬椂鍊欏簲璇ユ湁鏍囧織鍚э紝娌℃暟鎹殑鏃跺欐槸楂橀樆鎬侊紝鍔犱釜鍒ゆ柇锛屼竴鏃︿笉鏄珮闃绘佹椂鎺ユ敹鍒扮殑灏辨槸绗竴涓暟鎹簡 濡傛灉浣犲彧鏄妸鏁版嵁涓茶浆骞鐨勮瘽锛屼綘鍙互鍔犱釜鏈夋晥浣嶏紝娌″繀瑕佸垎棰 鍒嗛鍚庣殑鏃堕挓灏卞瓨鍦ㄥ欢鏃朵簡
  • 扩展阅读:verilog实现二倍频代码 ... verilog实现按键加1 ... verilog课后题答案 ... 用verilog实现并串输出 ... 搜题拍照秒出答案 ... 对verilog并行的理解 ... verilog实现累加器 ... java生成随机数1-100 ... verilog实现异步串行通信 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网