NRZ與CMI編碼及FPGA代碼的實現


NRZ

NRZ指的是不歸零碼(NRZ,Non-Return to Zero)

CMI

CMI(Coded Mark Inversion)碼是傳號反轉碼的簡稱,與雙相碼類似,它也是一種雙極性二電平碼。其編碼規則是“1”碼交替用“11”和“00”兩位碼表示;“0”碼固定地用“01”表示。

不確定代碼的正確性,只是提供一個思路

 

 1 ///////////////////////////////////////////////////////////
 2 //  module test(clk,out1,out2,out3,clk_1,clk_2,clk_3);
 3 module test(clk,out1,out2,out3);
 4 input clk ;//聲明輸入硬件的時鍾信號
 5 
 6 output out1,out2,out3;//聲明三個輸出
 7 
 8 reg out1=1'b0,out2=1'b0,out3=1'b0;//三個輸出初始化
 9 
10 reg [4:0] counter1 =4'd0 ;//初始化學號輸出時序計數器
11 reg [4:0] counter2 =2'd0 ;//初始化cmi碼計數器
12 reg [4:0] counter3 =4'd0 ;
13 
14 reg [1:0] t1= 2'b00;
15 reg t0 = 1'b0;   //編碼中間量
16 reg r0 = 1'b0,r1 = 1'b0,r11 = 1'b0//譯碼中間量
17 
18 reg clk_1= 1'b0;
19 reg clk_2= 1'b0;
20 ////////////////////////////////////////////////////////////
21 always @(posedge clk)  //產生240k時鍾
22     if(counter1 == 3'd7 )
23         begin
24             counter1 <= 3'd0;
25             clk_1 <= ~clk_1;
26         end 
27     else 
28         counter1 <= counter1 + 1'd1;            
29 //////////////////////////////////////////////////////
30 always @(posedge clk)   //產生480k時鍾
31     if(counter2 == 2'd3 )
32         begin
33             counter2 <= 2'd0;
34             clk_2 <= ~clk_2;
35         end 
36     else 
37          counter2 <= counter2 + 1'd1;
38 /////////////////////////////////////////////////////////    
39 always @(posedge clk_1)  // 產生NRZ碼 , 學號0072
40     if(counter3 == 4'd14)  
41         begin
42             counter3 <= 4'd0;
43             out1 <= 1'b0;
44         end    
45     else 
46         begin 
47             casez (counter3)
48                 4'd1011 : out1 <= 1'b1;
49                 4'b1000 : out1 <= 1'b1;
50                 default : out1 <= 1'b0;
51             endcase
52             counter3 <= counter3 + 1'd1;
53         end      
54 //////////////////////////////////////////////////
55 always @(posedge clk_2)//  CMI編碼
56     if(out1 == 1'b0)//當學號輸出為0時
57         begin
58             if(t0 == 0)//因為cmi編碼0為01,為兩位,所以取一個標志位t0,當t0為0時,輸出01的第一位,t0為1時,輸出01的第二位。
59                 out2 <= 0;
60             else
61                 out2 <= 1;
62             t0 <=~t0;
63         end
64     else
65         begin
66             if(t1[1] == 0)
67 //這里與上面類似,因為1為00和11,交替變換,所以標志位t1為兩位,當學號為1時,一開始想輸出為11,輸出為1,后面00加01,為01,輸出為0,
68 //再后面學號再次為1時,01加01為10,這時輸出為1,后面10加01為11,輸出為1,之后再if結束后加01為00
69                 out2 <= 1;
70             else
71                 out2 <= 0;
72             t1 <= t1+2'b01;
73         end
74 ///////////////////////////////////////////////////
75 always @(posedge clk_2)   //  CMI譯碼
76     if(r11 == 1'b0)//將out2的輸出即cmi編碼的值賦給r0和r1,二者取與,結果為0則編碼結果為0,結果為1則編碼結果為1
77         begin
78             out3 <= (r0 ^ r1);//r11這里相當於一個分配out2的標志位,因為out2的輸出只能一位一位輸出,所以r11為0時,將out2的值給r0,r11為1時,將out2的值給r1
79             r0 <= out2;
80             r11 <= ~r11;
81         end
82     else
83         begin
84             r1 <= out2;
85             r11 <= ~r11;    
86         end
87 
88 endmodule

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM