FPGAã§ã³ã³ãã¥ã¼ã¿å°æ£ãä½ã(3)
ãªããå¯ã¦èµ·ãããé ã®ãªãã«ã³ã³ãã¤ã©ã®ã³ã¼ããè©°ã¾ã£ã¦ããã®ã§æ°æéããã¦æ¸ãåºãããä¸å¿ã¯ãCã©ã¤ã¯è¨èªãã VHDL/C#ã³ã¼ããçæã§ããããã«ã¯ãªã£ãã
æ©éãµã³ãã«ã¨ãã¦CRCã¨ã³ã³ã¼ããæ¸ããã®ã§ãã®ã¨ã³ããªã®ä¸ã®ã»ãã«ã¤ãã¦ããã(å®ã¯ã¾ã ä¸é¨æªå®è£ ãªã®ã§ãã®ã³ã¼ãã¯ã¾ã ã³ã³ãã¤ã«ã§ããªãã)
ç§ã®å¥½ã¿ã¨ãã¦ãcaseã®breakãä¸è¦ã«ããããcase 8..15 : ã®ããã«å®æ°ç¯å²ãæå®ã§ããããã«ããããa = if (x==3) 0 else 1; ã®ããã«å¼ifãæ¸ããããã«ãããç´°ããªæ¡å¼µããã¦ããã®ã ããããããæ¡å¼µãããã¨VisualC#ã§ã³ã¼ããæ¸ããã¨ãã«ãã¨ãã¨ãã¨ã©ã¼è¡¨ç¤ºããã¦æ°åãæªãã
ããã¦è¦ããã ãã§ãC#風ã«ãã¦ãVisualC#ã®ã½ã¼ã¹ã¨ãã£ã¿ä¸ã§ã¨ã©ã¼è¡¨ç¤ºãåºãªãããã«ããããããããããããã¨ã©ãã©ãè¨èªãåé·ã«ãªã£ã¦ãããããã§ã¯ãVHDLã¨æ¯ã¹ã¦ããã»ã©ãã£ãããã¨ããããã§ããªãã
ãã½ã³ã³ã®ä¸ã§é«éã«ã·ãã¥ã¬ã¼ãã§ããã¨ããã®ãå¯ä¸ã®å©ç¹ã ãããããªãVHDLâCã®ãã©ã³ã¹ã¬ã¼ã¿ãæ¸ããã»ãããã£ã½ã©å½¹ã«ç«ã¤ã®ã§ã¯ãªãã ãããããããããä¸éã®VHDLç¨ã®ã·ãã¥ã¬ã¼ã¿ã使
ãããªã«é
ãã®ãã¨è¨ãã¨ãã»ã©ææãä½è¨ãªæ©è½ããã¦ãã¦ã¤ãã¦ããããã§ã¯ãªãããããåã«Cã®ã³ã¼ãã«å¤æãã¦å®è¡ããã ããªãããªãé«éã ã¨æãã
ãããããã¾ä½ã£ã¦ããã³ã³ãã¥ã¼ã¿å°æ£ã§ããããªé«éãªVHDLã®ã·ãã¥ã¬ã¼ã·ã§ã³ãå¿ è¦ãã¨è¨ãã¨ãVHDLã®ã½ã¼ã¹ãæ¸ãã®ã¯æçµæ®µéã§ãç´åã¾ã§ã¯èªä½ã®ãã³ã³ãã¥ã¼ã¿å°æ£éçºç¨çµ±åç°å¢ãã§éçºããã®ã§VHDLã®ã·ãã¥ã¬ã¼ã·ã§ã³ãé ãããããããªãã¨ã¯ç¥ã£ããã£ã¡ããªãã®ã§ããã
VHDLâCã®ãã©ã³ã¹ã¬ã¼ã¿ãæ¸ãæé >>>> (è¶ããããªãå£) >>>>> VHDLã®ã½ã¼ã¹ãç´æ¥ãããã°ããæé
ãªã®ã§ä½ããã£ã¦ãããããããããªããã¨ã«ãªã£ã¦ããã®ã§ãã³ã³ãã¤ã©ä½æéã³ã¯ãããããã«ãã¨ãã¦ããã³ã³ãã¥ã¼ã¿å°æ£éçºç¨çµ±åç°å¢ãä½ãã«æ»ãã®ã§ããã
以ä¸ãããã§ä½æããè¨èªã§æ¸ããCRCã¨ã³ã³ã¼ãã®ã½ã¼ã¹*1ã¨ãã®è¨èªã®ä»æ§ã
#IF VHDL
use ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
#ENDIF
#IF CCSharp
#include "std_logic.h"public class CRCEncoder
{
public static void Main(string [] args)
{
Curcuit cir = new Curcuit();std_logic CLK = new std_logic();
... // ä»ã®ãã©ã¡ã¼ã¿ãããã§ã¤ã³ã¹ã¿ã³ã¹çæãã¹ã
std_logic DATA_OUT;// ã¯ããã¯ä¿¡å·ãCurcuit.DoEventãå¼ã³åºããããã¨ã«å¤åãããã
cir.DoEvent = delegate { CLK != CLK; };CRCENC enc = new CRCENC(cir,CLK,...,out DATA_OUT,..);
// ãã©ã¡ã¼ã¿ããã¹ã¦æ¸ãã®ãé¢åãªã®ã§ããã§ã¯çç¥while (true)
{
cir.DoEvent();
Console.WriteLine( DATA_OUT.ToString());
// ã¯ããã¯ãã¨ã«DATA_OUTã®åºåå¤ãã¢ãã¿ããã
}
}
}
#ENDIFclass CRCENC
{
CRCENC(
in logic data_in ,
in logic start_in ,
in logic valid_in ,
in logic reset_n ,
in logic clk,
out logic data_out,
out logic start_out,
out logic valid_out
)
{
// processã®ããã«ã»ã³ã·ããã£ãããã®ã§ã¯ãªãassginmentã¯ããã«æ¸ãã
start_out = start_in & valid_in;
data_out = if (state_reg != OUTPARITY) data_in
else parity_reg(15);
// ãã©ã¤ãªãªãã£ä»ã鏿ã«ã¯ å¼if ã使ããã
// ãã®ifã¯å¤ãè¿ãã
valid_out =
if ( state_reg == WAITDATA && start_in == 1 && valid_in == 1)
|| (state_reg = CALCPARITY && valid_in == 1)
|| (state_reg == OUTPARITY)
1 else 0;/*
ãã©ã¤ãªãªãã£ãªã鏿ã«ã¯ å¼switchã使ããã
ãã®switchã¯å¤ãè¿ããsig = switch(cond)
{
case 4..7 : 1;
case 2,3 : 2;
case 1: 3;
default: 4;
}
*/
}logic_vector{15..0} parity_reg; // 16bitã¬ã¸ã¹ã¿
int{0..15} datacnt_reg; // 0ãã15ã¾ã§ã«ã¦ã³ãã§ããã¬ã¸ã¹ã¿enum STATE { WAITDATA , CALCPARITY , OUTPARITY };
STATE state_reg;process (clk)
{
if (rising clk)
{
if (reset_n == 0)state_reg = WAITDATA;
else
siwtch (state_reg)
{
case WAITDATA:
if (start_in == 1 && valid_in == 1)
{
parity_reg[15] = 0;
parity_reg[14] = 0;
parity_reg[13] = 0;
parity_reg[12] = data_in;
parity_reg[11] = 0;
parity_reg[10] = 0;
parity_reg[ 9] = 0;
parity_reg[ 8] = 0;
parity_reg[ 7] = 0;
parity_reg[ 6] = 0;
parity_reg[ 5] = data_in;
parity_reg[ 4] = 0;
parity_reg[ 3] = 0;
parity_reg[ 2] = 0;
parity_reg[ 1] = 0;
parity_reg[ 0] = data_in;
datacnt_reg = 1;
state_reg = CALCPARITY;
}
case CALCPARITY:
if (valid_in == 1)
{
parity_reg[15] = parity_reg[14];
parity_reg[14] = parity_reg[13];
parity_reg[13] = parity_reg[12];
parity_reg[12] = parity_reg[11] ^ parity_reg[15] ^ data_in;
parity_reg[11] = parity_reg[10];
parity_reg[10] = parity_reg[ 9];
parity_reg[ 9] = parity_reg[ 8];
parity_reg[ 8] = parity_reg[ 7];
parity_reg[ 7] = parity_reg[ 6];
parity_reg[ 6] = parity_reg[ 5];
parity_reg[ 5] = parity_reg[ 4] ^ parity_reg[15] ^ data_in;
parity_reg[ 4] = parity_reg[ 3];
parity_reg[ 3] = parity_reg[ 2];
parity_reg[ 2] = parity_reg[ 1];
parity_reg[ 1] = parity_reg[ 0];
parity_reg[ 0] = parity_reg[15] ^ data_in;
}if (datacnt_reg == 15)
{
datacnt_reg = 0;
state_erg = OUTPARITY;
} else {
datacnt_reg = datacnt_reg + 1;
}
case OUTPARITY:
if (datacnt_reg == 15)
state_reg = WAITDATA;
else
{
parity_reg[15..1] = parity_reg[14..0]; // ã·ããä»£å ¥
datacnt_reg = datacnt_reg + 1;
}
default:
state_reg = WAITDATA;
} // end switch
} // end if
}}
â â ãè¨èªã®BNF風ã®è¡¨è¨ã«ããå®ç¾©åèã
A :- B C. ã¯ããAã¨ã¯ Bããã¦ãã®ãã¨ã«Cãæ¥ããã¨èªãã
{XXX} 㯠XXXã0å以ä¸ã®ç¹°ãè¿ãã(ã¯ãªã¼ãéå )
{XXX}+ 㯠XXXã1å以ä¸ã®ç¹°ãè¿ãã
[XXX] 㯠XXXã¯çç¥å¯è½ã(0åã1åã®ç¹°ãè¿ãã¨ã¿ãªããã¨ãåºæ¥ã)
XXX | YYY 㯠XXXãYYYã
ä¾)
[XXX | YYY] {ZZZ} ã¯ãXXXãYYYã®ã©ã¡ããã1åããããã©ã¡ããããªãããã¦ã
ãããã®ãã¨ã«ZZZã0å以ä¸ç¹°ãè¿ãããã®æå³ã
(XXX | YYY) ZZZ ã¯ãXXXãYYYã®ã©ã¡ãããæ¥ã¦ããã®ãã¨ã«ZZZãç¶ãã®æå³ã
XXX YYY | ZZZ WWW ã¯ããXXX YYYãããZZZ WWWãã®ããããã¨èªããã»åå¥è§£æé¨
digit = "0"|"1"|...|"9".
letter = "A"|"B"|...|"Z"|"a"|"b"|..."z"|"_".binaryDigit = { 0" | "1" }+ "b".
octDigit = {"0"|"1"|..|"7"}+ "o".
hexDigit = {digit | "A" | "B" |...|"F" | "a" | "b" | ...| "f"}+ "h".ident = letter { letter | digit }.
integer = binaryDigit | octDigit | hexDigit .character = digit | letter.
char = "'" character "'" | '"' character '"' .
string = '"' { character } '"' | "'" { character } "'".
ã»æ§æè§£æé¨
// ããã°ã©ã æ¬ä½
program :- { "class" ident "{" { process_block | member_declarations } "}" }.// processãããã¯
process_block :- "(" ident ")" "{" process_body "}".
process_body :- Statement.// æ
Statement :- statement | "{" {statement} "}".
statement :-
assignment | FunctionCall | IfStatement |
SwitchStatement | ForStatement | "break" ; |
"return" [expression] "" .// ãã®3ã¤ã¯ãµãã¼ãããªãããã
// WhileStatement | RepeatStatement | LoopStatement// æ®éã®switchãcase
SwitchStatement :- "switch" "(" expression ")" "{" {CaseStatement} "}" .
CaseStatement :- CaseLabel Statemenet.
CaseLabel :- "case" (Integer | IntegerRange)
{"," (Integer | IntegerRange) } | "default".// 宿°é¸æç¨ã®switchãcase
// ãã©ã¤ãªãªãã£ãªã鏿ã«ã¯ å¼switchã使ããã
// ãã®switchã¯å¤ãè¿ãã// sig = switch(cond)
// {
// case 4..7 : 1;
// case 2,3 : 2;
// case 1: 3;
// default: 4;
// }// VHDLåããã¨ãprocessæã®ãªããªã caseãwhenã§å±éããã
// processæã®å¤ãªãwith selectã whenã§å±éããããExpressionSwitchStatement :- "switch" "(" expression ")" "{" {ExpressionCaseStatement} "}" .
ExpressionCaseStatement :- CaseLabel expression "".// æ®éã®if
IfStatement :- "if" ifBlock.
ifBlock :- "(" expression ")" Statement
[ "else" statement | "ef" ifBlock ].// 宿°é¸æç¨ã®if
// a = if (x==3) 1; else 0; ã®ããã«æ¸ããã
// VHDLåããã¨ãprocessæã®ãªããªã if then elsif ã«å±éããã
// processæã®å¤ãªããwhen elseã«å±éããããExpressionIf :- "if" ExpressionIfBlock
ExpressionIfBlock :- "(" expression ")" expression
[ "else" expression | "ef" ExpressionIf ].// ä»£å ¥
assignment :- ident "=" (expression "" | ExpressionIf | ExpressionSwitch ).// å¼
expression :- SimpleExpression
[ ("=" | "<" | "<=" | ">" | ">=") SimpleExpression ].factor :- ident | integer | "(" expression ")" | "~" factor | "rising" ident.
term :- factor { ("*" | "/" | "%" | "&") factor }.
SimpleExpression :- ["+" | "-"] term { ("+" | "-" | "|") term }.// 宿°ç¯å²
IntergerRange :- digit ".." digit.// ã«ã¼ãé¢ä¿ã¯ãVHDLåããã¨ãã¯foræã«ãã£ã¦ä¸¦åçã«å±éãããã
ForStatement :- "for" ident "=" IntegerRange Statement.