inter 发表于 2010-6-28 00:53:23

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

刚开始学<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 data_head;
input data_tail;

//output description
output odd_bits;
output even_bits;
output data_out;

reg data_out;

//internal signal description
reg set;      //used to indicate whether we have got the data header.
reg check_head; //used to check the data_head
reg 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 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;
#90tb_in&lt;={$random}%2;
#90   tb_in&lt;={$random}%2;
#90   tb_in&lt;={$random}%2;
#90tb_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] 2
查看完整版本: 求verilog 8位串转并程序和测试程序,要求奇偶校验和数据头探测