集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 7317|回复: 15

求verilog 8位串转并程序和测试程序,要求奇偶校验和数据头探测

[复制链接]
inter 发表于 2010-6-28 00:53:23 | 显示全部楼层 |阅读模式
刚开始学<br>
有没有高手帮忙发个上来<br>
好学习学习~<a href='http://www.caijiqi.net/cms/taker/helpcenter/phpwind.jsp' target='_blank' title='网站数据采集'><img alt='网站数据采集' width='1' height='10' border='0' src='http://www.caijiqi.net/ad.gif'></a>
longtim 发表于 2010-6-28 01:14:33 | 显示全部楼层
用一组移位寄存器每8位并行输出,如果串行数据流中已经包含校验位那就每9位并行输出一次.
encounter 发表于 2010-6-28 03:04:55 | 显示全部楼层
我编的一个8位串并转换程序,可以奇偶校验,并且可以检测数据头和数据尾(都是3位的)。大伙看看,共同讨论一下优缺点!
module serial2pal(
      //input
      clk,    //clock signal
      reset,    //reset signal
      enable,   //enable signal
      data_in,    //serial data in
      data_head,  //head of the useful data, used for head check
      data_tail,  //tail of the useful data, used for tail check
      
      //output
      odd_bits,   //indicate the result of odd and even check
      even_bits,
      data_out
      );
//clock and reset signal description
input clk;
input reset;

//input signal description
input enable;
input data_in;
input [2:0] data_head;
input [2:0] data_tail;

//output description
output odd_bits;
output even_bits;
output [7:0] data_out;

reg [7:0] data_out;

//internal signal description
reg set;      //used to indicate whether we have got the data header.
reg [2:0] check_head; //used to check the data_head
reg [2:0] check_tail; //used to check the end of the useful data

always@(posedge clk or negedge reset)
begin
if(!reset)
begin
    set&lt;=0;
    check_head&lt;=0;
    check_tail&lt;=0;
end
else if(enable==1)
begin
  check_head&lt;={check_head,data_in};
  check_tail&lt;={check_tail,data_in};
  if(check_head==data_head)
    set&lt;=1;
  else if(check_tail==data_tail)
    set&lt;=0;
  end
end

always@(posedge clk or negedge reset)
begin
  if(!reset)
   data_out&lt;=0;
  else if(enable==0)
   begin
   if(set&lt;=1)
    data_out&lt;={data_out,data_in};
   else
    data_out&lt;=0;
   end
end

assign odd_bits=^data_out;
assign even_bits=~odd_bits;

endmodule
ATA 发表于 2010-6-28 03:29:30 | 显示全部楼层
我是个新手,对楼上的程序发表下看法,不对之处还请指正。<br>
<br>
我认为程序在校验数据头和尾时(即下面的程序)有问题<br>
if(check_head==data_head)<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;set&lt;=1;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;else if(check_tail==data_tail)<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;set&lt;=0;<br>
<br>
数据为串行输入 ,data_head和data_tail应该是逐个接收到的数据,我建议这两个值从data_out中取出。<br>
然后与check_head和check_tail进行对比!<br>
interig 发表于 2010-6-28 03:40:08 | 显示全部楼层
原帖由 无尽星空 于 2006-9-4 19:13 发表<br>
if(check_head==data_head)<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;set&lt;=1;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;else if(check_tail==data_tai ... 在进行首尾检测时,使用了另外的寄存器,首检测和尾检测各3各(由于是三位),没有使用后来的data_out的积存器,这样可以在输出之前判断,有用数据就输出,否则并行输出为0。<br>
以上程序也只是我个人的设计,希望和大伙多多交流,互相学习。
CTT 发表于 2010-6-28 05:06:27 | 显示全部楼层
不知这个测试程序怎么写<br>
刚开始学<br>
Harva朋友能否贴个上来<br>
万分感谢
UFP 发表于 2010-6-28 05:10:31 | 显示全部楼层
不会吧,大哥自己写吧!<br>
论坛上又很多Verilog很好的资料,下来自己研究一下吧!
CTT 发表于 2010-6-28 06:07:33 | 显示全部楼层
但是关于数据头检测的很少<br>
不知道测试代码怎么写...<br>
关于串并转换的代码我写了..
UFP 发表于 2010-6-28 07:41:27 | 显示全部楼层
moduletes_czb;
  reg tb_clk;            
  reg tb_reset;
  reg tb_en;
  wire tb_odd;
  wire tb_even;                           
wire [7:0]tb_out;           
reg tb_in;
always #50 tb_clk&lt;=~tb_clk;            
initial
begin
  tb_in&lt;=1;
  tb_clk&lt;=0;
tb_reset&lt;=1;
#90 tb_reset&lt;=0;
tb_en&lt;=1;
#90 tb_in&lt;=1;
#90 tb_in&lt;=0;
#90 tb_in&lt;=0;
#90 tb_in&lt;=1;
#90 tb_in&lt;=0;
#90 tb_in&lt;=1;
#90 tb_in&lt;=0;
#90 tb_in&lt;=1;
repeat(50)
begin
  tb_reset&lt;={$random}%2;
  tb_en&lt;={$random}%2;
#90  tb_in&lt;={$random}%2;
#90   tb_in&lt;={$random}%2;
#90   tb_in&lt;={$random}%2;
#90  tb_in&lt;={$random}%2;
#90   tb_in&lt;={$random}%2;
#90   tb_in&lt;={$random}%2;
#90   tb_in&lt;={$random}%2;
#90   tb_in&lt;={$random}%2;
     end
   end
serial_pal aa(.clk(tb_clk),.reset(tb_reset),.en(tb_en),.in(tb_in),.out(tb_out),.odd(tb_odd),.even(tb_even));
initial
begin
  $monitor($time,,,"tb_en%b,tb_in%b,tb_out%b,tb_reset%b,tb_odd%b,tb_even%b",tb_en,tb_in,tb_out,tb_reset,tb_odd,tb_even);
end
endmodule

测试过了
不过初学这个,不知有无错误
longt 发表于 2010-6-28 08:40:29 | 显示全部楼层
zhaochenyu朋友的不能综合吧
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|集成电路技术分享 ( 京ICP备20003123号-1 )

GMT+8, 2024-5-4 14:24 , Processed in 0.075121 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表